phoenix_live_view 0.20.2 → 0.20.3
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.
- package/assets/js/phoenix_live_view/dom.js +3 -3
- package/assets/js/phoenix_live_view/dom_patch.js +7 -15
- package/assets/js/phoenix_live_view/js.js +14 -4
- package/assets/js/phoenix_live_view/rendered.js +24 -43
- package/assets/js/phoenix_live_view/view.js +5 -1
- package/assets/package.json +1 -1
- package/package.json +1 -1
- package/priv/static/phoenix_live_view.cjs.js +51 -70
- package/priv/static/phoenix_live_view.cjs.js.map +2 -2
- package/priv/static/phoenix_live_view.esm.js +51 -70
- package/priv/static/phoenix_live_view.esm.js.map +2 -2
- package/priv/static/phoenix_live_view.js +51 -70
- package/priv/static/phoenix_live_view.min.js +4 -5
|
@@ -597,7 +597,7 @@ var DOM = {
|
|
|
597
597
|
for (let i = targetAttrs.length - 1; i >= 0; i--) {
|
|
598
598
|
let name = targetAttrs[i].name;
|
|
599
599
|
if (isIgnored) {
|
|
600
|
-
if (name.startsWith("data-") && !source.hasAttribute(name)) {
|
|
600
|
+
if (name.startsWith("data-") && !source.hasAttribute(name) && ![PHX_REF, PHX_REF_SRC].includes(name)) {
|
|
601
601
|
target.removeAttribute(name);
|
|
602
602
|
}
|
|
603
603
|
} else {
|
|
@@ -608,9 +608,7 @@ var DOM = {
|
|
|
608
608
|
}
|
|
609
609
|
},
|
|
610
610
|
mergeFocusedInput(target, source) {
|
|
611
|
-
|
|
612
|
-
DOM.mergeAttrs(target, source, { exclude: ["value"] });
|
|
613
|
-
}
|
|
611
|
+
DOM.mergeAttrs(target, source, { exclude: ["value"] });
|
|
614
612
|
if (source.readOnly) {
|
|
615
613
|
target.setAttribute("readonly", true);
|
|
616
614
|
} else {
|
|
@@ -1841,7 +1839,7 @@ var DOMPatch = class {
|
|
|
1841
1839
|
},
|
|
1842
1840
|
onNodeAdded: (el) => {
|
|
1843
1841
|
if (el.getAttribute) {
|
|
1844
|
-
this.maybeReOrderStream(el);
|
|
1842
|
+
this.maybeReOrderStream(el, true);
|
|
1845
1843
|
}
|
|
1846
1844
|
if (el instanceof HTMLImageElement && el.srcset) {
|
|
1847
1845
|
el.srcset = el.srcset;
|
|
@@ -1865,17 +1863,9 @@ var DOMPatch = class {
|
|
|
1865
1863
|
Array.from(fromEl.children).filter((child) => {
|
|
1866
1864
|
let { resetKept } = this.getStreamInsert(child);
|
|
1867
1865
|
return resetKept;
|
|
1868
|
-
}).
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
if (aIdx === bIdx) {
|
|
1872
|
-
return 0;
|
|
1873
|
-
} else if (aIdx < bIdx) {
|
|
1874
|
-
return -1;
|
|
1875
|
-
} else {
|
|
1876
|
-
return 1;
|
|
1877
|
-
}
|
|
1878
|
-
}).forEach((child) => fromEl.appendChild(child));
|
|
1866
|
+
}).forEach((child) => {
|
|
1867
|
+
this.streamInserts[child.id].streamAt = toIds.indexOf(child.id);
|
|
1868
|
+
});
|
|
1879
1869
|
}
|
|
1880
1870
|
},
|
|
1881
1871
|
onNodeDiscarded: (el) => this.onNodeDiscarded(el),
|
|
@@ -1899,7 +1889,7 @@ var DOMPatch = class {
|
|
|
1899
1889
|
externalFormTriggered = el;
|
|
1900
1890
|
}
|
|
1901
1891
|
updates.push(el);
|
|
1902
|
-
this.maybeReOrderStream(el);
|
|
1892
|
+
this.maybeReOrderStream(el, false);
|
|
1903
1893
|
},
|
|
1904
1894
|
onBeforeElUpdated: (fromEl, toEl) => {
|
|
1905
1895
|
dom_default.maybeAddPrivateHooks(toEl, phxViewportTop, phxViewportBottom);
|
|
@@ -2007,9 +1997,9 @@ var DOMPatch = class {
|
|
|
2007
1997
|
let insert = el.id ? this.streamInserts[el.id] : {};
|
|
2008
1998
|
return insert || {};
|
|
2009
1999
|
}
|
|
2010
|
-
maybeReOrderStream(el) {
|
|
2000
|
+
maybeReOrderStream(el, isNew) {
|
|
2011
2001
|
let { ref, streamAt, limit } = this.getStreamInsert(el);
|
|
2012
|
-
if (streamAt === void 0) {
|
|
2002
|
+
if (streamAt === void 0 || streamAt === 0 && !isNew) {
|
|
2013
2003
|
return;
|
|
2014
2004
|
}
|
|
2015
2005
|
dom_default.putSticky(el, PHX_STREAM_REF, (el2) => el2.setAttribute(PHX_STREAM_REF, ref));
|
|
@@ -2087,66 +2077,42 @@ var VOID_TAGS = new Set([
|
|
|
2087
2077
|
"track",
|
|
2088
2078
|
"wbr"
|
|
2089
2079
|
]);
|
|
2090
|
-
var endingTagNameChars = new Set([">", "/", " ", "\n", " ", "\r"]);
|
|
2091
2080
|
var quoteChars = new Set(["'", '"']);
|
|
2092
2081
|
var modifyRoot = (html, attrs, clearInnerHTML) => {
|
|
2093
2082
|
let i = 0;
|
|
2094
2083
|
let insideComment = false;
|
|
2095
2084
|
let beforeTag, afterTag, tag, tagNameEndsAt, id, newHTML;
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2108
|
-
|
|
2109
|
-
|
|
2110
|
-
let iAtOpen = i;
|
|
2085
|
+
let lookahead = html.match(/^(\s*(?:<!--.*?-->\s*)*)<([^\s\/>]+)/);
|
|
2086
|
+
if (lookahead === null) {
|
|
2087
|
+
throw new Error(`malformed html ${html}`);
|
|
2088
|
+
}
|
|
2089
|
+
i = lookahead[0].length;
|
|
2090
|
+
beforeTag = lookahead[1];
|
|
2091
|
+
tag = lookahead[2];
|
|
2092
|
+
tagNameEndsAt = i;
|
|
2093
|
+
for (i; i < html.length; i++) {
|
|
2094
|
+
if (html.charAt(i) === ">") {
|
|
2095
|
+
break;
|
|
2096
|
+
}
|
|
2097
|
+
if (html.charAt(i) === "=") {
|
|
2098
|
+
let isId = html.slice(i - 3, i) === " id";
|
|
2111
2099
|
i++;
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2100
|
+
let char = html.charAt(i);
|
|
2101
|
+
if (quoteChars.has(char)) {
|
|
2102
|
+
let attrStartsAt = i;
|
|
2103
|
+
i++;
|
|
2104
|
+
for (i; i < html.length; i++) {
|
|
2105
|
+
if (html.charAt(i) === char) {
|
|
2106
|
+
break;
|
|
2107
|
+
}
|
|
2115
2108
|
}
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
tag = html.slice(iAtOpen + 1, tagNameEndsAt);
|
|
2119
|
-
for (i; i < html.length; i++) {
|
|
2120
|
-
if (html.charAt(i) === ">") {
|
|
2109
|
+
if (isId) {
|
|
2110
|
+
id = html.slice(attrStartsAt + 1, i);
|
|
2121
2111
|
break;
|
|
2122
2112
|
}
|
|
2123
|
-
if (html.charAt(i) === "=") {
|
|
2124
|
-
let isId = html.slice(i - 3, i) === " id";
|
|
2125
|
-
i++;
|
|
2126
|
-
let char2 = html.charAt(i);
|
|
2127
|
-
if (quoteChars.has(char2)) {
|
|
2128
|
-
let attrStartsAt = i;
|
|
2129
|
-
i++;
|
|
2130
|
-
for (i; i < html.length; i++) {
|
|
2131
|
-
if (html.charAt(i) === char2) {
|
|
2132
|
-
break;
|
|
2133
|
-
}
|
|
2134
|
-
}
|
|
2135
|
-
if (isId) {
|
|
2136
|
-
id = html.slice(attrStartsAt + 1, i);
|
|
2137
|
-
break;
|
|
2138
|
-
}
|
|
2139
|
-
}
|
|
2140
|
-
}
|
|
2141
2113
|
}
|
|
2142
|
-
break;
|
|
2143
|
-
} else {
|
|
2144
|
-
i++;
|
|
2145
2114
|
}
|
|
2146
2115
|
}
|
|
2147
|
-
if (!tag) {
|
|
2148
|
-
throw new Error(`malformed html ${html}`);
|
|
2149
|
-
}
|
|
2150
2116
|
let closeAt = html.length - 1;
|
|
2151
2117
|
insideComment = false;
|
|
2152
2118
|
while (closeAt >= beforeTag.length + tag.length) {
|
|
@@ -2521,14 +2487,14 @@ var JS = {
|
|
|
2521
2487
|
dom_default.dispatchEvent(el, event, { detail, bubbles });
|
|
2522
2488
|
},
|
|
2523
2489
|
exec_push(eventType, phxEvent, view, sourceEl, el, args) {
|
|
2524
|
-
if (!view.isConnected()) {
|
|
2525
|
-
return;
|
|
2526
|
-
}
|
|
2527
2490
|
let { event, data, target, page_loading, loading, value, dispatcher, callback } = args;
|
|
2528
2491
|
let pushOpts = { loading, value, target, page_loading: !!page_loading };
|
|
2529
2492
|
let targetSrc = eventType === "change" && dispatcher ? dispatcher : sourceEl;
|
|
2530
2493
|
let phxTarget = target || targetSrc.getAttribute(view.binding("target")) || targetSrc;
|
|
2531
2494
|
view.withinTargets(phxTarget, (targetView, targetCtx) => {
|
|
2495
|
+
if (!targetView.isConnected()) {
|
|
2496
|
+
return;
|
|
2497
|
+
}
|
|
2532
2498
|
if (eventType === "change") {
|
|
2533
2499
|
let { newCid, _target } = args;
|
|
2534
2500
|
_target = _target || (dom_default.isFormInput(sourceEl) ? sourceEl.name : void 0);
|
|
@@ -2573,6 +2539,9 @@ var JS = {
|
|
|
2573
2539
|
exec_remove_class(eventType, phxEvent, view, sourceEl, el, { names, transition, time }) {
|
|
2574
2540
|
this.addOrRemoveClasses(el, [], names, transition, time, view);
|
|
2575
2541
|
},
|
|
2542
|
+
exec_toggle_class(eventType, phxEvent, view, sourceEl, el, { to, names, transition, time }) {
|
|
2543
|
+
this.toggleClasses(el, names, transition, view);
|
|
2544
|
+
},
|
|
2576
2545
|
exec_transition(eventType, phxEvent, view, sourceEl, el, { time, transition }) {
|
|
2577
2546
|
this.addOrRemoveClasses(el, [], [], transition, time, view);
|
|
2578
2547
|
},
|
|
@@ -2655,6 +2624,14 @@ var JS = {
|
|
|
2655
2624
|
}
|
|
2656
2625
|
}
|
|
2657
2626
|
},
|
|
2627
|
+
toggleClasses(el, classes, transition, time, view) {
|
|
2628
|
+
window.requestAnimationFrame(() => {
|
|
2629
|
+
let [prevAdds, prevRemoves] = dom_default.getSticky(el, "classes", [[], []]);
|
|
2630
|
+
let newAdds = classes.filter((name) => prevAdds.indexOf(name) < 0 && !el.classList.contains(name));
|
|
2631
|
+
let newRemoves = classes.filter((name) => prevRemoves.indexOf(name) < 0 && el.classList.contains(name));
|
|
2632
|
+
this.addOrRemoveClasses(el, newAdds, newRemoves, transition, time, view);
|
|
2633
|
+
});
|
|
2634
|
+
},
|
|
2658
2635
|
addOrRemoveClasses(el, adds, removes, transition, time, view) {
|
|
2659
2636
|
let [transitionRun, transitionStart, transitionEnd] = transition || [[], [], []];
|
|
2660
2637
|
if (transitionRun.length > 0) {
|
|
@@ -3009,6 +2986,9 @@ var View = class {
|
|
|
3009
2986
|
let updatedHookIds = new Set();
|
|
3010
2987
|
patch.after("added", (el) => {
|
|
3011
2988
|
this.liveSocket.triggerDOM("onNodeAdded", [el]);
|
|
2989
|
+
let phxViewportTop = this.binding(PHX_VIEWPORT_TOP);
|
|
2990
|
+
let phxViewportBottom = this.binding(PHX_VIEWPORT_BOTTOM);
|
|
2991
|
+
dom_default.maybeAddPrivateHooks(el, phxViewportTop, phxViewportBottom);
|
|
3012
2992
|
this.maybeAddNewHook(el);
|
|
3013
2993
|
if (el.getAttribute) {
|
|
3014
2994
|
this.maybeMounted(el);
|
|
@@ -3555,6 +3535,7 @@ var View = class {
|
|
|
3555
3535
|
this.uploadFiles(inputEl.form, targetCtx, ref, cid, (_uploads) => {
|
|
3556
3536
|
callback && callback(resp);
|
|
3557
3537
|
this.triggerAwaitingSubmit(inputEl.form);
|
|
3538
|
+
this.undoRefs(ref);
|
|
3558
3539
|
});
|
|
3559
3540
|
}
|
|
3560
3541
|
} else {
|