@glitchr/transparent 1.0.43 → 1.0.45

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glitchr/transparent",
3
- "version": "1.0.43",
3
+ "version": "1.0.45",
4
4
  "description": "Transparent SPA Application",
5
5
  "main": "src/index.js",
6
6
  "access": "public",
@@ -419,6 +419,12 @@
419
419
  Transparent.configure({'x-ajax-request': true});
420
420
  Transparent.configure(options);
421
421
 
422
+ if(Settings.debug) {
423
+
424
+ if (Settings.disable) console.debug("Transparent is disabled..");
425
+ else console.debug("Transparent is running..");
426
+ }
427
+
422
428
  isReady = true;
423
429
 
424
430
  dispatchEvent(new Event('transparent:'+Transparent.state.READY));
@@ -522,10 +528,6 @@
522
528
 
523
529
  if(el.target && el.target.tagName == "FORM") {
524
530
 
525
- // Action must be prevented here
526
- // This is specific to form submission
527
- el.preventDefault();
528
-
529
531
  var href = el.target.getAttribute("action");
530
532
  if(!href) href = location.pathname + href;
531
533
 
@@ -1416,6 +1418,7 @@
1416
1418
  return elementsXY;
1417
1419
  }
1418
1420
 
1421
+ var formSubmission = false;
1419
1422
  function __main__(e) {
1420
1423
 
1421
1424
  // Disable transparent JS (e.g. during development..)
@@ -1434,7 +1437,15 @@
1434
1437
  var target = Transparent.isElement(link[2]) ? link[2] : undefined;
1435
1438
  var data = Transparent.isElement(link[2]) ? undefined : link[2];
1436
1439
 
1440
+ // Wait for transparent window event to be triggered
1441
+ if (!isReady) return;
1442
+
1443
+ if (e.type != Transparent.state.POPSTATE &&
1444
+ e.type != Transparent.state.HASHCHANGE && !$(this).find(Settings.identifier).length) return;
1445
+
1437
1446
  var form = target != undefined && target.tagName == "FORM" ? target : undefined;
1447
+ formSubmission = false;
1448
+
1438
1449
  if (form) {
1439
1450
 
1440
1451
  data = new FormData();
@@ -1448,19 +1459,20 @@
1448
1459
  } else if(this.type == "file") {
1449
1460
 
1450
1461
  for(var i = 0; i < this.files.length; i++)
1451
- data.append(this.name, field.files[i]);
1462
+ data.append(this.name, this.files[i]);
1452
1463
 
1453
1464
  } else data.append(this.name, this.value);
1454
1465
  });
1455
1466
 
1456
- $(form).find(':submit').attr('disabled', 'disabled');
1457
- }
1467
+ // Force page reload
1468
+ formSubmission = true; // mark as form submission
1458
1469
 
1459
- // Wait for transparent window event to be triggered
1460
- if (!isReady) return;
1470
+ if ($(e.target).hasClass(Transparent.state.RELOAD)) return;
1471
+ if ($(form).hasClass(Transparent.state.RELOAD)) return;
1461
1472
 
1462
- if (e.type != Transparent.state.POPSTATE &&
1463
- e.type != Transparent.state.HASHCHANGE && !$(this).find(Settings.identifier).length) return;
1473
+ if(e.type == "submit")
1474
+ $(form).find(':submit').attr('disabled', 'disabled');
1475
+ }
1464
1476
 
1465
1477
  // Specific page exception
1466
1478
  for(i = 0; i < Settings.exceptions.length; i++) {
@@ -1680,12 +1692,16 @@
1680
1692
  // Overload onpopstate
1681
1693
  if(Settings.disable) {
1682
1694
 
1695
+ if(Settings.debug) console.debug("Transparent is disabled..");
1696
+
1683
1697
  var states = Object.values(Transparent.state);
1684
1698
  var htmlClass = Array.from(($("html").attr("class") || "").split(" ")).filter(x => !states.includes(x));
1685
1699
  Transparent.html.removeClass(states).addClass(htmlClass.join(" ")+" "+Transparent.state.ROOT+" "+Transparent.state.READY+" "+Transparent.state.DISABLE);
1686
1700
 
1687
1701
  } else {
1688
1702
 
1703
+ if(Settings.debug) console.debug("Transparent is running..");
1704
+
1689
1705
  window.onpopstate = __main__; // Onpopstate pop out straight to previous page.. this creates a jump while changing pages with hash..
1690
1706
  window.onhashchange = __main__;
1691
1707
 
@@ -1702,18 +1718,22 @@
1702
1718
  if(this.type == "file") {
1703
1719
 
1704
1720
  for(var i = 0; i < this.files.length; i++)
1705
- formData.append(this.name, field.files[i]);
1721
+ formData.append(this.name+"["+i+"]", this.files[i].name+";"+this.files[i].size+";"+this.files[i].lastModified);
1706
1722
 
1707
1723
  } else formData.append(this.name, this.value);
1708
1724
  });
1709
1725
 
1710
- for (var [fieldName,fieldValue] of formData.entries())
1711
- formDataBefore[fieldName] = fieldValue;
1726
+ for (var [fieldName,fieldValue] of formData.entries()) {
1727
+
1728
+ if(!fieldName.endsWith("[]") && fieldName != "undefined")
1729
+ formDataBefore[fieldName] = fieldValue;
1730
+ }
1712
1731
  });
1713
1732
  });
1714
1733
 
1715
- window.onbeforeunload = function() {
1734
+ window.onbeforeunload = function(e) {
1716
1735
 
1736
+ if(formSubmission) return; // Do not display on form submission
1717
1737
  if(Settings.disable) return;
1718
1738
 
1719
1739
  var preventDefault = false;
@@ -1727,20 +1747,31 @@
1727
1747
  if(this.type == "file") {
1728
1748
 
1729
1749
  for(var i = 0; i < this.files.length; i++)
1730
- formData.append(this.name, field.files[i]);
1750
+ formData.append(this.name+"["+i+"]", this.files[i].name+";"+this.files[i].size+";"+this.files[i].lastModified);
1731
1751
 
1732
1752
  } else formData.append(this.name, this.value);
1733
1753
  });
1734
1754
 
1735
1755
  for (var [fieldName,fieldValue] of formData.entries()) {
1736
- formDataAfter[fieldName] = fieldValue;
1756
+
1757
+ if(!fieldName.endsWith("[]") && fieldName != "undefined")
1758
+ formDataAfter[fieldName] = fieldValue;
1737
1759
  }
1738
1760
  });
1739
1761
 
1740
- var formDataBeforeKeys = Object.entries(formDataBefore).keys();
1741
- var formDataAfterKeys = Object.entries(formDataAfter).keys();
1762
+ var formDataBeforeKeys = Object.keys(formDataBefore);
1763
+ var formDataAfterKeys = Object.keys(formDataAfter);
1764
+ var formDataBeforeEntries = Object.entries(formDataBefore);
1765
+ var formDataAfterEntries = Object.entries(formDataAfter);
1766
+ function compare(a, b) { return JSON.stringify(a) === JSON.stringify(b); }
1767
+ function compareKeys(a, b) {
1768
+
1769
+ var aKeys = Object.keys(a).sort();
1770
+ var bKeys = Object.keys(b).sort();
1771
+ return JSON.stringify(aKeys) === JSON.stringify(bKeys);
1772
+ }
1742
1773
 
1743
- if(formDataAfterKeys != formDataAfterKeys) preventDefault = true;
1774
+ if(!compareKeys(formDataBeforeKeys, formDataAfterKeys)) preventDefault = true;
1744
1775
  else {
1745
1776
 
1746
1777
  for (var [fieldName,fieldValueAfter] of Object.entries(formDataAfter)) {