container reordering fully works, could be more efficient tho

This commit is contained in:
2025-07-15 23:06:03 -04:00
parent 822809dccd
commit 0688d903cc
+215 -120
View File
@@ -284,8 +284,8 @@
</div> </div>
<form id="containerForm" onsubmit="return false"> <form id="containerForm" onsubmit="return false">
<h2 class="menuHeader">layers</h2>
<div id="containers"> <div id="containers">
<h2 class="menuHeader">layers</h2>
</div> </div>
<div style="display:flex; flex-direction:row; align-items:center; justify-content: space-between; flex-wrap: wrap;"> <div style="display:flex; flex-direction:row; align-items:center; justify-content: space-between; flex-wrap: wrap;">
@@ -429,6 +429,7 @@
// cookie holders for container data // cookie holders for container data
let containerDataMap = new Map(); let containerDataMap = new Map();
let numberTotalContainers = 0;
let zIndexMap = new Map(); let zIndexMap = new Map();
// default values for easy resetting // default values for easy resetting
@@ -549,6 +550,7 @@
this.imageUrl = imageUrl; this.imageUrl = imageUrl;
} }
else { else {
numberTotalContainers++;
if (name == "") this.name = "image " + numberOfImageContainers; if (name == "") this.name = "image " + numberOfImageContainers;
else this.name = name; else this.name = name;
@@ -558,7 +560,7 @@
// deep copy default settings // deep copy default settings
this.containerSettings = JSON.parse(JSON.stringify(defaultImageContainerSettings)); this.containerSettings = JSON.parse(JSON.stringify(defaultImageContainerSettings));
zIndexMap.set(numberOfImageContainers + numberOfTextContainers, this.id); zIndexMap.set(String(numberOfImageContainers + numberOfTextContainers), this.id);
this.containerSettings.zIndex = numberOfImageContainers + numberOfTextContainers; this.containerSettings.zIndex = numberOfImageContainers + numberOfTextContainers;
} }
@@ -580,6 +582,7 @@
this.sections = sections; this.sections = sections;
} }
else { else {
numberTotalContainers++;
if (name == "") this.name = "bookmark layer " + numberOfTextContainers; if (name == "") this.name = "bookmark layer " + numberOfTextContainers;
else this.name = name; else this.name = name;
@@ -589,7 +592,7 @@
// deep copy default settings // deep copy default settings
this.containerSettings = JSON.parse(JSON.stringify(defaultTextContainerSettings)); this.containerSettings = JSON.parse(JSON.stringify(defaultTextContainerSettings));
zIndexMap.set(numberOfTextContainers + numberOfImageContainers, this.id); zIndexMap.set(String(numberOfTextContainers + numberOfImageContainers), this.id);
this.containerSettings.zIndex = numberOfImageContainers + numberOfTextContainers; this.containerSettings.zIndex = numberOfImageContainers + numberOfTextContainers;
} }
@@ -723,7 +726,7 @@
let bookmarkListings = document.getElementById(this.id + "-bookmark-menu--listings"); let bookmarkListings = document.getElementById(this.id + "-bookmark-menu--listings");
bookmarkListings.innerHTML = ""; bookmarkListings.innerHTML = "";
// [re]render the section listings // [in]render the section listings
for (let i = 0; i < sectionData.length; i++) { for (let i = 0; i < sectionData.length; i++) {
bookmarkListings.insertAdjacentHTML( bookmarkListings.insertAdjacentHTML(
"beforeend", "beforeend",
@@ -793,8 +796,9 @@
} }
createTextContainerMenuListing() { createTextContainerMenuListing() {
let zindex = parseInt(this.containerSettings.zIndex);
document.getElementById("containers").insertAdjacentHTML( document.getElementById("containers").insertAdjacentHTML(
"beforeend", "afterbegin",
` `
<div class="containerListing" id=${this.id + "-container-listing"}> <div class="containerListing" id=${this.id + "-container-listing"}>
@@ -943,19 +947,129 @@
</div> </div>
</div> </div>
<button id=${this.id + "--move-up-button"} onclick="reorderContainer(this, 'top')">summon to top</button> <div style="display: flex; flex-direction: row; justify-content: space-between;">
<button id=${this.id + "--move-up-button"} onclick="reorderContainer(this, 'up')">move up</button> <div>
<button id=${this.id + "--move-down-button"} onclick="reorderContainer(this, 'down')">move down</button> ${zindex == numberTotalContainers ? `` : `
<button id=${this.id + "--move-up-button"} onclick="reorderContainer(this, 'bottom')">banish to bottom</button> <button id="` + this.id + `--move-top-button"} onclick="reorderContainer(this, 'top')">summon to top</button>
<button id=${this.id + "--delete-button"} onclick="deleteContainer(this)">delete</button> <button id="` + this.id + `--move-up-button"} onclick="reorderContainer(this, 'up')">move up</button>
`}
${zindex == 1 ? `` :`
<button id="` + this.id + `--move-down-button"} onclick="reorderContainer(this, 'down')">move down</button>
<button id="` + this.id + `--move-bottom-button"} onclick="reorderContainer(this, 'bottom')">banish to bottom</button>
`}
</div>
<div>
<button id=${this.id + "--delete-button"} onclick="deleteContainer(this)">delete</button>
</div>
</div>
</div> </div>
` `
); );
/** fill in inputs with current values */
let containerSettings = this.containerSettings;
// SHADOW / GLOW
document.getElementById(this.id + "-settings-shadow-x").value =
containerSettings.shadowX;
document.getElementById(this.id + "-settings-shadow-y").value =
containerSettings.shadowY;
document.getElementById(this.id + "-settings-shadow-blur").value =
containerSettings.shadowBlur;
document.getElementById(this.id + "-settings-shadow-color").value =
rgbToHex(
containerSettings.shadowRgba
.replace("rgba(", "")
.slice(0, -1)
.split(",")
.splice(0, 3)
);
document.getElementById(this.id + "-settings-shadow-alpha").value =
containerSettings.shadowRgba
.replace("rgba(", "")
.slice(0, -1)
.split(",")[3] * 100;
// BORDER
document.getElementById(this.id + "-settings-border-color").value =
containerSettings.borderColor;
document.getElementById(this.id + "-settings-border-width").value =
containerSettings.borderWidth;
document.getElementById(this.id + "-settings-border-radius").value =
containerSettings.borderRadius;
// FONT
if (containerSettings.fontName == "") {
document.getElementById(this.id + "-settings-font-name").innerHTML =
"system default";
} else {
document.getElementById(this.id + "-settings-font-name").innerHTML =
containerSettings.fontName;
}
// TEXT ALIGNMENT
document.getElementById(this.id + "-settings-left-align").checked =
!containerSettings.centerAlign;
document.getElementById(this.id + "-settings-center-align").checked =
containerSettings.centerAlign;
// BOOKMARK OPTIONS
document.getElementById(this.id + "-settings-section-color").value =
containerSettings.sectionColor;
document.getElementById(this.id + "-settings-section-size").value =
containerSettings.sectionSize;
document.getElementById(this.id + "-settings-section-bold").checked =
containerSettings.sectionBold;
document.getElementById(this.id + "-settings-section-italic").checked =
containerSettings.sectionItalic;
document.getElementById(this.id + "-settings-link-color").value =
containerSettings.linkColor;
document.getElementById(this.id + "-settings-link-size").value =
containerSettings.linkSize;
// BACKGROUND COLOR
document.getElementById(this.id + "-settings-bg-color").value =
rgbToHex(
containerSettings.backgroundRgba
.replace("rgba(", "")
.slice(0, -1)
.split(",")
.splice(0, 3)
);
document.getElementById(this.id + "-settings-bg-alpha").value =
containerSettings.backgroundRgba
.replace("rgba(", "")
.slice(0, -1)
.split(",")[3] * 100;
// HEADER OPTIONS
document.getElementById(this.id + "-settings-date-toggle").checked =
containerSettings.enableDate;
document.getElementById(this.id + "-settings-clock-toggle").checked =
containerSettings.enableClock;
document.getElementById(this.id + "-settings-clock-color").value =
containerSettings.headerColor;
document.getElementById(this.id + "-settings-clock-size").value =
containerSettings.headerSize;
document.getElementById(this.id + "-settings-clock-bold").checked =
containerSettings.headerBold;
document.getElementById(this.id + "-settings-clock-italic").checked =
containerSettings.headerItalic;
// DIVIDER
document.getElementById(this.id + "-settings-divider-toggle").checked =
containerSettings.enableDivider;
document.getElementById(this.id + "-settings-divider-color").value =
containerSettings.dividerColor;
} }
createImageContainerMenuListing() { createImageContainerMenuListing() {
let zindex = this.containerSettings.zIndex;
let upButtons = `
<button id="` + this.id + `--move-top-button"} onclick="reorderContainer(this, 'top')">summon to top</button>
<button id="` + this.id + `--move-up-button"} onclick="reorderContainer(this, 'up')">move up</button>
`;
let downButtons = `
<button id="` + this.id + `--move-down-button"} onclick="reorderContainer(this, 'down')">move down</button>
<button id="` + this.id + `--move-bottom-button"} onclick="reorderContainer(this, 'bottom')">banish to bottom</button>
`;
document.getElementById("containers").insertAdjacentHTML( document.getElementById("containers").insertAdjacentHTML(
"beforeend", "afterbegin",
` `
<div class="containerListing" id=${this.id + "-container-listing"}> <div class="containerListing" id=${this.id + "-container-listing"}>
@@ -990,10 +1104,8 @@
<div style="display: flex; flex-direction: row; justify-content: space-between;"> <div style="display: flex; flex-direction: row; justify-content: space-between;">
<div> <div>
<button id=${this.id + "--move-top-button"} onclick="reorderContainer(this, 'top')">summon to top</button> ${zindex == numberTotalContainers ? `` : upButtons}
<button id=${this.id + "--move-up-button"} onclick="reorderContainer(this, 'up')">move up</button> ${zindex == 1 ? `` : downButtons}
<button id=${this.id + "--move-down-button"} onclick="reorderContainer(this, 'down')">move down</button>
<button id=${this.id + "--move-bottom-button"} onclick="reorderContainer(this, 'bottom')">banish to bottom</button>
</div> </div>
<div> <div>
<button id=${this.id + "--delete-button"} onclick="deleteContainer(this)">delete</button> <button id=${this.id + "--delete-button"} onclick="deleteContainer(this)">delete</button>
@@ -1003,6 +1115,36 @@
</div> </div>
` `
); );
/** fill in inputs with current values */
let containerSettings = this.containerSettings;
// SHADOW / GLOW
document.getElementById(this.id + "-settings-shadow-x").value =
containerSettings.shadowX;
document.getElementById(this.id + "-settings-shadow-y").value =
containerSettings.shadowY;
document.getElementById(this.id + "-settings-shadow-blur").value =
containerSettings.shadowBlur;
document.getElementById(this.id + "-settings-shadow-color").value =
rgbToHex(
containerSettings.shadowRgba
.replace("rgba(", "")
.slice(0, -1)
.split(",")
.splice(0, 3)
);
document.getElementById(this.id + "-settings-shadow-alpha").value =
containerSettings.shadowRgba
.replace("rgba(", "")
.slice(0, -1)
.split(",")[3] * 100;
// BORDER
document.getElementById(this.id + "-settings-border-color").value =
containerSettings.borderColor;
document.getElementById(this.id + "-settings-border-width").value =
containerSettings.borderWidth;
document.getElementById(this.id + "-settings-border-radius").value =
containerSettings.borderRadius;
} }
/* /*
@@ -1031,26 +1173,6 @@
containerSettings.shadowBlur + containerSettings.shadowBlur +
"px " + "px " +
containerSettings.shadowRgba; containerSettings.shadowRgba;
// fill in settings ui
document.getElementById(this.id + "-settings-shadow-x").value =
containerSettings.shadowX;
document.getElementById(this.id + "-settings-shadow-y").value =
containerSettings.shadowY;
document.getElementById(this.id + "-settings-shadow-blur").value =
containerSettings.shadowBlur;
document.getElementById(this.id + "-settings-shadow-color").value =
rgbToHex(
containerSettings.shadowRgba
.replace("rgba(", "")
.slice(0, -1)
.split(",")
.splice(0, 3)
);
document.getElementById(this.id + "-settings-shadow-alpha").value =
containerSettings.shadowRgba
.replace("rgba(", "")
.slice(0, -1)
.split(",")[3] * 100;
/** BORDER */ /** BORDER */
document.getElementById(this.id).style.borderStyle = "solid"; document.getElementById(this.id).style.borderStyle = "solid";
@@ -1060,13 +1182,7 @@
containerSettings.borderRadius + "px"; containerSettings.borderRadius + "px";
document.getElementById(this.id).style.borderColor = document.getElementById(this.id).style.borderColor =
containerSettings.borderColor; containerSettings.borderColor;
// fill-in settings ui
document.getElementById(this.id + "-settings-border-color").value =
containerSettings.borderColor;
document.getElementById(this.id + "-settings-border-width").value =
containerSettings.borderWidth;
document.getElementById(this.id + "-settings-border-radius").value =
containerSettings.borderRadius;
/** if this is an image container, all relevant settings have been applied */ /** if this is an image container, all relevant settings have been applied */
if (this.imageUrl != undefined) { if (this.imageUrl != undefined) {
@@ -1074,19 +1190,11 @@
} }
/** FONT */ /** FONT */
if (containerSettings.fontName == "") {
document.getElementById(this.id + "-settings-font-name").innerHTML =
"system default";
} else {
document.getElementById(this.id + "-settings-font-name").innerHTML =
containerSettings.fontName;
}
if (containerSettings.fontCode != "") { if (containerSettings.fontCode != "") {
document.head.insertAdjacentHTML( document.head.insertAdjacentHTML(
"beforeend", "beforeend",
containerSettings.fontCode containerSettings.fontCode
); );
// fill in settings ui
document.getElementById(this.id).style.fontFamily = document.getElementById(this.id).style.fontFamily =
containerSettings.fontName; containerSettings.fontName;
} }
@@ -1097,11 +1205,7 @@
} else { } else {
document.getElementById(this.id).style.textAlign = "left"; document.getElementById(this.id).style.textAlign = "left";
} }
// fill-in settings ui
document.getElementById(this.id + "-settings-left-align").checked =
!containerSettings.centerAlign;
document.getElementById(this.id + "-settings-center-align").checked =
containerSettings.centerAlign;
/** BOOKMARK CUSTOMIZATION */ /** BOOKMARK CUSTOMIZATION */
// apply link customization // apply link customization
@@ -1118,38 +1222,12 @@
sectionElements[i].style.fontWeight = containerSettings.sectionBold ? "bold" : "normal"; sectionElements[i].style.fontWeight = containerSettings.sectionBold ? "bold" : "normal";
sectionElements[i].style.fontStyle = containerSettings.sectionItalic ? "italic" : "normal"; sectionElements[i].style.fontStyle = containerSettings.sectionItalic ? "italic" : "normal";
} }
// fill-in settings ui
document.getElementById(this.id + "-settings-section-color").value =
containerSettings.sectionColor;
document.getElementById(this.id + "-settings-section-size").value =
containerSettings.sectionSize;
document.getElementById(this.id + "-settings-section-bold").checked =
containerSettings.sectionBold;
document.getElementById(this.id + "-settings-section-italic").checked =
containerSettings.sectionItalic;
document.getElementById(this.id + "-settings-link-color").value =
containerSettings.linkColor;
document.getElementById(this.id + "-settings-link-size").value =
containerSettings.linkSize;
/** BACKGROUND COLOR */ /** BACKGROUND COLOR */
document.getElementById(this.id).style.backgroundColor = document.getElementById(this.id).style.backgroundColor =
containerSettings.backgroundRgba; containerSettings.backgroundRgba;
// fill-in settings ui
document.getElementById(this.id + "-settings-bg-color").value =
rgbToHex(
containerSettings.backgroundRgba
.replace("rgba(", "")
.slice(0, -1)
.split(",")
.splice(0, 3)
);
document.getElementById(this.id + "-settings-bg-alpha").value =
containerSettings.backgroundRgba
.replace("rgba(", "")
.slice(0, -1)
.split(",")[3] * 100;
/** HEADER */ /** HEADER */
// show header elements // show header elements
@@ -1166,19 +1244,7 @@
containerSettings.headerBold ? "bold" : "normal"; containerSettings.headerBold ? "bold" : "normal";
document.getElementById(this.id + "-header").style.fontStyle = document.getElementById(this.id + "-header").style.fontStyle =
containerSettings.headerItalic ? "italic" : "normal"; containerSettings.headerItalic ? "italic" : "normal";
// fill-in settings ui
document.getElementById(this.id + "-settings-date-toggle").checked =
containerSettings.enableDate;
document.getElementById(this.id + "-settings-clock-toggle").checked =
containerSettings.enableClock;
document.getElementById(this.id + "-settings-clock-color").value =
containerSettings.headerColor;
document.getElementById(this.id + "-settings-clock-size").value =
containerSettings.headerSize;
document.getElementById(this.id + "-settings-clock-bold").checked =
containerSettings.headerBold;
document.getElementById(this.id + "-settings-clock-italic").checked =
containerSettings.headerItalic;
/** DIVIDER */ /** DIVIDER */
let divider = document.getElementById(this.id + "-divider"); let divider = document.getElementById(this.id + "-divider");
@@ -1194,11 +1260,6 @@
divider.style.backgroundColor = containerSettings.dividerColor; divider.style.backgroundColor = containerSettings.dividerColor;
divider.style.borderColor = containerSettings.dividerColor; divider.style.borderColor = containerSettings.dividerColor;
} }
// fill-in settings ui
document.getElementById(this.id + "-settings-divider-toggle").checked =
containerSettings.enableDivider;
document.getElementById(this.id + "-settings-divider-color").value =
containerSettings.dividerColor;
} }
/** /**
@@ -1481,12 +1542,8 @@
let containerMapValues = let containerMapValues =
JSON.parse(localStorage.getItem("containerMapValues")) || []; JSON.parse(localStorage.getItem("containerMapValues")) || [];
numberTotalContainers = containerMapValues.length;
for (let i = 0; i < containerMapValues.length; i++) { for (let i = 0; i < containerMapValues.length; i++) {
// containerDataMap.set(containerMapValues[i].id, containerMapValues[i]);
if (containerMapValues[i].id == "settingsContainer") {
continue;
}
containerDataMap.set(containerMapValues[i].id, new Container( containerDataMap.set(containerMapValues[i].id, new Container(
containerMapValues[i].id, containerMapValues[i].id,
containerMapValues[i].name, containerMapValues[i].name,
@@ -1830,33 +1887,70 @@
function reorderContainer(buttonPressed, direction) { function reorderContainer(buttonPressed, direction) {
let containerId = buttonPressed.id.split("--")[0]; let containerId = buttonPressed.id.split("--")[0];
let container = document.getElementById(containerId); let movingContainer = containerDataMap.get(containerId);
let currentIndex = container.containerSettings.zIndex;
let copy = container;
// move indicated container let currentIndex = parseInt(movingContainer.containerSettings.zIndex);
let destinationIndex;
if (direction == "up") { if (direction == "up") {
zIndexMap.set(currentIndex, zIndexMap.get(currentIndex + 1)); destinationIndex = currentIndex + 1;
zIndexMap.set(currentIndex + 1, copy);
} }
else if (direction == "down") { else if (direction == "down") {
zIndexMap.set(currentIndex, zIndexMap.get(currentIndex - 1)); destinationIndex = currentIndex - 1;
zIndexMap.set(currentIndex - 1, copy);
} }
else if (direction == "top") { else if (direction == "top") {
zIndexMap.set( destinationIndex = numberOfImageContainers + numberOfTextContainers;
currentIndex, zIndexMap.get(numberOfImageContainers + numberOfTextContainers)
);
zIndexMap.set(numberOfImageContainers + numberOfTextContainers, copy);
} }
else if (direction == "bottom") { else if (direction == "bottom") {
zIndexMap.set(currentIndex, zIndexMap.get(1)); destinationIndex = 1;
zIndexMap.set(1, copy);
} }
// consider a redraw function for menu listings currentIndex = String(currentIndex);
destinationIndex = String(destinationIndex);
console.log('currentIndex: ' + currentIndex);
console.log('destinationIndex: ' + destinationIndex);
console.log('zindexmap: ' + zIndexMap.get(destinationIndex));
console.log('container map: ' + containerDataMap.get(zIndexMap.get(destinationIndex)));
// actually move containers (swap with destination index)
document.getElementById(zIndexMap.get(destinationIndex)).style.zIndex = currentIndex;
document.getElementById(containerId).style.zIndex = destinationIndex;
// save new indexes
movingContainer.containerSettings.zIndex = destinationIndex;
containerDataMap.get(zIndexMap.get(destinationIndex))
.containerSettings.zIndex = currentIndex;
zIndexMap.set(currentIndex, zIndexMap.get(destinationIndex));
zIndexMap.set(destinationIndex, movingContainer.id);
/** adjust container listings on settings menu
let copy = document.getElementById(containerId + "-container-listing");
document.getElementById(containerId + "-container-listing").remove();
let destinationContainerElement = document.getElementById(zIndexMap.get(destinationIndex) + "-container-listing");
destinationContainerElement.insertAdjacentHTML("afterend", copy);
copy = destinationContainerElement;
*/
redrawContainerListings();
} }
function redrawContainerListings() {
document.getElementById("containers").innerHTML = "";
for (let i = 1; i <= numberTotalContainers; i++) {
let currentContainer = containerDataMap.get(zIndexMap.get(String(i)));
if (currentContainer.imageUrl == undefined) {
currentContainer.createTextContainerMenuListing();
}
else {
currentContainer.createImageContainerMenuListing();
}
currentContainer.addSettingsMenuEventListeners();
}
}
function deleteContainer(buttonPressed) { function deleteContainer(buttonPressed) {
let containerId = buttonPressed.id.split("--")[0]; let containerId = buttonPressed.id.split("--")[0];
@@ -1871,6 +1965,7 @@
} }
containerDataMap.delete(containerId); containerDataMap.delete(containerId);
numberTotalContainers--;
document.getElementById(containerId).remove(); document.getElementById(containerId).remove();
document.getElementById(containerId + "-container-listing").remove(); document.getElementById(containerId + "-container-listing").remove();