phoenix_live_view 0.17.2 → 0.17.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.
@@ -75,6 +75,7 @@ var COMPONENTS = "c";
75
75
  var EVENTS = "e";
76
76
  var REPLY = "r";
77
77
  var TITLE = "t";
78
+ var TEMPLATES = "p";
78
79
 
79
80
  // js/phoenix_live_view/entry_uploader.js
80
81
  var EntryUploader = class {
@@ -126,7 +127,10 @@ var EntryUploader = class {
126
127
 
127
128
  // js/phoenix_live_view/utils.js
128
129
  var logError = (msg, obj) => console.error && console.error(msg, obj);
129
- var isCid = (cid) => typeof cid === "number";
130
+ var isCid = (cid) => {
131
+ let type = typeof cid;
132
+ return type === "number" || type === "string" && /^(0|[1-9]\d*)$/.test(cid);
133
+ };
130
134
  function detectDuplicateIds() {
131
135
  let ids = new Set();
132
136
  let elems = document.querySelectorAll("*[id]");
@@ -1660,7 +1664,7 @@ var Rendered = class {
1660
1664
  recursiveToString(rendered, components = rendered[COMPONENTS], onlyCids) {
1661
1665
  onlyCids = onlyCids ? new Set(onlyCids) : null;
1662
1666
  let output = { buffer: "", components, onlyCids };
1663
- this.toOutputBuffer(rendered, output);
1667
+ this.toOutputBuffer(rendered, null, output);
1664
1668
  return output.buffer;
1665
1669
  }
1666
1670
  componentCIDs(diff) {
@@ -1686,8 +1690,8 @@ var Rendered = class {
1686
1690
  for (let cid in newc) {
1687
1691
  newc[cid] = this.cachedFindComponent(cid, newc[cid], oldc, newc, cache);
1688
1692
  }
1689
- for (var key in newc) {
1690
- oldc[key] = newc[key];
1693
+ for (let cid in newc) {
1694
+ oldc[cid] = newc[cid];
1691
1695
  }
1692
1696
  diff[COMPONENTS] = newc;
1693
1697
  }
@@ -1756,33 +1760,43 @@ var Rendered = class {
1756
1760
  isNewFingerprint(diff = {}) {
1757
1761
  return !!diff[STATIC];
1758
1762
  }
1759
- toOutputBuffer(rendered, output) {
1763
+ templateStatic(part, templates) {
1764
+ if (typeof part === "number") {
1765
+ return templates[part];
1766
+ } else {
1767
+ return part;
1768
+ }
1769
+ }
1770
+ toOutputBuffer(rendered, templates, output) {
1760
1771
  if (rendered[DYNAMICS]) {
1761
- return this.comprehensionToBuffer(rendered, output);
1772
+ return this.comprehensionToBuffer(rendered, templates, output);
1762
1773
  }
1763
1774
  let { [STATIC]: statics } = rendered;
1775
+ statics = this.templateStatic(statics, templates);
1764
1776
  output.buffer += statics[0];
1765
1777
  for (let i = 1; i < statics.length; i++) {
1766
- this.dynamicToBuffer(rendered[i - 1], output);
1778
+ this.dynamicToBuffer(rendered[i - 1], templates, output);
1767
1779
  output.buffer += statics[i];
1768
1780
  }
1769
1781
  }
1770
- comprehensionToBuffer(rendered, output) {
1782
+ comprehensionToBuffer(rendered, templates, output) {
1771
1783
  let { [DYNAMICS]: dynamics, [STATIC]: statics } = rendered;
1784
+ statics = this.templateStatic(statics, templates);
1785
+ let compTemplates = rendered[TEMPLATES];
1772
1786
  for (let d = 0; d < dynamics.length; d++) {
1773
1787
  let dynamic = dynamics[d];
1774
1788
  output.buffer += statics[0];
1775
1789
  for (let i = 1; i < statics.length; i++) {
1776
- this.dynamicToBuffer(dynamic[i - 1], output);
1790
+ this.dynamicToBuffer(dynamic[i - 1], compTemplates, output);
1777
1791
  output.buffer += statics[i];
1778
1792
  }
1779
1793
  }
1780
1794
  }
1781
- dynamicToBuffer(rendered, output) {
1795
+ dynamicToBuffer(rendered, templates, output) {
1782
1796
  if (typeof rendered === "number") {
1783
1797
  output.buffer += this.recursiveCIDToString(output.components, rendered, output.onlyCids);
1784
1798
  } else if (isObject(rendered)) {
1785
- this.toOutputBuffer(rendered, output);
1799
+ this.toOutputBuffer(rendered, templates, output);
1786
1800
  } else {
1787
1801
  output.buffer += rendered;
1788
1802
  }
@@ -1968,18 +1982,20 @@ var JS = {
1968
1982
  this.addOrRemoveClasses(sourceEl, [], names, transition, time, view);
1969
1983
  }
1970
1984
  },
1971
- exec_transition(eventType, phxEvent, view, sourceEl, { time, to, names }) {
1985
+ exec_transition(eventType, phxEvent, view, sourceEl, { time, to, transition }) {
1972
1986
  let els = to ? dom_default.all(document, to) : [sourceEl];
1987
+ let [transition_start, running, transition_end] = transition;
1973
1988
  els.forEach((el) => {
1974
- this.addOrRemoveClasses(el, names, []);
1975
- view.transition(time, () => this.addOrRemoveClasses(el, [], names));
1989
+ let onStart = () => this.addOrRemoveClasses(el, transition_start.concat(running), []);
1990
+ let onDone = () => this.addOrRemoveClasses(el, transition_end, transition_start.concat(running));
1991
+ view.transition(time, onStart, onDone);
1976
1992
  });
1977
1993
  },
1978
1994
  exec_toggle(eventType, phxEvent, view, sourceEl, { to, display, ins, outs, time }) {
1979
1995
  if (to) {
1980
- dom_default.all(document, to, (el) => this.toggle(eventType, view, el, display, ins || [], outs || [], time));
1996
+ dom_default.all(document, to, (el) => this.toggle(eventType, view, el, display, ins, outs, time));
1981
1997
  } else {
1982
- this.toggle(eventType, view, sourceEl, display, ins || [], outs || [], time);
1998
+ this.toggle(eventType, view, sourceEl, display, ins, outs, time);
1983
1999
  }
1984
2000
  },
1985
2001
  exec_show(eventType, phxEvent, view, sourceEl, { to, display, transition, time }) {
@@ -1997,37 +2013,45 @@ var JS = {
1997
2013
  }
1998
2014
  },
1999
2015
  show(eventType, view, el, display, transition, time) {
2000
- let isVisible = this.isVisible(el);
2001
- if (transition.length > 0 && !isVisible) {
2002
- this.toggle(eventType, view, el, display, transition, [], time);
2003
- } else if (!isVisible) {
2004
- this.toggle(eventType, view, el, display, [], [], null);
2016
+ if (!this.isVisible(el)) {
2017
+ this.toggle(eventType, view, el, display, transition, null, time);
2005
2018
  }
2006
2019
  },
2007
2020
  hide(eventType, view, el, display, transition, time) {
2008
- let isVisible = this.isVisible(el);
2009
- if (transition.length > 0 && isVisible) {
2010
- this.toggle(eventType, view, el, display, [], transition, time);
2011
- } else if (isVisible) {
2012
- this.toggle(eventType, view, el, display, [], [], time);
2021
+ if (this.isVisible(el)) {
2022
+ this.toggle(eventType, view, el, display, null, transition, time);
2013
2023
  }
2014
2024
  },
2015
- toggle(eventType, view, el, display, in_classes, out_classes, time) {
2016
- if (in_classes.length > 0 || out_classes.length > 0) {
2025
+ toggle(eventType, view, el, display, ins, outs, time) {
2026
+ let [inClasses, inStartClasses, inEndClasses] = ins || [[], [], []];
2027
+ let [outClasses, outStartClasses, outEndClasses] = outs || [[], [], []];
2028
+ if (inClasses.length > 0 || outClasses.length > 0) {
2017
2029
  if (this.isVisible(el)) {
2018
- this.addOrRemoveClasses(el, out_classes, in_classes);
2019
- view.transition(time, () => {
2030
+ let onStart = () => {
2031
+ this.addOrRemoveClasses(el, outStartClasses, inClasses.concat(inStartClasses).concat(inEndClasses));
2032
+ window.requestAnimationFrame(() => {
2033
+ this.addOrRemoveClasses(el, outClasses, []);
2034
+ window.requestAnimationFrame(() => this.addOrRemoveClasses(el, outEndClasses, outStartClasses));
2035
+ });
2036
+ };
2037
+ view.transition(time, onStart, () => {
2038
+ this.addOrRemoveClasses(el, [], outClasses.concat(outEndClasses));
2020
2039
  dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = "none");
2021
- this.addOrRemoveClasses(el, [], out_classes);
2022
2040
  });
2023
2041
  } else {
2024
2042
  if (eventType === "remove") {
2025
2043
  return;
2026
2044
  }
2027
- this.addOrRemoveClasses(el, in_classes, out_classes);
2028
- dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = display || "block");
2029
- view.transition(time, () => {
2030
- this.addOrRemoveClasses(el, [], in_classes);
2045
+ let onStart = () => {
2046
+ this.addOrRemoveClasses(el, inStartClasses, outClasses.concat(outStartClasses).concat(outEndClasses));
2047
+ dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = display || "block");
2048
+ window.requestAnimationFrame(() => {
2049
+ this.addOrRemoveClasses(el, inClasses, []);
2050
+ window.requestAnimationFrame(() => this.addOrRemoveClasses(el, inEndClasses, inStartClasses));
2051
+ });
2052
+ };
2053
+ view.transition(time, onStart, () => {
2054
+ this.addOrRemoveClasses(el, [], inClasses.concat(inEndClasses));
2031
2055
  });
2032
2056
  }
2033
2057
  } else {
@@ -2036,9 +2060,11 @@ var JS = {
2036
2060
  }
2037
2061
  },
2038
2062
  addOrRemoveClasses(el, adds, removes, transition, time, view) {
2039
- if (transition && transition.length > 0) {
2040
- this.addOrRemoveClasses(el, transition, []);
2041
- return view.transition(time, () => this.addOrRemoveClasses(el, adds, removes.concat(transition)));
2063
+ let [transition_run, transition_start, transition_end] = transition || [[], [], []];
2064
+ if (transition_run.length > 0) {
2065
+ let onStart = () => this.addOrRemoveClasses(el, transition_start.concat(transition_run), []);
2066
+ let onDone = () => this.addOrRemoveClasses(el, adds.concat(transition_end), removes.concat(transition_run).concat(transition_start));
2067
+ return view.transition(time, onStart, onDone);
2042
2068
  }
2043
2069
  window.requestAnimationFrame(() => {
2044
2070
  let [prevAdds, prevRemoves] = dom_default.getSticky(el, "classes", [[], []]);
@@ -2060,8 +2086,8 @@ var JS = {
2060
2086
  let style = window.getComputedStyle(el);
2061
2087
  return !(style.opacity === 0 || style.display === "none");
2062
2088
  },
2063
- isToggledOut(el, out_classes) {
2064
- return !this.isVisible(el) || this.hasAllClasses(el, out_classes);
2089
+ isToggledOut(el, outClasses) {
2090
+ return !this.isVisible(el) || this.hasAllClasses(el, outClasses);
2065
2091
  }
2066
2092
  };
2067
2093
  var js_default = JS;
@@ -2202,15 +2228,15 @@ var View = class {
2202
2228
  log(kind, msgCallback) {
2203
2229
  this.liveSocket.log(this, kind, msgCallback);
2204
2230
  }
2205
- transition(time, onDone = function() {
2231
+ transition(time, onStart, onDone = function() {
2206
2232
  }) {
2207
- this.liveSocket.transition(time, onDone);
2233
+ this.liveSocket.transition(time, onStart, onDone);
2208
2234
  }
2209
2235
  withinTargets(phxTarget, callback) {
2210
2236
  if (phxTarget instanceof HTMLElement || phxTarget instanceof SVGElement) {
2211
2237
  return this.liveSocket.owner(phxTarget, (view) => callback(view, phxTarget));
2212
2238
  }
2213
- if (typeof phxTarget === "number" || /^(0|[1-9]\d*)$/.test(phxTarget)) {
2239
+ if (isCid(phxTarget)) {
2214
2240
  let targets = dom_default.findComponentNodeList(this.el, phxTarget);
2215
2241
  if (targets.length === 0) {
2216
2242
  logError(`no component found matching phx-target of ${phxTarget}`);
@@ -2714,7 +2740,11 @@ var View = class {
2714
2740
  targetComponentID(target, targetCtx) {
2715
2741
  if (isCid(targetCtx)) {
2716
2742
  return targetCtx;
2717
- } else if (target.getAttribute(this.binding("target"))) {
2743
+ }
2744
+ let cidOrSelector = target.getAttribute(this.binding("target"));
2745
+ if (isCid(cidOrSelector)) {
2746
+ return parseInt(cidOrSelector);
2747
+ } else if (targetCtx && cidOrSelector !== null) {
2718
2748
  return this.closestComponentID(targetCtx);
2719
2749
  } else {
2720
2750
  return null;
@@ -2990,7 +3020,7 @@ var View = class {
2990
3020
  return dom_default.all(this.el, `form[${phxChange}]`).filter((form) => form.id && this.ownsElement(form)).filter((form) => form.elements.length > 0).filter((form) => form.getAttribute(this.binding(PHX_AUTO_RECOVER)) !== "ignore").map((form) => {
2991
3021
  let newForm = template.content.querySelector(`form[id="${form.id}"][${phxChange}="${form.getAttribute(phxChange)}"]`);
2992
3022
  if (newForm) {
2993
- return [form, newForm, this.componentID(newForm)];
3023
+ return [form, newForm, this.targetComponentID(newForm)];
2994
3024
  } else {
2995
3025
  return [form, null, null];
2996
3026
  }
@@ -3152,9 +3182,9 @@ var LiveSocket = class {
3152
3182
  requestDOMUpdate(callback) {
3153
3183
  this.transitions.after(callback);
3154
3184
  }
3155
- transition(time, onDone = function() {
3185
+ transition(time, onStart, onDone = function() {
3156
3186
  }) {
3157
- this.transitions.addTransition(time, onDone);
3187
+ this.transitions.addTransition(time, onStart, onDone);
3158
3188
  }
3159
3189
  onChannel(channel, event, cb) {
3160
3190
  channel.on(event, (data) => {
@@ -3290,7 +3320,7 @@ var LiveSocket = class {
3290
3320
  return view;
3291
3321
  }
3292
3322
  owner(childEl, callback) {
3293
- let view = maybe(childEl.closest(PHX_VIEW_SELECTOR), (el) => this.getViewByEl(el));
3323
+ let view = maybe(childEl.closest(PHX_VIEW_SELECTOR), (el) => this.getViewByEl(el)) || this.main;
3294
3324
  if (view) {
3295
3325
  callback(view);
3296
3326
  }
@@ -3700,7 +3730,8 @@ var TransitionSet = class {
3700
3730
  this.pushPendingOp(callback);
3701
3731
  }
3702
3732
  }
3703
- addTransition(time, onDone) {
3733
+ addTransition(time, onStart, onDone) {
3734
+ onStart();
3704
3735
  let timer = setTimeout(() => {
3705
3736
  this.transitions.delete(timer);
3706
3737
  onDone();