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.
@@ -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
- if (!(target instanceof HTMLSelectElement)) {
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
- }).sort((a, b) => {
1869
- let aIdx = toIds.indexOf(a.id);
1870
- let bIdx = toIds.indexOf(b.id);
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
- while (i < html.length) {
2097
- let char = html.charAt(i);
2098
- if (insideComment) {
2099
- if (char === "-" && html.slice(i, i + 3) === "-->") {
2100
- insideComment = false;
2101
- i += 3;
2102
- } else {
2103
- i++;
2104
- }
2105
- } else if (char === "<" && html.slice(i, i + 4) === "<!--") {
2106
- insideComment = true;
2107
- i += 4;
2108
- } else if (char === "<") {
2109
- beforeTag = html.slice(0, i);
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
- for (i; i < html.length; i++) {
2113
- if (endingTagNameChars.has(html.charAt(i))) {
2114
- break;
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
- tagNameEndsAt = i;
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 {