ngx-xtroedge-cms 1.3.13 → 1.3.16

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/dist/index.mjs CHANGED
@@ -431,7 +431,7 @@ var XtroedgeCMS = class _XtroedgeCMS {
431
431
  this.defaultLanguage = this.config.defaultLanguage || this.languages[0] || "en";
432
432
  this.highlightColor = this.config.highlightColor || "#00C853";
433
433
  this.historyRetentionMs = (this.config.historyRetentionDays || 7) * 24 * 60 * 60 * 1e3;
434
- this.currentLang = this.defaultLanguage;
434
+ this.currentLang = this.detectCurrentLanguage();
435
435
  this.siteIdentifier = this.resolveSiteIdentifier();
436
436
  const savedColor = localStorage.getItem("xtroedge_theme_color");
437
437
  if (savedColor) this.highlightColor = savedColor;
@@ -932,12 +932,28 @@ var XtroedgeCMS = class _XtroedgeCMS {
932
932
  }
933
933
  return text;
934
934
  }
935
+ hasEditableChildren(el) {
936
+ return !!el.querySelector("[data-cms]");
937
+ }
938
+ setDirectTextContent(el, val) {
939
+ if (this.hasEditableChildren(el)) {
940
+ const textNodes = [];
941
+ for (let i = 0; i < el.childNodes.length; i++) {
942
+ if (el.childNodes[i].nodeType === Node.TEXT_NODE) textNodes.push(el.childNodes[i]);
943
+ }
944
+ if (textNodes.length > 0) textNodes[0].textContent = val;
945
+ else el.prepend(document.createTextNode(val));
946
+ } else {
947
+ el.textContent = val;
948
+ }
949
+ }
935
950
  // ===============================================
936
951
  // ELEMENT EDITING
937
952
  // ===============================================
938
953
  attachElement(el, key) {
954
+ const getText = () => this.hasEditableChildren(el) ? this.getDirectTextContent(el).trim() : el.textContent?.trim() || "";
939
955
  const blurHandler = () => {
940
- const text = el.textContent?.trim() || "";
956
+ const text = getText();
941
957
  const currentVal = this.getPageText(key);
942
958
  if (text !== currentVal) this.onTextChanged(key, text);
943
959
  };
@@ -948,7 +964,7 @@ var XtroedgeCMS = class _XtroedgeCMS {
948
964
  }
949
965
  };
950
966
  const inputHandler = () => {
951
- const text = el.textContent?.trim() || "";
967
+ const text = getText();
952
968
  const currentVal = this.getPageText(key);
953
969
  if (text !== currentVal) this.onTextChanged(key, text);
954
970
  };
@@ -977,7 +993,7 @@ var XtroedgeCMS = class _XtroedgeCMS {
977
993
  }
978
994
  enableElementEdit(el, _key, blurH, keyH, inputH, clickH) {
979
995
  const val = this.getPageText(_key);
980
- if (val) el.textContent = val;
996
+ if (val) this.setDirectTextContent(el, val);
981
997
  el.setAttribute("contenteditable", "true");
982
998
  el.style.outline = `2px dashed ${this.highlightColor}`;
983
999
  el.style.outlineOffset = "-2px";
@@ -998,7 +1014,7 @@ var XtroedgeCMS = class _XtroedgeCMS {
998
1014
  el.style.transition = "";
999
1015
  el.style.minWidth = "";
1000
1016
  const val = this.getPageText(_key);
1001
- if (val) el.textContent = val;
1017
+ if (val) this.setDirectTextContent(el, val);
1002
1018
  el.removeEventListener("blur", blurH);
1003
1019
  el.removeEventListener("keydown", keyH);
1004
1020
  el.removeEventListener("input", inputH);
@@ -1016,7 +1032,9 @@ var XtroedgeCMS = class _XtroedgeCMS {
1016
1032
  for (const [el, info] of this.managedElements) {
1017
1033
  if (document.activeElement === el) continue;
1018
1034
  const val = this.getPageText(info.key);
1019
- if (val && el.textContent !== val) el.textContent = val;
1035
+ if (!val) continue;
1036
+ const current = this.hasEditableChildren(el) ? this.getDirectTextContent(el).trim() : el.textContent?.trim() || "";
1037
+ if (val !== current) this.setDirectTextContent(el, val);
1020
1038
  }
1021
1039
  this.observer?.observe(document.body, { childList: true, subtree: true });
1022
1040
  }
@@ -1361,8 +1379,11 @@ var XtroedgeCMS = class _XtroedgeCMS {
1361
1379
  }
1362
1380
  }
1363
1381
  hasSection(type) {
1364
- if (type === "header") return !!(document.querySelector("header") || document.querySelector('[class*="-header"]') || document.querySelector('[tagName$="-header"]'));
1365
- return !!(document.querySelector("footer") || document.querySelector('[class*="-footer"]') || document.querySelector('[tagName$="-footer"]'));
1382
+ const slug = type === "header" ? "/header" : "/footer";
1383
+ for (const [, info] of this.managedElements) {
1384
+ if (info.sectionSlug === slug) return true;
1385
+ }
1386
+ return false;
1366
1387
  }
1367
1388
  async loadPageContent(status) {
1368
1389
  this.setLoading(true);