Compare commits
3 Commits
fecd26f4bb
...
cf9a4e0efb
| Author | SHA1 | Date | |
|---|---|---|---|
| cf9a4e0efb | |||
| e4336766a0 | |||
| 9ee0b3e2c8 |
42
index.html
42
index.html
@ -11,15 +11,6 @@
|
||||
//current javascript version
|
||||
let jsVer = "9.9.9";
|
||||
|
||||
//settings
|
||||
window.settings = {
|
||||
localOnly: true,
|
||||
lineBreak: 150,
|
||||
font: "Arial",
|
||||
fontSize: "10px",
|
||||
|
||||
};
|
||||
|
||||
let script = document.createElement("script");
|
||||
script.src = "js/" + jsVer + "/init.js";
|
||||
script.type = "module";
|
||||
@ -99,25 +90,19 @@
|
||||
href="javascript:void(0);"
|
||||
title="Toggle Textblocks Menu"
|
||||
id="toggleTestBlocksMenu"
|
||||
style="display: none;"
|
||||
><i class="fa fa-plane"></i
|
||||
></a>
|
||||
<a
|
||||
class="w3-button w3-right w3-padding-large w3-hover-grey w3-large w3-flat-wet-aspalt"
|
||||
href="javascript:void(0);"
|
||||
title="Toggle Files Menu"
|
||||
title="Open Files Menu"
|
||||
id="toggleFilesMenu"
|
||||
><i class="fa fa-file"></i
|
||||
></a>
|
||||
<a
|
||||
class="w3-button w3-right w3-padding-large w3-hover-grey w3-large w3-flat-wet-aspalt"
|
||||
href="javascript:void(0);"
|
||||
title="Logout"
|
||||
id="logout"
|
||||
><i class="fa fa-sign-out-alt"></i
|
||||
></a>
|
||||
<a
|
||||
id="logo"
|
||||
href="."
|
||||
id="siteTitle"
|
||||
class="w3-left-align w3-button w3-padding-large w3-flat-wet-asphalt"
|
||||
><img class="logo" src="logo.png" alt="logo" height="30px"
|
||||
/></a>
|
||||
@ -134,9 +119,11 @@
|
||||
</div>
|
||||
|
||||
<div class="w3-main" style="margin-left: 300px">
|
||||
<h2 id="siteTitle" style="display: none">hello</h2>
|
||||
<div
|
||||
id="mainForm"
|
||||
class="w3-row-padding w3-padding-top-64 w3-container w3-flat-clouds"
|
||||
style="min-height: 600px;"
|
||||
>
|
||||
<div class="w3-content">
|
||||
<div class="w3-third w3-center">
|
||||
@ -280,6 +267,11 @@
|
||||
</div>
|
||||
|
||||
<div class="w3-container w3-flat-clouds w3-padding">
|
||||
<div
|
||||
id="outputInfo"
|
||||
class="w3-row-padding w3-padding-64 w3-container w3-flat-clouds"
|
||||
style="margin-bottom: 0px; display: none"
|
||||
></div>
|
||||
<div
|
||||
id="output"
|
||||
class="w3-row-padding w3-padding-64 w3-container w3-flat-clouds"
|
||||
@ -362,20 +354,6 @@
|
||||
<footer
|
||||
class="w3-container w3-padding w3-flat-clouds w3-center w3-margin-top"
|
||||
>
|
||||
<br />
|
||||
<br />
|
||||
<div
|
||||
class="upload-btn-wrapper"
|
||||
id="setFormButton"
|
||||
style="display: none"
|
||||
>
|
||||
<button
|
||||
class="w3-button w3-border w3-flat-clouds"
|
||||
id="setFormBtn"
|
||||
>
|
||||
Set input as default
|
||||
</button>
|
||||
</div>
|
||||
<div class="w3-container w3-margin-top w3-right-align w3-small" id="currentVersion">
|
||||
<span></span>
|
||||
</div>
|
||||
|
||||
@ -28,6 +28,19 @@ function transformTemplateObject(objects) {
|
||||
sidebarSubmitButton.innerHTML = "Save & Copy";
|
||||
sidebarList.appendChild(sidebarSubmitButton);
|
||||
|
||||
//create sidebar set form button
|
||||
let sidebarSetFormButton = document.createElement("li");
|
||||
sidebarSetFormButton.classList.add(
|
||||
"w3-bar-item",
|
||||
"w3-padding-large",
|
||||
"w3-button"
|
||||
);
|
||||
sidebarSetFormButton.style.borderTop = "2px solid #ddd";
|
||||
sidebarSetFormButton.id = "sb-setform";
|
||||
sidebarSetFormButton.innerHTML = "Set input as preset";
|
||||
sidebarList.appendChild(sidebarSetFormButton);
|
||||
|
||||
|
||||
//add sidebar elemnts to sidebar
|
||||
document.getElementById("sidebar").appendChild(sidebarList);
|
||||
|
||||
@ -55,6 +68,7 @@ function transformTemplateObject(objects) {
|
||||
copyBtn.classList.add("w3-button");
|
||||
copyBtn.classList.add("w3-grey");
|
||||
copyBtn.style.margin = "20px 0px";
|
||||
copyBtn.id = "fromCopyBtn";
|
||||
//append submit button to submitContainer
|
||||
document.getElementById("submitContainer").appendChild(copyBtn);
|
||||
|
||||
|
||||
@ -1,9 +1,8 @@
|
||||
import {setNewTemplate, loadTemplate} from "./web.js";
|
||||
import { hideMenus, modalNotifier } from "./evts.js";
|
||||
import { sanitize } from "./scripts.js";
|
||||
import { hideMenus, modalNotifier, resetNavBar } from "./evts.js";
|
||||
import { passwordHash, sanitize } from "./scripts.js";
|
||||
|
||||
function createTemplate(template = false) {
|
||||
|
||||
|
||||
//set current page value in activeState object
|
||||
activeState.activePage = "createTemplate";
|
||||
@ -12,10 +11,20 @@ function createTemplate(template = false) {
|
||||
document.getElementById("siteTitle").innerHTML = "Manage templates";
|
||||
} else {
|
||||
document.getElementById("siteTitle").innerHTML = "TG";
|
||||
document.getElementById("logo").innerHTML = "TG";
|
||||
}
|
||||
|
||||
//hide set Form button
|
||||
document.getElementById("setFormButton").style.display = "none";
|
||||
|
||||
//sessionVerfication check
|
||||
if (!passwordHash.verify()) {
|
||||
modalNotifier("Error: Session is not authenticated...", 0);
|
||||
}
|
||||
|
||||
//reset navbar if files was used
|
||||
resetNavBar();
|
||||
|
||||
//disable toggleTestBlocksMenu
|
||||
document.getElementById("toggleTestBlocksMenu").style.display = "none";
|
||||
|
||||
|
||||
if (template) {
|
||||
document.getElementById("templateInput").value = loadTemplate(template, false, "createTemplate");
|
||||
@ -154,7 +163,7 @@ function createTemplate(template = false) {
|
||||
}
|
||||
let data = document.getElementById("templateInput").value;
|
||||
setNewTemplate(fileName, data);
|
||||
modalNotifier(fileName+" saved!", 2);
|
||||
modalNotifier(fileName+" saved!", activeState.settings.notifierPause);
|
||||
e.target.className = e.target.className.replace(" w3-grey", " w3-flat-nephritis");
|
||||
e.target.style.pointerEvents = "none";
|
||||
const timeoutSave = setTimeout(() => {
|
||||
|
||||
@ -1,13 +1,11 @@
|
||||
import {
|
||||
clearData,
|
||||
createStorageObj,
|
||||
createBookShelf,
|
||||
importBookShelf,
|
||||
} from "./storage.js";
|
||||
import {
|
||||
loadTemplate,
|
||||
storeFilesToServer,
|
||||
setTemplatePreset,
|
||||
checkForStoredDataOnServer,
|
||||
delStoredDataOnServer
|
||||
} from "./web.js";
|
||||
@ -71,7 +69,7 @@ function insertTextBlocks(t) {
|
||||
|
||||
function handleOnBlur(t) {
|
||||
activeState.lastElement = t.id;
|
||||
createStorageObj();
|
||||
//createStorageObj();
|
||||
}
|
||||
|
||||
function clickClearForm() {
|
||||
@ -82,7 +80,17 @@ function clickClearForm() {
|
||||
loadTemplate(lT);
|
||||
}
|
||||
|
||||
function hideMenus() {
|
||||
function hideMenus(evt) {
|
||||
if (evt === undefined) return;
|
||||
if (evt.target.id == "loadTemplateBtn") return;
|
||||
if (evt.target.parentElement != null) {
|
||||
if (evt.target.parentElement.id == "navMob") return;
|
||||
if (evt.target.parentElement.id == "navReg") return;
|
||||
if (evt.target.parentElement.parentElement != null) {
|
||||
if (evt.target.parentElement.parentElement.id == "navMob") return;
|
||||
if (evt.target.parentElement.parentElement.id == "navReg") return;
|
||||
}
|
||||
}
|
||||
let sidebar = document.getElementById("sidebar");
|
||||
sidebar.style.display = "none";
|
||||
let navBar = document.getElementById("navMob");
|
||||
@ -91,15 +99,13 @@ function hideMenus() {
|
||||
tbBar.className = tbBar.className.replace(" w3-show", "");
|
||||
}
|
||||
|
||||
function modalNotifier(msg, timeout) {
|
||||
function modalNotifier(msg, timeout = 3) {
|
||||
let modalElement = document.getElementById("modalNotifier");
|
||||
let msgElement = document.getElementById("modalMsg");
|
||||
|
||||
modalElement.style.display = "block";
|
||||
msgElement.innerHTML = msg;
|
||||
if (timeout === undefined) {
|
||||
const run = setTimeout(() => (modalElement.style.display = "none"), 5000);
|
||||
} else if (timeout >= 1) {
|
||||
if (timeout >= 1) {
|
||||
const run = setTimeout(
|
||||
() => (modalElement.style.display = "none"),
|
||||
timeout * 1000
|
||||
@ -107,16 +113,24 @@ function modalNotifier(msg, timeout) {
|
||||
}
|
||||
}
|
||||
|
||||
function clickSetForm(e) {
|
||||
e.preventDefault;
|
||||
let dataArray = parseFormOnSubmit(true);
|
||||
let lT = activeState.loadedTemplate;
|
||||
setTemplatePreset(lT, JSON.stringify(dataArray));
|
||||
modalNotifier("Form Saved", 2);
|
||||
function printVersion(msg = "") {
|
||||
const scripts = document.getElementsByTagName("script");
|
||||
const versionSpan = document.getElementById("currentVersion").lastChild;
|
||||
|
||||
for (var i = 0; i < scripts.length; i++) {
|
||||
if (scripts[i].src) {
|
||||
let source = scripts[i].src;
|
||||
// js/version/main.js
|
||||
let pathVersion = source.split("/");
|
||||
pathVersion = pathVersion[pathVersion.length - 2];
|
||||
//add it to document footer currentVersion
|
||||
versionSpan.textContent = msg+" version: " + pathVersion;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function clickImportFiles() {
|
||||
if (activeState.localOnly) {
|
||||
if (activeState.settings.localOnly == "true") {
|
||||
createBookShelfDownload();
|
||||
return;
|
||||
}
|
||||
@ -135,7 +149,7 @@ function clickImportFiles() {
|
||||
case "Yes":
|
||||
importBookShelf();
|
||||
modal.replaceWith(modal.cloneNode(true));
|
||||
modalNotifier("Imported!", 2);
|
||||
modalNotifier("Imported!", activeState.settings.notifierPause);
|
||||
break;
|
||||
case "Cancel":
|
||||
modal.replaceWith(modal.cloneNode(true));
|
||||
@ -206,6 +220,20 @@ function createBookShelfDownload() {
|
||||
|
||||
}
|
||||
|
||||
function resetNavBar() {
|
||||
//enable toggleFiles Button
|
||||
let target = document.getElementById("toggleFilesMenu");
|
||||
target.innerHTML = "";
|
||||
let i = document.createElement("i");
|
||||
i.classList.add("fa", "fa-file");
|
||||
//target.classList.add("w3-disabled");
|
||||
target.appendChild(i);
|
||||
target.style.cssText = '';
|
||||
|
||||
//enable toggleTestBlocksMenu
|
||||
document.getElementById("toggleTestBlocksMenu").style.display = "block";
|
||||
}
|
||||
|
||||
export {
|
||||
hideMenus,
|
||||
showMenu,
|
||||
@ -215,6 +243,7 @@ export {
|
||||
handleOnBlur,
|
||||
clickClearForm,
|
||||
modalNotifier,
|
||||
clickSetForm,
|
||||
clickImportFiles
|
||||
clickImportFiles,
|
||||
resetNavBar,
|
||||
printVersion
|
||||
};
|
||||
|
||||
@ -2,24 +2,23 @@ import {
|
||||
storeData,
|
||||
clearData,
|
||||
retrieveData,
|
||||
createStorageObj,
|
||||
} from "./storage.js";
|
||||
import { loadTemplate } from "./web.js";
|
||||
import parseFormOnSubmit from "./parseForm.js";
|
||||
import { modalNotifier } from "./evts.js";
|
||||
import { modalNotifier, resetNavBar } from "./evts.js";
|
||||
import { passwordHash } from "./scripts.js";
|
||||
|
||||
function buildFile() {
|
||||
createStorageObj();
|
||||
|
||||
//set current page value in activeState object
|
||||
activeState.activePage = "files";
|
||||
|
||||
//set templateFiles array
|
||||
let tF = JSON.parse(retrieveData("templateFiles"));
|
||||
let tF = retrieveData("templateFiles");
|
||||
|
||||
if (tF == null || tF.length == 0) {
|
||||
//console.log("none yet");
|
||||
modalNotifier("there are no saved texts yet");
|
||||
modalNotifier("there are no saved texts yet", activeState.settings.notifierPause);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -27,16 +26,33 @@ function buildFile() {
|
||||
document.getElementById("siteTitle").innerHTML = "Saved files";
|
||||
} else {
|
||||
document.getElementById("siteTitle").innerHTML = "TG";
|
||||
document.getElementById("logo").innerHTML = "TG";
|
||||
}
|
||||
|
||||
//hide set Form button
|
||||
document.getElementById("setFormButton").style.display = "none";
|
||||
//sessionVerfication check
|
||||
if (!passwordHash.verify()) {
|
||||
modalNotifier("Error: Session is not authenticated...", 0);
|
||||
}
|
||||
|
||||
//disable toggleFiles Button
|
||||
let target = document.getElementById("toggleFilesMenu");
|
||||
target.innerHTML = "";
|
||||
let i = document.createElement("i");
|
||||
i.classList.add("fa", "fa-file");
|
||||
//target.classList.add("w3-disabled");
|
||||
target.appendChild(i);
|
||||
target.style.cssText = 'background-color:#9e9e9e !important';
|
||||
target.style.borderBottom = "4px solid #9e9e9e";
|
||||
|
||||
//disable toggleTestBlocksMenu
|
||||
document.getElementById("toggleTestBlocksMenu").style.display = "none";
|
||||
|
||||
//reset page and event listeners
|
||||
let mainFormDiv = document.getElementById("mainForm");
|
||||
let outputDiv = document.getElementById("output");
|
||||
let submitContainerDiv = document.getElementById("submitContainer");
|
||||
let sidebarDiv = document.getElementById("sidebar");
|
||||
let fileInfoDiv = document.getElementById("outputInfo");
|
||||
|
||||
mainFormDiv.innerHTML = "";
|
||||
mainFormDiv.replaceWith(mainFormDiv.cloneNode(true));
|
||||
@ -46,6 +62,8 @@ function buildFile() {
|
||||
submitContainerDiv.replaceWith(submitContainerDiv.cloneNode(true));
|
||||
sidebarDiv.innerHTML = "";
|
||||
sidebarDiv.replaceWith(sidebarDiv.cloneNode(true));
|
||||
fileInfoDiv.innerHTML = "";
|
||||
fileInfoDiv.replaceWith(fileInfoDiv.cloneNode(true));
|
||||
|
||||
document.getElementById("mainForm").innerHTML = mainFormPlaceholder();
|
||||
|
||||
@ -54,23 +72,33 @@ function buildFile() {
|
||||
if (e.target && e.target.matches("li.w3-bar-item")) {
|
||||
let fileName = e.target.dataset.file;
|
||||
let template = e.target.dataset.template;
|
||||
clickLoadFileDiv(fileName, template);
|
||||
let pos = e.target.dataset.tfpos;
|
||||
clickLoadFileDiv(fileName, template, pos);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function loadFileDiv(fileName, template) {
|
||||
function loadFileDiv(fileName, template, pos) {
|
||||
activeState.fileName = fileName;
|
||||
activeState.loadedTemplate = template;
|
||||
|
||||
storeData("userInputForce", retrieveData(fileName, template));
|
||||
|
||||
loadTemplate(template, false, true);
|
||||
|
||||
//append TS info
|
||||
let fileInfoDiv = document.getElementById("outputInfo");
|
||||
let tF = retrieveData("templateFiles");
|
||||
|
||||
let ts = tF[pos].metadata.ts_create;
|
||||
ts = ts.current_time_long+" "+ts.current_date+"."+ts.current_year;
|
||||
fileInfoDiv.innerHTML = "<p>created at: "+ts+" | template: "+template+"</p>";
|
||||
fileInfoDiv.style.display = "block";
|
||||
|
||||
}
|
||||
|
||||
function loadFileDivCallBack() {
|
||||
let tF = JSON.parse(retrieveData("templateFiles"));
|
||||
let tF = retrieveData("templateFiles");
|
||||
document.getElementById("sidebar").appendChild(loadFileSidebar(tF));
|
||||
|
||||
let lT = activeState.loadedTemplate;
|
||||
@ -133,17 +161,28 @@ function loadFileDivCallBack() {
|
||||
let div = document.createElement("div");
|
||||
let parsedTemplate = parseFormOnSubmit(false, true);
|
||||
div.appendChild(parsedTemplate);
|
||||
|
||||
fileDisplay.appendChild(div);
|
||||
|
||||
let ts = document.createElement("p");
|
||||
ts.innerHTML = ""
|
||||
|
||||
//fileDisplay.appendChild(ts);
|
||||
document.getElementById("mainForm").appendChild(fileDisplay);
|
||||
|
||||
//fix min height of file display
|
||||
try {
|
||||
document.getElementById("fileDisplay").style.cssText = "min-height: 300px;";
|
||||
} catch (e) {}
|
||||
//fix fontsize for display
|
||||
document.getElementById("fileDisplay").firstChild.style.fontSize = "1em";
|
||||
|
||||
try {
|
||||
document.getElementById("fileDisplay").firstChild.style.fontSize = "1em";
|
||||
} catch (e) {}
|
||||
//add events
|
||||
formEvts(storageName);
|
||||
}
|
||||
|
||||
function clickLoadFileDiv(fileName, template) {
|
||||
function clickLoadFileDiv(fileName, template, pos) {
|
||||
if (fileName == "_overflow") return;
|
||||
|
||||
if (fileName == "_clearAll") {
|
||||
@ -152,20 +191,20 @@ function clickLoadFileDiv(fileName, template) {
|
||||
}
|
||||
|
||||
document.getElementById("mainForm").innerHTML = "";
|
||||
loadFileDiv(fileName, template);
|
||||
loadFileDiv(fileName, template, pos);
|
||||
}
|
||||
|
||||
function clearFileData(storData) {
|
||||
let fileName = storData.split("_m21_")[0];
|
||||
|
||||
let tF = JSON.parse(retrieveData("templateFiles"));
|
||||
let tF = retrieveData("templateFiles");
|
||||
let newArray = [];
|
||||
for (let obj of tF) {
|
||||
if (obj.fileName != fileName) {
|
||||
newArray.push(obj);
|
||||
}
|
||||
}
|
||||
storeData("templateFiles", JSON.stringify(newArray));
|
||||
storeData("templateFiles", newArray);
|
||||
|
||||
clearData(fileName);
|
||||
clearData("userInput");
|
||||
@ -181,9 +220,19 @@ function clearFileData(storData) {
|
||||
function loadFileSidebar(tF) {
|
||||
let sidebarList = document.createElement("ul");
|
||||
sidebarList.classList.add("w3-ul");
|
||||
|
||||
let sidebarListItem = document.createElement("li");
|
||||
|
||||
sidebarListItem.classList.add(
|
||||
"w3-padding-large",
|
||||
);
|
||||
sidebarListItem.style.borderBottom = "1px solid #ddd";
|
||||
sidebarListItem.id = "sb-title";
|
||||
sidebarListItem.innerHTML = "Saved Files:"
|
||||
sidebarList.appendChild(sidebarListItem);
|
||||
|
||||
let c = 0;
|
||||
let sidebarItemsAmount = 10;
|
||||
let sidebarListItem;
|
||||
for (let obj of tF.reverse()) {
|
||||
sidebarListItem = document.createElement("li");
|
||||
sidebarListItem.classList.add(
|
||||
@ -209,6 +258,7 @@ function loadFileSidebar(tF) {
|
||||
sidebarListItem.innerHTML = obj.fileName.replace(/_/g, " ");
|
||||
sidebarListItem.setAttribute("data-file", obj.fileName);
|
||||
sidebarListItem.setAttribute("data-template", obj.template);
|
||||
sidebarListItem.setAttribute("data-tFPos", obj.pos);
|
||||
sidebarList.appendChild(sidebarListItem);
|
||||
c++;
|
||||
}
|
||||
@ -229,7 +279,7 @@ function loadFileSidebar(tF) {
|
||||
|
||||
function mainFormPlaceholder(msg = "Select a file") {
|
||||
return (
|
||||
"<div class='w3-row-padding w3-padding-24 w3-container w3-flat-clouds'><div class='w3-code notranslate w3-border-white' style='font-family: Arial, Helvetica, sans-serif;'><p>" +
|
||||
"<div id='fileDisplay' class='w3-row-padding w3-padding-24 w3-container w3-flat-clouds'><div class='w3-code notranslate w3-border-white' style='font-family: Arial, Helvetica, sans-serif;'><p>" +
|
||||
msg +
|
||||
"</p><br><br><br><br><br><br><br><br><br><br><br></div></div>"
|
||||
);
|
||||
@ -287,7 +337,7 @@ function formEvts(storageName) {
|
||||
if (e.target && e.target.tagName === "INPUT") {
|
||||
switch (e.target.value) {
|
||||
case "Edit":
|
||||
loadSpecificTemplate(storageName);
|
||||
editSpecificTemplate(storageName);
|
||||
break;
|
||||
case "Copy":
|
||||
copyFileToClipboard();
|
||||
@ -303,18 +353,21 @@ function formEvts(storageName) {
|
||||
);
|
||||
e.target.style.pointerEvents = "auto";
|
||||
}, 250);
|
||||
modalNotifier(activeState.fileName + " copied to clipboard", 2);
|
||||
modalNotifier(activeState.fileName + " copied to clipboard", activeState.settings.notifierPause);
|
||||
break;
|
||||
case "Delete":
|
||||
console.log(storageName);
|
||||
let previousFile = getPreviousFile(storageName);
|
||||
clearFileData(storageName);
|
||||
let delFileName = activeState.fileName;
|
||||
document.getElementById("mainForm").innerHTML = "";
|
||||
if (previousFile) {
|
||||
loadFileDiv(previousFile.fileName, previousFile.template);
|
||||
loadFileDiv(previousFile.fileName, previousFile.template, previousFile.pos);
|
||||
} else {
|
||||
document.getElementById("mainForm").innerHTML =
|
||||
mainFormPlaceholder("No file yet");
|
||||
}
|
||||
modalNotifier(delFileName + " deleted!", activeState.settings.notifierPause);
|
||||
|
||||
break;
|
||||
default:
|
||||
@ -324,7 +377,7 @@ function formEvts(storageName) {
|
||||
});
|
||||
}
|
||||
|
||||
function loadSpecificTemplate(storageName) {
|
||||
function editSpecificTemplate(storageName) {
|
||||
storeData(
|
||||
"userInputForce",
|
||||
retrieveData(storageName.split("_m21_")[0], storageName.split("_m21_")[1])
|
||||
@ -332,12 +385,19 @@ function loadSpecificTemplate(storageName) {
|
||||
//reset sidebar to clear events
|
||||
let sidebarDiv = document.getElementById("sidebar");
|
||||
sidebarDiv.replaceWith(sidebarDiv.cloneNode(true));
|
||||
|
||||
//reset navbar above all else
|
||||
resetNavBar();
|
||||
|
||||
//reset correct activePage
|
||||
activeState.activePage = "template";
|
||||
|
||||
loadTemplate(storageName.split("_m21_")[1]);
|
||||
}
|
||||
|
||||
function getPreviousFile(storageName) {
|
||||
let orgFileName = storageName.split("_m21_")[0];
|
||||
let tF = JSON.parse(retrieveData("templateFiles"));
|
||||
let tF = retrieveData("templateFiles");
|
||||
let i = 0;
|
||||
let previousFile;
|
||||
|
||||
@ -366,7 +426,7 @@ function clickClearAllFiles() {
|
||||
case "Delete":
|
||||
clearAllFiles();
|
||||
modal.replaceWith(modal.cloneNode(true));
|
||||
modalNotifier("All files deleted!", 2);
|
||||
modalNotifier("All files deleted!", activeState.settings.notifierPause);
|
||||
break;
|
||||
default:
|
||||
e.preventDefault;
|
||||
@ -381,9 +441,9 @@ function clickClearAllFiles() {
|
||||
);
|
||||
}
|
||||
function clearAllFiles() {
|
||||
let tF = JSON.parse(retrieveData("templateFiles"));
|
||||
let tF = retrieveData("templateFiles");
|
||||
if (tF == null || tF.length == 0) {
|
||||
modalNotifier("there are no saved texts yet", 2);
|
||||
modalNotifier("there are no saved texts yet", activeState.settings.notifierPause);
|
||||
return;
|
||||
}
|
||||
for (let storageName of tF) {
|
||||
|
||||
@ -2,20 +2,24 @@
|
||||
import { storeData, createStorageObj } from "./storage.js";
|
||||
import parseInput from "./parseTemplate.js";
|
||||
import transformTemplateObject from "./buildForm.js";
|
||||
import { showSidebar, handleOnBlur, modalNotifier } from "./evts.js";
|
||||
import { handleOnBlur, modalNotifier } from "./evts.js";
|
||||
import parseFormOnSubmit, { parseTextMarkups } from "./parseForm.js";
|
||||
import { setTemplatePreset } from "./web.js";
|
||||
|
||||
function buildForm(templateInput, loadOnly = false) {
|
||||
var wordArray = [];
|
||||
|
||||
//display set Form button
|
||||
if (!loadOnly) document.getElementById("setFormButton").style.display = "block";
|
||||
|
||||
//check for presets in "-form.txt" file; indicated by !JSON_placeholder
|
||||
if (templateInput.indexOf("!JSON_placeholder:") !== -1) {
|
||||
let jsonPlaceholder = templateInput.split("!JSON_placeholder:")[1];
|
||||
let placeholder;
|
||||
try {
|
||||
placeholder = JSON.parse(jsonPlaceholder);
|
||||
} catch (e) {
|
||||
placeholder = ""
|
||||
}
|
||||
templateInput = templateInput.split("!JSON_placeholder:")[0];
|
||||
storeData("templatePreset", jsonPlaceholder);
|
||||
storeData("templatePreset", placeholder);
|
||||
}
|
||||
//start building wordArray by splitting input by line win/unix and define eol char for recreating templateInput
|
||||
let eol;
|
||||
@ -61,18 +65,15 @@ function buildForm(templateInput, loadOnly = false) {
|
||||
setStringPos(objects, templateInput);
|
||||
|
||||
//save objects array and template file string for web.js in session storage
|
||||
window.sessionStorage.setItem("templateObjects", JSON.stringify(objects));
|
||||
window.sessionStorage.setItem("fullString", templateInput);
|
||||
activeState.templateObjects = objects;
|
||||
activeState.fullString = templateInput;
|
||||
|
||||
//sort objects array by words prio
|
||||
objects = prioritizeArray(objects);
|
||||
|
||||
//remove non display objects and safe it to session storage
|
||||
let objectsPurified = purifyObjects(objects);
|
||||
window.sessionStorage.setItem(
|
||||
"templateObjectsPurified",
|
||||
JSON.stringify(objectsPurified)
|
||||
);
|
||||
activeState.templateObjectsPurified = objectsPurified;
|
||||
|
||||
//reset page and event listeners
|
||||
let mainFormDiv = document.getElementById("mainForm");
|
||||
@ -107,7 +108,6 @@ function prioritizeArray(objects) {
|
||||
prioArray.sort(function (a, b) {
|
||||
return a - b;
|
||||
});
|
||||
//console.log(prioArray);
|
||||
for (let valSorted of prioArray) {
|
||||
for (let obj of objects) {
|
||||
if (valSorted === obj.prio) {
|
||||
@ -225,17 +225,19 @@ function formEvts() {
|
||||
parseFormOnSubmit();
|
||||
e.target.className = e.target.className.replace(" w3-grey", " w3-flat-carrot");
|
||||
e.target.style.pointerEvents = "none";
|
||||
modalNotifier(activeState.fileName + " copied to clipboard", 2);
|
||||
e.target.value = "Copied";
|
||||
modalNotifier(activeState.fileName + " copied to clipboard", activeState.settings.notifierPause);
|
||||
const timeoutCopy = setTimeout(() => {
|
||||
e.target.className = e.target.className.replace(" w3-flat-carrot"," w3-grey");
|
||||
//e.target.className = e.target.className.replace(" w3-flat-carrot"," w3-grey");
|
||||
//e.target.value = "Copy";
|
||||
e.target.style.pointerEvents = "auto";
|
||||
}, 250);
|
||||
}, 5000);
|
||||
break;
|
||||
case "Save":
|
||||
createStorageObj();
|
||||
e.target.className = e.target.className.replace(" w3-grey", " w3-flat-nephritis");
|
||||
e.target.style.pointerEvents = "none";
|
||||
modalNotifier(activeState.fileName + " saved", 2);
|
||||
modalNotifier(activeState.fileName + " saved", activeState.settings.notifierPause);
|
||||
const timeoutSave = setTimeout(() => {
|
||||
e.target.className = e.target.className.replace(" w3-flat-nephritis"," w3-grey");
|
||||
e.target.style.pointerEvents = "auto";
|
||||
@ -252,7 +254,13 @@ function formEvts() {
|
||||
if (e.target) {
|
||||
if (e.target.id == "sb-submit") {
|
||||
parseFormOnSubmit();
|
||||
modalNotifier("File saved and copied to clipboard", 2);
|
||||
modalNotifier("File saved and copied to clipboard", activeState.settings.notifierPause);
|
||||
}
|
||||
if (e.target.id == "sb-setform") {
|
||||
let dataArray = parseFormOnSubmit(true);
|
||||
let lT = activeState.loadedTemplate;
|
||||
setTemplatePreset(lT, JSON.stringify(dataArray));
|
||||
modalNotifier("Input saved as preset", activeState.settings.notifierPause);
|
||||
}
|
||||
if (e.target.id == "sb-item") {
|
||||
setTimeout(() => {
|
||||
@ -276,7 +284,6 @@ function formEvts() {
|
||||
function focusOnField(id) {
|
||||
let targetElement = document.getElementById(id);
|
||||
if (targetElement == null) return;
|
||||
|
||||
document.activeElement.blur();
|
||||
targetElement.focus();
|
||||
setTimeout(function () {
|
||||
|
||||
210
js/9.9.9/init.js
210
js/9.9.9/init.js
@ -1,22 +1,42 @@
|
||||
import { hideMenus, showMenu, showSidebar, showTextBlocks, clickSetForm, clickImportFiles, modalNotifier } from "./evts.js";
|
||||
import {
|
||||
hideMenus,
|
||||
showMenu,
|
||||
showSidebar,
|
||||
showTextBlocks,
|
||||
clickImportFiles,
|
||||
modalNotifier,
|
||||
printVersion,
|
||||
} from "./evts.js";
|
||||
import { buildFile } from "./files.js";
|
||||
import setPassword, { passwordHash, sessionVerification } from "./scripts.js";
|
||||
import { getUsrId, logout } from "./scripts.js";
|
||||
import setPassword, {
|
||||
passwordHash,
|
||||
inputRead,
|
||||
getUsrId,
|
||||
} from "./scripts.js";
|
||||
import parseFormOnSubmit from "./parseForm.js";
|
||||
import { createStorageObj } from "./storage.js";
|
||||
import XORCipher from "./xorc.js";
|
||||
import sha256 from "./sha256.min.js";
|
||||
import { createStorageObj, storeSettings } from "./storage.js";
|
||||
import { loadNavBar, initTextBlocks } from "./web.js";
|
||||
|
||||
|
||||
window.activeState = {
|
||||
userId: getUsrId(),
|
||||
userId: "",
|
||||
sessionToken: "",
|
||||
activePage: "landing",
|
||||
loadedTemplate: "",
|
||||
fileName: "",
|
||||
lastElement: "",
|
||||
serverFilesTs: "",
|
||||
settings: {
|
||||
localOnly: "true",
|
||||
lineBreak: 120,
|
||||
font: "Arial",
|
||||
fontSize: "10px",
|
||||
notifierPause: 1,
|
||||
persistentStorage: "false"
|
||||
},
|
||||
templates: [],
|
||||
templateObjectsPurified: [],
|
||||
templateObjects: [],
|
||||
fullString: "",
|
||||
templateFieldTypes: [
|
||||
"simpleInput",
|
||||
"longText",
|
||||
@ -25,37 +45,43 @@ window.activeState = {
|
||||
"current_date",
|
||||
"markup",
|
||||
],
|
||||
markups: [
|
||||
"title",
|
||||
"link",
|
||||
"italic",
|
||||
"green_highlighted",
|
||||
"highlighted",
|
||||
]
|
||||
markups: ["title", "link", "italic", "green_highlighted", "highlighted"],
|
||||
storage: []
|
||||
};
|
||||
|
||||
|
||||
function init() {
|
||||
|
||||
//load settings into activeState
|
||||
for (let setting of Object.entries(window.settings)) {
|
||||
activeState[setting[0]] = setting[1];
|
||||
//check if localStorage is available
|
||||
try {
|
||||
window.localStorage.getItem("test")
|
||||
} catch (e) {
|
||||
activeState.settings.persistentStorage = "false";
|
||||
}
|
||||
|
||||
//check if user is logged in
|
||||
sessionVerification();
|
||||
let verfiedStatus = window.sessionStorage.getItem(sha256("verified"));
|
||||
if (verfiedStatus != null) {
|
||||
//init passwordhash to retrieve cookie info
|
||||
passwordHash.init();
|
||||
|
||||
//set user id
|
||||
activeState.userId = getUsrId();
|
||||
|
||||
|
||||
//check if user is logged in
|
||||
if (passwordHash.verify()) {
|
||||
//user logged in
|
||||
|
||||
//write verifiedStatus content into passwordHash for decode check later
|
||||
passwordHash.set(XORCipher.decode(sha256("passwordHash"), verfiedStatus));
|
||||
document.getElementById("login").style.display = "none";
|
||||
|
||||
} else {
|
||||
document.getElementById("login").style.display = "block";
|
||||
}
|
||||
|
||||
//load settings from storage
|
||||
let settings = storeSettings("getInit", true);
|
||||
|
||||
if (settings != "") {
|
||||
for (let setting of Object.entries(settings)) {
|
||||
activeState.settings[setting[0]] = setting[1];
|
||||
}
|
||||
}
|
||||
|
||||
//load NavigationBar with templates according to server
|
||||
loadNavBar();
|
||||
|
||||
@ -65,100 +91,72 @@ function init() {
|
||||
//add event listeners to document and window
|
||||
eventListeners();
|
||||
|
||||
//print current version to footer
|
||||
printVersion();
|
||||
|
||||
//add sign out
|
||||
document
|
||||
.getElementById("logout")
|
||||
.addEventListener("click", logout);
|
||||
|
||||
//print current version and storage mode to footer
|
||||
let msg = (activeState.settings.persistentStorage == "false") ? "temporary" : "persistent";
|
||||
printVersion("storage mode: "+msg+" |");
|
||||
|
||||
//adjust title for mobile use
|
||||
if (screen.width < 993) {
|
||||
document.getElementById("siteTitle").innerHTML = "TG";
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
function eventListeners() {
|
||||
|
||||
//add hideMenu to Body
|
||||
document
|
||||
.getElementsByClassName("w3-main")[0]
|
||||
.addEventListener("click", hideMenus);
|
||||
.body
|
||||
.addEventListener("click", (e) => hideMenus(e));
|
||||
|
||||
//add set Password to loginForm
|
||||
document
|
||||
.getElementById("submitPassword")
|
||||
.addEventListener("click", setPassword);
|
||||
//add toggle Navigation Menu
|
||||
document
|
||||
.getElementById("toggleNavigationMenu")
|
||||
.addEventListener("click", showMenu);
|
||||
//add loadTemplateBtn event showMenu
|
||||
document
|
||||
.getElementById("loadTemplateBtn")
|
||||
.addEventListener("click", showMenu);
|
||||
//add toggle sideBar Menu
|
||||
document
|
||||
.getElementById("toggleSidebarMenu")
|
||||
.addEventListener("click", showSidebar);
|
||||
//add toggle files Menu and sidebar button
|
||||
document
|
||||
.getElementById("toggleFilesMenuSB")
|
||||
.addEventListener("click", buildFile);
|
||||
document
|
||||
.getElementById("toggleFilesMenu")
|
||||
.addEventListener("click", buildFile);
|
||||
//add load template sidebar entry
|
||||
document
|
||||
.getElementById("loadTemplateBtn")
|
||||
.addEventListener("click", showMenu);
|
||||
//add toggle textBLocks Menu
|
||||
document
|
||||
.getElementById("toggleTestBlocksMenu")
|
||||
.addEventListener("click", showTextBlocks);
|
||||
//add set Password to loginForm
|
||||
document
|
||||
.getElementById("submitPassword")
|
||||
.addEventListener("click", setPassword);
|
||||
//add toggle Navigation Menu
|
||||
document
|
||||
.getElementById("toggleNavigationMenu")
|
||||
.addEventListener("click", showMenu);
|
||||
//add loadTemplateBtn event showMenu
|
||||
document
|
||||
.getElementById("loadTemplateBtn")
|
||||
.addEventListener("click", showMenu);
|
||||
//add toggle sideBar Menu
|
||||
document
|
||||
.getElementById("toggleSidebarMenu")
|
||||
.addEventListener("click", showSidebar);
|
||||
//add toggle files Menu and sidebar button
|
||||
document
|
||||
.getElementById("toggleFilesMenuSB")
|
||||
.addEventListener("click", buildFile);
|
||||
document
|
||||
.getElementById("toggleFilesMenu")
|
||||
.addEventListener("click", buildFile);
|
||||
|
||||
//add setFormBtn for use in form
|
||||
document
|
||||
.getElementById("setFormBtn")
|
||||
.addEventListener("click", (e) => clickSetForm(e));
|
||||
//add toggle textBLocks Menu
|
||||
document
|
||||
.getElementById("toggleTestBlocksMenu")
|
||||
.addEventListener("click", showTextBlocks);
|
||||
|
||||
//add saveFiles to server listener on launch page
|
||||
document
|
||||
.getElementById("importFilesSB")
|
||||
.addEventListener("click", () => clickImportFiles());
|
||||
//add saveFiles to server listener on launch page
|
||||
document
|
||||
.getElementById("importFilesSB")
|
||||
.addEventListener("click", () => clickImportFiles());
|
||||
|
||||
//add key listener for ctrl s in form mode
|
||||
window.addEventListener("keydown", (e) => {
|
||||
|
||||
if (e.ctrlKey && e.key == "s") {
|
||||
if (activeState.activePage == "form");
|
||||
createStorageObj();
|
||||
parseFormOnSubmit();
|
||||
modalNotifier("File copied to clipboard", 1);
|
||||
e.preventDefault();
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function printVersion() {
|
||||
const scripts = document.getElementsByTagName("script");
|
||||
const versionSpan = document.getElementById("currentVersion").lastChild;
|
||||
|
||||
for (var i=0;i<scripts.length;i++) {
|
||||
if (scripts[i].src) {
|
||||
let source = scripts[i].src;
|
||||
// js/version/main.js
|
||||
let pathVersion = source.split("/");
|
||||
pathVersion = pathVersion[pathVersion.length-2];
|
||||
//add it to document footer currentVersion
|
||||
versionSpan.textContent = "version: " + pathVersion;
|
||||
//add key listener for ctrl s in form mode
|
||||
inputRead.init();
|
||||
window.addEventListener("keydown", (e) => {
|
||||
if (activeState.activePage == "template") {
|
||||
inputRead.read(e);
|
||||
if (e.ctrlKey && e.key == "s") {
|
||||
createStorageObj();
|
||||
parseFormOnSubmit();
|
||||
modalNotifier("File copied to clipboard", activeState.settings.notifierPause);
|
||||
let copyButton = document.getElementById("fromCopyBtn");
|
||||
copyButton.className.replace(" w3-grey", " w3-flat-carrot");
|
||||
copyButton.value = "Copied";
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
init();
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import { sanitize } from "./scripts.js";
|
||||
import { sanitize, getCurrentDate } from "./scripts.js";
|
||||
import { storeData, clearData, retrieveData } from "./storage.js";
|
||||
|
||||
function parseFormOnSubmit(returnJSON = false, parseOnly = false) {
|
||||
@ -9,23 +9,17 @@ function parseFormOnSubmit(returnJSON = false, parseOnly = false) {
|
||||
if (parseOnly) {
|
||||
let lT = activeState.loadedTemplate;
|
||||
dataArray = retrieveData("userInputForce", lT);
|
||||
if (dataArray != "") {
|
||||
try {
|
||||
dataArray = JSON.parse(dataArray);
|
||||
} catch (e) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
if (dataArray == null) {
|
||||
let wrapper = document.createElement("div");
|
||||
wrapper.innerHTML = mainFormPlaceholder();
|
||||
wrapper.innerHTML = mainFormPlaceholder("Error: file empty");
|
||||
let div = wrapper.firstChild;
|
||||
return div;
|
||||
}
|
||||
|
||||
if (dataArray.length <= 0) {
|
||||
let wrapper = document.createElement("div");
|
||||
wrapper.innerHTML = mainFormPlaceholder();
|
||||
wrapper.innerHTML = mainFormPlaceholder("File empty");
|
||||
let div = wrapper.firstChild;
|
||||
return div;
|
||||
}
|
||||
@ -55,10 +49,10 @@ function parseFormOnSubmit(returnJSON = false, parseOnly = false) {
|
||||
|
||||
|
||||
//get original objects from sessionstorage gen from loadTemplate
|
||||
let objects = JSON.parse(window.sessionStorage.getItem("templateObjects"));
|
||||
let objects = activeState.templateObjects;
|
||||
|
||||
//get the complete unparsed template string from sessionstorage from loadTemplate
|
||||
let fullString = window.sessionStorage.getItem("fullString");
|
||||
let fullString = activeState.fullString;
|
||||
|
||||
//define output buffer
|
||||
let b = "";
|
||||
@ -95,8 +89,9 @@ function parseFormOnSubmit(returnJSON = false, parseOnly = false) {
|
||||
}
|
||||
|
||||
//if field matches current object
|
||||
if (obj.word.replace(/ /g, "_") === data.name) {
|
||||
if (obj.word.replace(/ /g, "_") == data.name) {
|
||||
let value = parseDataForResult(obj, data.value);
|
||||
if (value == "!none") value = "";
|
||||
obj.result = value;
|
||||
|
||||
}
|
||||
@ -104,12 +99,12 @@ function parseFormOnSubmit(returnJSON = false, parseOnly = false) {
|
||||
//handle conlist elements for parsing each element
|
||||
if (conListFlag && obj.type == "conList") {
|
||||
let value = parseConListForResult(obj, data, dataArray);
|
||||
if (value == "!none") value = "";
|
||||
obj.result = value;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//console.log(this, dataArray);
|
||||
|
||||
b = fullString.substring(0, objects[0].spos);
|
||||
for (let i = 0; i < objects.length; i++) {
|
||||
@ -131,8 +126,8 @@ function parseFormOnSubmit(returnJSON = false, parseOnly = false) {
|
||||
bHtml = bHtml.replace(/ /g, " ");
|
||||
|
||||
let divContent = document.createElement("div");
|
||||
divContent.style.fontFamily = activeState.font + ", Helvetica, sans-serif";
|
||||
divContent.style.fontSize = activeState.fontSize;
|
||||
divContent.style.fontFamily = activeState.settings.font + ", Helvetica, sans-serif";
|
||||
divContent.style.fontSize = activeState.settings.fontSize;
|
||||
divContent.innerHTML = bHtml;
|
||||
|
||||
let div = document.createElement("div");
|
||||
@ -144,13 +139,7 @@ function parseFormOnSubmit(returnJSON = false, parseOnly = false) {
|
||||
return div;
|
||||
}
|
||||
|
||||
// let p = document.createElement("p");
|
||||
// p.innerHTML = "Copied to Clipboard:";
|
||||
// document.getElementById("output").innerHTML = "";
|
||||
// document.getElementById("output").appendChild(p);
|
||||
// document.getElementById("output").appendChild(div);
|
||||
|
||||
storeData("userInput", JSON.stringify(dataArray));
|
||||
storeData("userInput", dataArray);
|
||||
clearData("userInput");
|
||||
|
||||
if (returnJSON) {
|
||||
@ -322,7 +311,7 @@ function parseFormOnSubmit(returnJSON = false, parseOnly = false) {
|
||||
//parse each line of input with parseLineBreak return condensed string with newlines
|
||||
let parsedData = '';
|
||||
for (let line of data.split('\n')) {
|
||||
let parsedLine = parseLineBreak(line, 0, activeState.lineBreak);
|
||||
let parsedLine = parseLineBreak(line, 0, activeState.settings.lineBreak);
|
||||
if (parsedData != '') {
|
||||
parsedData = parsedData + '\n' + parsedLine;
|
||||
} else {
|
||||
@ -332,7 +321,7 @@ function parseFormOnSubmit(returnJSON = false, parseOnly = false) {
|
||||
return parsedData
|
||||
}
|
||||
|
||||
function parseLineBreak(line, intendation = 0, lineBreak = activeState.lineBreak - 5) {
|
||||
function parseLineBreak(line, intendation = 0, lineBreak = activeState.settings.lineBreak - 5) {
|
||||
//add 5 chars buffer to fix list intendation issue
|
||||
//each input field gets parsed line by line twice once for list inputs and a second time for each input
|
||||
let lines;
|
||||
@ -435,8 +424,8 @@ function loadTextBlocks() {
|
||||
document.body.removeChild(container);
|
||||
}
|
||||
|
||||
function mainFormPlaceholder() {
|
||||
return "<div class='w3-row-padding w3-padding-24 w3-container w3-flat-clouds'><div class='w3-code notranslate w3-border-white' style='font-family: Arial, Helvetica, sans-serif;'><p>Select a file</p><br><br><br><br><br><br><br><br><br><br><br></div></div>";
|
||||
function mainFormPlaceholder(msg) {
|
||||
return "<div class='w3-row-padding w3-padding-24 w3-container w3-flat-clouds'><div class='w3-code notranslate w3-border-white' style='font-family: Arial, Helvetica, sans-serif;'><p>" + msg + "</p><br><br><br><br><br><br><br><br><br><br><br></div></div>";
|
||||
}
|
||||
|
||||
export default parseFormOnSubmit;
|
||||
@ -1,50 +1,40 @@
|
||||
import { retrieveData } from "./storage.js";
|
||||
import { createStorageObj, retrieveData } from "./storage.js";
|
||||
import sha256 from "./sha256.min.js";
|
||||
import XORCipher from "./xorc.js";
|
||||
import getBrowserFingerprint from "./identify.js"
|
||||
|
||||
export const passwordHash = {
|
||||
name: "anae3Iegbai1ahLu",
|
||||
fp: getBrowserFingerprint( { hardwareOnly: true } ),
|
||||
name: cyrb53("m21_"+getBrowserFingerprint( { hardwareOnly: true } )),
|
||||
toString: () => {
|
||||
let data;
|
||||
try {
|
||||
data = window.sessionStorage.getItem(sha256(passwordHash.name));
|
||||
} catch (e) {
|
||||
return "none";
|
||||
}
|
||||
if (data === null) return "none";
|
||||
return XORCipher.decode(passwordHash.name, data);
|
||||
},
|
||||
getId: () => {
|
||||
return passwordHash.fp;
|
||||
let token = window.activeState.sessionToken;
|
||||
if (token === null) return "none";
|
||||
if (token == "") return "none"
|
||||
return XORCipher.decode(passwordHash.name, token);
|
||||
},
|
||||
set: (pw) => {
|
||||
window.sessionStorage.setItem(sha256(passwordHash.name), XORCipher.encode(passwordHash.name, pw));
|
||||
activeState.sessionToken = XORCipher.encode(passwordHash.name, pw);
|
||||
},
|
||||
init: function () {
|
||||
//check if cookie exists
|
||||
if (getCookie(sha256(passwordHash.name)) != null) {
|
||||
passwordHash.set(XORCipher.decode(sha256(passwordHash.name), getCookie(sha256(passwordHash.name))));
|
||||
}
|
||||
let verifiedStatus = false;
|
||||
let tF = retrieveData("templateFiles");
|
||||
if (tF != null) {verifiedStatus = true}
|
||||
|
||||
if (verifiedStatus == true) {
|
||||
setCookie(sha256(passwordHash.name), XORCipher.encode(sha256(passwordHash.name), passwordHash), 10)
|
||||
}
|
||||
},
|
||||
verify: function () {
|
||||
let verifiedStatus = false;
|
||||
let tF = retrieveData("templateFiles");
|
||||
if (tF != null) {verifiedStatus = true}
|
||||
return verifiedStatus;
|
||||
}
|
||||
}
|
||||
|
||||
//export const passwordHash = {
|
||||
// toString: () => {
|
||||
// let fp = getBrowserFingerprint( { hardwareOnly: true } );
|
||||
// let data;
|
||||
// try {
|
||||
// data = window.sessionStorage.getItem(sha256(fp));
|
||||
// } catch (e) {
|
||||
// return "none";
|
||||
// }
|
||||
// if (data === null) return "none";
|
||||
// return XORCipher.decode(fp, data);
|
||||
// },
|
||||
//
|
||||
// set: (pw) => {
|
||||
// let fp = getBrowserFingerprint( { hardwareOnly: true } );
|
||||
// window.sessionStorage.setItem(sha256(fp), XORCipher.encode(fp, pw));
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
|
||||
function setPassword() {
|
||||
let x = document.getElementById("loginForm");
|
||||
let pw = sanitize(x.elements[0].value);
|
||||
@ -53,72 +43,23 @@ function setPassword() {
|
||||
let pwOld = pw;
|
||||
passwordHash.set(sha256(pw));
|
||||
let templateFiles = retrieveData("templateFiles");
|
||||
if (templateFiles != "") {
|
||||
try {
|
||||
JSON.parse(templateFiles);
|
||||
} catch (e) {
|
||||
document.getElementById("wrongPWAlert").style.display = "block";
|
||||
const alertTimeout = setTimeout(() => {
|
||||
document.getElementById("wrongPWAlert").style.display = "none";
|
||||
}, 5000);
|
||||
passwordHash.set(pwOld);
|
||||
x.elements[0].value = "";
|
||||
return;
|
||||
}
|
||||
if (templateFiles == null) {
|
||||
document.getElementById("wrongPWAlert").style.display = "block";
|
||||
const alertTimeout = setTimeout(() => {
|
||||
document.getElementById("wrongPWAlert").style.display = "none";
|
||||
}, 5000);
|
||||
passwordHash.set(pwOld);
|
||||
x.elements[0].value = "";
|
||||
return;
|
||||
}
|
||||
//user logged in
|
||||
|
||||
document.getElementById("login").style.display = "none";
|
||||
window.sessionStorage.setItem(sha256("verified"), XORCipher.encode(sha256("passwordHash"), passwordHash));
|
||||
setCookie(sha256("verified"), XORCipher.encode(sha256("passwordHash"), passwordHash), 10)
|
||||
setCookie(sha256(passwordHash.name), XORCipher.encode(sha256(passwordHash.name), passwordHash), 10)
|
||||
}
|
||||
}
|
||||
|
||||
export function getUsrId() {
|
||||
const fingerprint = getBrowserFingerprint( { hardwareOnly: true } );
|
||||
return cyrb53(fingerprint + passwordHash);
|
||||
}
|
||||
|
||||
export function sessionVerification() {
|
||||
|
||||
//check if cookie exists
|
||||
if (getCookie(sha256("verified")) != null) {
|
||||
passwordHash.set(XORCipher.decode(sha256("passwordHash"), getCookie(sha256("verified"))));
|
||||
window.sessionStorage.setItem(sha256("verified"), XORCipher.encode(sha256("passwordHash"), passwordHash));
|
||||
}
|
||||
|
||||
let verfiedStatus = window.sessionStorage.getItem(sha256("verified"));
|
||||
let data;
|
||||
try {
|
||||
data = window.sessionStorage.getItem(sha256(passwordHash.name));
|
||||
} catch (e) {
|
||||
verfiedStatus = null;
|
||||
}
|
||||
if (data === null) verfiedStatus = null;
|
||||
|
||||
//if (verfiedStatus != data) verfiedStatus = null
|
||||
let vsString;
|
||||
let pnString;
|
||||
try {
|
||||
vsString = XORCipher.decode(sha256("passwordHash"), verfiedStatus);
|
||||
pnString = XORCipher.decode(passwordHash.name, data);
|
||||
if (vsString != pnString) verfiedStatus = null;
|
||||
} catch (e) {
|
||||
verfiedStatus = null;
|
||||
}
|
||||
|
||||
let tF = retrieveData("templateFiles");
|
||||
try {
|
||||
tF = JSON.parse(tF);
|
||||
} catch(e) {
|
||||
//verfiedStatus = null;
|
||||
}
|
||||
|
||||
return (verfiedStatus == null) ? false : true;
|
||||
|
||||
}
|
||||
|
||||
const cyrb53 = (str, seed = 21) => {
|
||||
function cyrb53(str, seed = 21) {
|
||||
let h1 = 0xdeadbeef ^ seed,
|
||||
h2 = 0x41c6ce57 ^ seed;
|
||||
for (let i = 0, ch; i < str.length; i++) {
|
||||
@ -131,7 +72,12 @@ const cyrb53 = (str, seed = 21) => {
|
||||
h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);
|
||||
|
||||
return 4294967296 * (2097151 & h2) + (h1 >>> 0);
|
||||
};
|
||||
}
|
||||
|
||||
export function getUsrId() {
|
||||
const fingerprint = getBrowserFingerprint( { hardwareOnly: true } );
|
||||
return cyrb53(fingerprint + passwordHash);
|
||||
}
|
||||
|
||||
function setCookie(cname, cvalue, exdays) {
|
||||
const d = new Date();
|
||||
@ -140,7 +86,7 @@ function setCookie(cname, cvalue, exdays) {
|
||||
document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
|
||||
}
|
||||
|
||||
export function getCookie(cname) {
|
||||
function getCookie(cname) {
|
||||
let name = cname + "=";
|
||||
let ca = document.cookie.split(';');
|
||||
for(let i = 0; i < ca.length; i++) {
|
||||
@ -156,10 +102,10 @@ export function getCookie(cname) {
|
||||
}
|
||||
|
||||
export function logout() {
|
||||
let id = sha256("verified");
|
||||
window.sessionStorage.setItem(id, "");
|
||||
let id = sha256(passwordHash.name);
|
||||
activeState.sessionToken = "";
|
||||
setCookie(sha256(passwordHash.name), "", 1);
|
||||
document.cookie = id + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
|
||||
sessionVerification();
|
||||
document.getElementById("passwordField").value = "";
|
||||
document.getElementById("login").style.display = "block";
|
||||
}
|
||||
@ -178,8 +124,91 @@ export function sanitize(string) {
|
||||
'=': '_'
|
||||
};
|
||||
const reg = /[&<>"'/]/ig;
|
||||
console.log(string.replace(reg, (match)=>(map[match])));
|
||||
return string.replace(reg, (match)=>(map[match]));
|
||||
}
|
||||
|
||||
export function isAlphaNumeric(str) {
|
||||
var code, i, len;
|
||||
|
||||
for (i = 0, len = str.length; i < len; i++) {
|
||||
code = str.charCodeAt(i);
|
||||
if (!(code > 47 && code < 58) && // numeric (0-9)
|
||||
!(code > 64 && code < 91) && // upper alpha (A-Z)
|
||||
!(code > 96 && code < 123)) { // lower alpha (a-z)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
export const inputRead = {
|
||||
init: function () {
|
||||
this.event = "";
|
||||
this.inputString = "";
|
||||
this.source = "";
|
||||
this.inputContent = "";
|
||||
this.lastRunTime = new Date();
|
||||
this.target = document.getElementById("toggleFilesMenu");
|
||||
this.lastExecId = "";
|
||||
},
|
||||
read: function (event) {
|
||||
this.event = event;
|
||||
this.source = event.srcElement.id;
|
||||
let previousContent = this.inputContent;
|
||||
let key = (event.key !=undefined) ? event.key : "";
|
||||
let contentElement = document.getElementById(this.source);
|
||||
this.inputContent = (contentElement != undefined) ? contentElement.value + key : "";
|
||||
|
||||
if (this.inputContent == "" || key == "") return;
|
||||
if (key.length > 1) return;
|
||||
if (event.ctrlKey) return;
|
||||
if (this.inputContent == previousContent) return;
|
||||
|
||||
this.lastRunTime = new Date();
|
||||
clearTimeout(this.lastExecId);
|
||||
|
||||
this.target.style.borderBottom = "3px solid #c0392b";
|
||||
this.target.innerHTML = "";
|
||||
let i = document.createElement("i");
|
||||
i.classList.add("fa", "fa-save");
|
||||
this.target.appendChild(i);
|
||||
this.lastExecId = setTimeout(() => {
|
||||
createStorageObj();
|
||||
this.target.style.borderBottom = "none";
|
||||
this.target.innerHTML = "";
|
||||
let i = document.createElement("i");
|
||||
i.classList.add("fa", "fa-file");
|
||||
this.target.appendChild(i);
|
||||
}, 1000);
|
||||
},
|
||||
}
|
||||
|
||||
export function getCurrentDate() {
|
||||
let date = new Date();
|
||||
let uts = Date.now();
|
||||
let current_hour = date.getHours();
|
||||
current_hour = current_hour <= 9 ? "0" + current_hour : current_hour;
|
||||
let current_minute = date.getMinutes();
|
||||
current_minute = current_minute <= 9 ? "0" + current_minute : current_minute;
|
||||
let current_second = date.getSeconds();
|
||||
current_second = current_second <= 9 ? "0" + current_second : current_second;
|
||||
let current_month = date.getMonth() + 1;
|
||||
current_month = current_month <= 9 ? "0" + current_month : current_month;
|
||||
let current_day = date.getDate();
|
||||
current_day = current_day <= 9 ? "0" + current_day : current_day;
|
||||
let current_year = date.getFullYear();
|
||||
|
||||
|
||||
let current_time = current_hour + ":" + current_minute;
|
||||
let current_time_long = current_hour + ":" + current_minute + ":" + current_second;
|
||||
let current_date = current_day + "." + current_month;
|
||||
return {
|
||||
current_time: current_time,
|
||||
current_time_long: current_time_long,
|
||||
current_date: current_date,
|
||||
current_year: current_year,
|
||||
uts: uts
|
||||
};
|
||||
}
|
||||
|
||||
export default setPassword;
|
||||
|
||||
207
js/9.9.9/settings.js
Normal file
207
js/9.9.9/settings.js
Normal file
@ -0,0 +1,207 @@
|
||||
import { hideMenus, modalNotifier, printVersion, resetNavBar } from "./evts.js";
|
||||
import { passwordHash, sanitize } from "./scripts.js";
|
||||
import sha256 from "./sha256.min.js";
|
||||
import { retrieveData, storeData, storeSettings } from "./storage.js";
|
||||
|
||||
const buildSettings = () => {
|
||||
//set current page value in activeState object
|
||||
activeState.activePage = "settings";
|
||||
|
||||
if (screen.width > 992) {
|
||||
document.getElementById("siteTitle").innerHTML = "Settings";
|
||||
} else {
|
||||
document.getElementById("siteTitle").innerHTML = "TG";
|
||||
document.getElementById("logo").innerHTML = "TG";
|
||||
}
|
||||
|
||||
//sessionVerfication check
|
||||
if (!passwordHash.verify()) {
|
||||
modalNotifier("Error: Session is not authenticated...", 0);
|
||||
}
|
||||
|
||||
//reset navbar if files was used
|
||||
resetNavBar();
|
||||
|
||||
//disable toggleTestBlocksMenu
|
||||
document.getElementById("toggleTestBlocksMenu").style.display = "none";
|
||||
|
||||
//reset page and event listeners
|
||||
|
||||
hideMenus();
|
||||
|
||||
let mainFormDiv = document.getElementById("mainForm");
|
||||
let outputDiv = document.getElementById("output");
|
||||
let submitContainerDiv = document.getElementById("submitContainer");
|
||||
let sidebarDiv = document.getElementById("sidebar");
|
||||
|
||||
mainFormDiv.innerHTML = "";
|
||||
mainFormDiv.replaceWith(mainFormDiv.cloneNode(true));
|
||||
outputDiv.innerHTML = "";
|
||||
outputDiv.replaceWith(outputDiv.cloneNode(true));
|
||||
submitContainerDiv.innerHTML = "";
|
||||
submitContainerDiv.replaceWith(submitContainerDiv.cloneNode(true));
|
||||
sidebarDiv.innerHTML = "";
|
||||
sidebarDiv.replaceWith(sidebarDiv.cloneNode(true));
|
||||
|
||||
addSidebar();
|
||||
|
||||
buildForm();
|
||||
|
||||
//add events
|
||||
formEvts();
|
||||
};
|
||||
|
||||
function formEvts() {
|
||||
//add event listener to submitContainer
|
||||
document.getElementById("submitContainer").addEventListener("click", (e) => {
|
||||
if (e.target && e.target.tagName === "INPUT") {
|
||||
switch (e.target.value) {
|
||||
case "Save":
|
||||
saveSettings();
|
||||
modalNotifier(
|
||||
"Settings saved!",
|
||||
activeState.settings.notifierPause
|
||||
);
|
||||
e.target.className = e.target.className.replace(
|
||||
" w3-grey",
|
||||
" w3-flat-nephritis"
|
||||
);
|
||||
e.target.style.pointerEvents = "none";
|
||||
const timeoutSave = setTimeout(() => {
|
||||
e.target.className = e.target.className.replace(
|
||||
" w3-flat-nephritis",
|
||||
" w3-grey"
|
||||
);
|
||||
e.target.style.pointerEvents = "auto";
|
||||
}, 250);
|
||||
e.preventDefault;
|
||||
break;
|
||||
default:
|
||||
e.preventDefault;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function buildForm() {
|
||||
let form = document.createElement("FORM");
|
||||
form.setAttribute("method", "post");
|
||||
form.setAttribute("action", "javascript:void(0)");
|
||||
form.setAttribute("id", "mainFormObj");
|
||||
form.classList.add("w3-row");
|
||||
|
||||
let settings = storeSettings("get", true);
|
||||
if (settings == "") settings = activeState.settings;
|
||||
|
||||
for (let setting of Object.entries(settings)) {
|
||||
buildField(setting, form);
|
||||
}
|
||||
|
||||
//add form to mainForm Div
|
||||
document.getElementById("mainForm").appendChild(form);
|
||||
|
||||
// create a Save button
|
||||
let saveBtn = document.createElement("input");
|
||||
saveBtn.setAttribute("type", "submit");
|
||||
saveBtn.setAttribute("value", "Save");
|
||||
saveBtn.classList.add("w3-button");
|
||||
saveBtn.classList.add("w3-grey");
|
||||
saveBtn.style.margin = "20px";
|
||||
//append submit button to submitContainer
|
||||
|
||||
document.getElementById("submitContainer").appendChild(saveBtn);
|
||||
}
|
||||
|
||||
function buildField(obj, form) {
|
||||
|
||||
//create template Input fields
|
||||
let divContainer = document.createElement("DIV");
|
||||
divContainer.classList.add("w3-half");
|
||||
divContainer.classList.add("w3-container");
|
||||
|
||||
let div = document.createElement("DIV");
|
||||
div.classList.add("w3-section");
|
||||
div.classList.add("w3-left-align");
|
||||
|
||||
div.setAttribute("style", "padding: 10px");
|
||||
|
||||
let label = document.createElement("LABEL");
|
||||
label.style.display = "inline-block";
|
||||
label.style.width = "100%";
|
||||
label.style.paddingBottom = "5px";
|
||||
label.style.borderBottom = "thin solid #9e9e9e";
|
||||
label.style.fontWeight = "800";
|
||||
|
||||
let input = document.createElement("input");
|
||||
input.setAttribute("type", "text");
|
||||
input.setAttribute("name", obj[0]);
|
||||
input.setAttribute("id", obj[0]);
|
||||
input.classList.add("w3-input");
|
||||
input.id = obj[0];
|
||||
input.value = obj[1];
|
||||
label.innerHTML = obj[0];
|
||||
div.appendChild(label);
|
||||
div.appendChild(input);
|
||||
//append field to wrapper and add to mainForm
|
||||
divContainer.appendChild(div);
|
||||
form.appendChild(divContainer);
|
||||
}
|
||||
|
||||
function addSidebar() {
|
||||
let sidebarList = document.createElement("ul");
|
||||
sidebarList.classList.add("w3-ul");
|
||||
|
||||
let sidebarListItem = document.createElement("li");
|
||||
|
||||
sidebarListItem.classList.add(
|
||||
"w3-bar-item",
|
||||
"w3-padding-large",
|
||||
"w3-button"
|
||||
);
|
||||
sidebarListItem.style.borderBottom = "1px solid #ddd";
|
||||
sidebarListItem.id = "sb-title";
|
||||
sidebarListItem.innerHTML = "Edit Settings"
|
||||
sidebarList.appendChild(sidebarListItem);
|
||||
|
||||
document.getElementById("sidebar").appendChild(sidebarList);
|
||||
|
||||
}
|
||||
|
||||
function saveSettings() {
|
||||
let x = document.getElementById("mainFormObj");
|
||||
let obj = {};
|
||||
if (x == null) {
|
||||
return;
|
||||
}
|
||||
for (let i = 0; i < x.length; i++) {
|
||||
let name = x.elements[i].name;
|
||||
let value = x.elements[i].value;
|
||||
obj[name] = sanitize(value);
|
||||
}
|
||||
for (let setting of Object.entries(obj)) {
|
||||
if (activeState.settings[setting[0]] != setting[1]) {
|
||||
//change detected
|
||||
if (setting[0] == "persistentStorage") {
|
||||
let tF = retrieveData("templateFiles");
|
||||
let settings = storeSettings("get", true);
|
||||
activeState.settings[setting[0]] = setting[1];
|
||||
|
||||
if (setting[1] == "false") {
|
||||
try {
|
||||
window.localStorage.removeItem(sha256("settings_m21_"));
|
||||
} catch (e) {}
|
||||
let msg = (activeState.settings.persistentStorage == "false") ? "temporary" : "persistent";
|
||||
printVersion("storage mode: "+msg+" |");
|
||||
}
|
||||
if (settings != "") storeSettings(settings);
|
||||
if (tF != null) storeData("templateFiles", tF);
|
||||
}
|
||||
}
|
||||
activeState.settings[setting[0]] = setting[1];
|
||||
}
|
||||
storeSettings(obj);
|
||||
}
|
||||
|
||||
|
||||
export default buildSettings;
|
||||
@ -1,7 +1,37 @@
|
||||
import XORCipher from "./xorc.js";
|
||||
import sha256 from "./sha256.min.js";
|
||||
import { getUsrId, passwordHash, sanitize } from "./scripts.js";
|
||||
import { getCurrentDate, getUsrId, passwordHash, sanitize } from "./scripts.js";
|
||||
import { printVersion } from "./evts.js";
|
||||
|
||||
const store = {
|
||||
getItem: function (key) {return getStor().getItem(key)},
|
||||
setItem: function (key, data) {getStor().setItem(key, data)},
|
||||
removeItem: function (key) {getStor().removeItem(key)},
|
||||
clear: function () {getStor().clear()},
|
||||
};
|
||||
|
||||
const tempStore = {
|
||||
setItem: function (key, data) {
|
||||
globalThis.activeState.storage[key] = data;
|
||||
},
|
||||
getItem: function (key) {
|
||||
return globalThis.activeState.storage[key];
|
||||
},
|
||||
removeItem: function (key) {
|
||||
globalThis.activeState.storage[key] = "";
|
||||
},
|
||||
clear: function () {
|
||||
globalThis.activeState.storage = "";
|
||||
},
|
||||
};
|
||||
|
||||
function getStor() {
|
||||
if (window.activeState.settings.persistentStorage == "true") {
|
||||
return window.localStorage;
|
||||
} else {
|
||||
return tempStore;
|
||||
}
|
||||
}
|
||||
|
||||
function createStorageObj() {
|
||||
let x = document.getElementById("mainFormObj");
|
||||
@ -30,16 +60,16 @@ function createStorageObj() {
|
||||
}
|
||||
} else if (userFileNamePH.length != 0) {
|
||||
activeState.fileName = userFileNamePH;
|
||||
}
|
||||
}
|
||||
|
||||
storeData("userInput", JSON.stringify(dataArray));
|
||||
|
||||
storeData("userInput", dataArray, "save");
|
||||
}
|
||||
|
||||
function storeData(name, data) {
|
||||
function storeData(name, data, ref) {
|
||||
data = JSON.stringify(data);
|
||||
//setCookie(name, btoa(data), 7);
|
||||
if (name == "userInput") {
|
||||
name = getFileName();
|
||||
name = getFileName(ref);
|
||||
}
|
||||
if (name == "userInputForce") {
|
||||
name = "userInput";
|
||||
@ -49,147 +79,141 @@ function storeData(name, data) {
|
||||
if (name == "templateFiles") {
|
||||
key = sha256(name + "_m21_");
|
||||
}
|
||||
window.localStorage.setItem(key, obfuscate(data));
|
||||
store.setItem(key, obfuscate(data));
|
||||
}
|
||||
|
||||
function retrieveData(type, template = "none") {
|
||||
if (type == "userInput") {
|
||||
let tF = JSON.parse(retrieveData("templateFiles"));
|
||||
function retrieveData(name, template = "none") {
|
||||
if (name == "userInput") {
|
||||
let tF = retrieveData("templateFiles");
|
||||
if (tF == null) {
|
||||
return "";
|
||||
return [];
|
||||
} else {
|
||||
type = tF[tF.length - 1].fileName;
|
||||
name = tF[tF.length - 1].fileName;
|
||||
}
|
||||
}
|
||||
if (type == "userInputForce") {
|
||||
type = "userInput";
|
||||
if (name == "userInputForce") {
|
||||
name = "userInput";
|
||||
}
|
||||
let cdata;
|
||||
let key;
|
||||
if (template == "none") {
|
||||
let lT = activeState.loadedTemplate;
|
||||
let key = sha256(type + "_m21_" + lT);
|
||||
if (type == "templateFiles") {
|
||||
key = sha256(type + "_m21_");
|
||||
key = sha256(name + "_m21_" + lT);
|
||||
if (name == "templateFiles") {
|
||||
key = sha256(name + "_m21_");
|
||||
}
|
||||
cdata = window.localStorage.getItem(key);
|
||||
} else {
|
||||
let key = sha256(type + "_m21_" + template);
|
||||
cdata = window.localStorage.getItem(key);
|
||||
key = sha256(name + "_m21_" + template);
|
||||
}
|
||||
cdata = store.getItem(key);
|
||||
|
||||
if (cdata != null) {
|
||||
return obfuscate(cdata, false);
|
||||
cdata = obfuscate(cdata, false);
|
||||
let data;
|
||||
try {
|
||||
data = JSON.parse(cdata);
|
||||
} catch (e) {
|
||||
data = null;
|
||||
}
|
||||
return data;
|
||||
} else {
|
||||
return "[]";
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
function clearData(type, template = "none") {
|
||||
function clearData(name, template = "none") {
|
||||
let lT;
|
||||
let key;
|
||||
if (template == "none") {
|
||||
lT = activeState.loadedTemplate;
|
||||
key = sha256(type + "_m21_" + lT);
|
||||
if (type == "templateFiles") {
|
||||
key = sha256(type + "_m21_");
|
||||
key = sha256(name + "_m21_" + lT);
|
||||
if (name == "templateFiles") {
|
||||
key = sha256(name + "_m21_");
|
||||
}
|
||||
} else {
|
||||
lT = template;
|
||||
key = sha256(type + "_m21_" + template);
|
||||
key = sha256(name + "_m21_" + template);
|
||||
}
|
||||
window.localStorage.removeItem(key);
|
||||
store.removeItem(key);
|
||||
}
|
||||
|
||||
function getFileName() {
|
||||
function getFileName(ref = "none") {
|
||||
let currentFileName = activeState.fileName;
|
||||
let lT = activeState.loadedTemplate;
|
||||
if (currentFileName == "none" || currentFileName == "") {
|
||||
let date = new Date();
|
||||
let current_hour = date.getHours();
|
||||
current_hour = current_hour <= 9 ? "0" + current_hour : current_hour;
|
||||
let current_minute = date.getMinutes();
|
||||
current_minute =
|
||||
current_minute <= 9 ? "0" + current_minute : current_minute;
|
||||
let current_month = date.getMonth() + 1;
|
||||
current_month = current_month <= 9 ? "0" + current_month : current_month;
|
||||
let current_year = date.getDate();
|
||||
current_year = current_year <= 9 ? "0" + current_year : current_year;
|
||||
|
||||
let current_time = current_hour + ":" + current_minute;
|
||||
let current_date = current_year + "." + current_month;
|
||||
currentFileName = current_time + "_" + current_date + " " + lT;
|
||||
let date = getCurrentDate();
|
||||
currentFileName = date.current_time + "_" + date.current_date + " " + lT;
|
||||
//console.log(currentFileName);
|
||||
}
|
||||
|
||||
let tF = null;
|
||||
try {
|
||||
tF = JSON.parse(retrieveData("templateFiles"));
|
||||
} catch(e) {
|
||||
tF = null;
|
||||
}
|
||||
let tF = retrieveData("templateFiles");
|
||||
const metadata = {
|
||||
ts_create: getCurrentDate(),
|
||||
ts_save: "",
|
||||
id: sha256(currentFileName),
|
||||
};
|
||||
|
||||
if (tF != null) {
|
||||
if (tF.length != 0) {
|
||||
for (let tFi of tF) {
|
||||
if (tFi.fileName == currentFileName) {return currentFileName};
|
||||
if (tFi.fileName == currentFileName) {
|
||||
tFi.metadata.ts_save = getCurrentDate();
|
||||
return currentFileName;
|
||||
}
|
||||
}
|
||||
tF.push({ fileName: currentFileName, template: lT });
|
||||
tF.push({
|
||||
fileName: currentFileName,
|
||||
template: lT,
|
||||
metadata: metadata,
|
||||
pos: tF.length - 1,
|
||||
});
|
||||
} else {
|
||||
tF = [{ fileName: currentFileName, template: lT }];
|
||||
tF = [
|
||||
{ fileName: currentFileName, template: lT, metadata: metadata, pos: 0 },
|
||||
];
|
||||
}
|
||||
storeData("templateFiles", JSON.stringify(tF));
|
||||
storeData("templateFiles", tF);
|
||||
activeState.fileName = currentFileName;
|
||||
return currentFileName;
|
||||
}
|
||||
|
||||
function obfuscate(data, mode = true) {
|
||||
if (mode) {
|
||||
return XORCipher.encode(sha256(passwordHash), data);
|
||||
} else {
|
||||
return XORCipher.decode(sha256(passwordHash), data);
|
||||
}
|
||||
if (mode) {
|
||||
return XORCipher.encode(sha256(passwordHash), data);
|
||||
} else {
|
||||
return XORCipher.decode(sha256(passwordHash), data);
|
||||
}
|
||||
}
|
||||
|
||||
function popFromTemplateFiles(fileName) {
|
||||
let tF = JSON.parse(retrieveData("templateFiles"));
|
||||
let tF = retrieveData("templateFiles");
|
||||
let newArray = [];
|
||||
for (let obj of tF) {
|
||||
if (obj.fileName != fileName) {
|
||||
newArray.push(obj);
|
||||
}
|
||||
}
|
||||
storeData("templateFiles", JSON.stringify(newArray));
|
||||
storeData("templateFiles", newArray);
|
||||
}
|
||||
|
||||
function createBookShelf() {
|
||||
let tF = JSON.parse(retrieveData("templateFiles"));
|
||||
let tF = retrieveData("templateFiles");
|
||||
let bookShelf = {};
|
||||
let date = new Date();
|
||||
let current_hour = date.getHours();
|
||||
current_hour = current_hour <= 9 ? "0" + current_hour : current_hour;
|
||||
let current_minute = date.getMinutes();
|
||||
current_minute =
|
||||
current_minute <= 9 ? "0" + current_minute : current_minute;
|
||||
let current_month = date.getMonth() + 1;
|
||||
current_month = current_month <= 9 ? "0" + current_month : current_month;
|
||||
let current_year = date.getDate();
|
||||
current_year = current_year <= 9 ? "0" + current_year : current_year;
|
||||
|
||||
let current_time = current_hour + ":" + current_minute;
|
||||
let current_date = current_year + "." + current_month;
|
||||
let saveFileName = current_time + "_" + current_date;
|
||||
let date = getCurrentDate();
|
||||
let saveFileName = date.current_time + "_" + date.current_date;
|
||||
|
||||
if (tF != null) {
|
||||
bookShelf[0] = {name: "hash", data: getUsrId(), ts: saveFileName};
|
||||
bookShelf[0] = { name: "hash", data: getUsrId(), ts: saveFileName };
|
||||
let i = 1;
|
||||
for (let tFi of tF) {
|
||||
let data = retrieveData(tFi.fileName, tFi.template);
|
||||
bookShelf[i] = {};
|
||||
bookShelf[i].name = tFi.fileName + "_m21_" + tFi.template;
|
||||
if (activeState.localOnly) {
|
||||
bookShelf[i].data = data;
|
||||
if (activeState.settings.localOnly == "true") {
|
||||
bookShelf[i].data = data;
|
||||
} else {
|
||||
bookShelf[i].data = obfuscate(data);
|
||||
}
|
||||
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
@ -197,8 +221,7 @@ function createBookShelf() {
|
||||
}
|
||||
|
||||
function importBookShelf() {
|
||||
|
||||
localStorage.clear()
|
||||
localStorage.clear();
|
||||
var xhttp = new XMLHttpRequest();
|
||||
xhttp.onreadystatechange = function () {
|
||||
if (this.readyState == 4 && this.status == 200) {
|
||||
@ -210,16 +233,52 @@ function importBookShelf() {
|
||||
let templateFilesArray = [];
|
||||
for (let file of mainArray) {
|
||||
if (file.name == "hash") continue;
|
||||
window.localStorage.setItem(sha256(file.name), file.data);
|
||||
templateFilesArray.push({ fileName: file.name.split("_m21_")[0], template: file.name.split("_m21_")[1] });
|
||||
store.setItem(sha256(file.name), file.data);
|
||||
templateFilesArray.push({
|
||||
fileName: file.name.split("_m21_")[0],
|
||||
template: file.name.split("_m21_")[1],
|
||||
});
|
||||
}
|
||||
window.localStorage.setItem(sha256("templateFiles-"), obfuscate(JSON.stringify(templateFilesArray)));
|
||||
store.setItem(
|
||||
sha256("templateFiles-"),
|
||||
obfuscate(JSON.stringify(templateFilesArray))
|
||||
);
|
||||
}
|
||||
}
|
||||
};
|
||||
xhttp.open("GET", "php/?getStoredFiles="+getUsrId(), true);
|
||||
xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
|
||||
xhttp.open("GET", "php/?getStoredFiles=" + getUsrId(), true);
|
||||
xhttp.setRequestHeader(
|
||||
"Content-type",
|
||||
"application/x-www-form-urlencoded; charset=UTF-8"
|
||||
);
|
||||
xhttp.send();
|
||||
}
|
||||
|
||||
export { createStorageObj, storeData, retrieveData, clearData, getFileName, createBookShelf, importBookShelf};
|
||||
function storeSettings(data, get = false) {
|
||||
let key = sha256("settings_m21_");
|
||||
|
||||
if (get) {
|
||||
let cdata = "";
|
||||
if (data == "getInit") {activeState.settings.persistentStorage = "true"}
|
||||
try {
|
||||
cdata = JSON.parse(obfuscate(store.getItem(key), false));
|
||||
} catch (e) {
|
||||
cdata = "";
|
||||
}
|
||||
if (data == "getInit") {activeState.settings.persistentStorage = "false"};
|
||||
return cdata;
|
||||
} else {
|
||||
store.setItem(key, obfuscate(JSON.stringify(data)));
|
||||
}
|
||||
}
|
||||
|
||||
export {
|
||||
createStorageObj,
|
||||
storeData,
|
||||
retrieveData,
|
||||
clearData,
|
||||
getFileName,
|
||||
createBookShelf,
|
||||
importBookShelf,
|
||||
storeSettings,
|
||||
};
|
||||
|
||||
@ -1,9 +1,11 @@
|
||||
import buildForm from "./form.js";
|
||||
import { loadFileDivCallBack } from "./files.js";
|
||||
import { retrieveData, clearData, getFileName, importBookShelf } from "./storage.js";
|
||||
import { insertTextBlocks, modalNotifier } from "./evts.js";
|
||||
import { retrieveData, clearData, getFileName } from "./storage.js";
|
||||
import { insertTextBlocks, modalNotifier, resetNavBar } from "./evts.js";
|
||||
import { createTemplate, createTemplateCallBack} from "./createTemplate.js";
|
||||
import { getUsrId, sessionVerification } from "./scripts.js";
|
||||
import { getUsrId, logout, passwordHash } from "./scripts.js";
|
||||
import buildSettings from "./settings.js";
|
||||
|
||||
|
||||
function loadTemplate(template, newFlag = false, loadOnly = false) {
|
||||
document.getElementById("siteTitle").innerHTML = template.replace(/_/g, " ");
|
||||
@ -18,10 +20,12 @@ function loadTemplate(template, newFlag = false, loadOnly = false) {
|
||||
document.getElementById("navMob").className = document
|
||||
.getElementById("navMob")
|
||||
.className.replace(" w3-show", "");
|
||||
|
||||
if (screen.width < 993) {
|
||||
let sidebar = document.getElementById("sidebar");
|
||||
sidebar.style.display = "none";
|
||||
document.getElementById("siteTitle").innerHTML = "TG";
|
||||
document.getElementById("logo").innerHTML = "TG";
|
||||
}
|
||||
var xhttp = new XMLHttpRequest();
|
||||
xhttp.onreadystatechange = function () {
|
||||
@ -44,21 +48,12 @@ function loadTemplate(template, newFlag = false, loadOnly = false) {
|
||||
} else {
|
||||
cdata = retrieveData("userInputForce");
|
||||
}
|
||||
if (cdata != "") {
|
||||
let res = "";
|
||||
try {
|
||||
res = JSON.parse(cdata);
|
||||
} catch (e) {
|
||||
console.log("error", cdata);
|
||||
return;
|
||||
}
|
||||
retrieveForm(res);
|
||||
if (cdata != "" || cdata == null) {
|
||||
retrieveForm(cdata);
|
||||
}
|
||||
|
||||
//select first object and focus on it
|
||||
let obj = JSON.parse(
|
||||
window.sessionStorage.getItem("templateObjectsPurified")
|
||||
);
|
||||
let obj = activeState.templateObjectsPurified;
|
||||
let firstElement = document.getElementById(obj[0].word.replace(/ /g, "_"));
|
||||
if (firstElement != null) firstElement.focus();
|
||||
|
||||
@ -71,8 +66,11 @@ function loadTemplate(template, newFlag = false, loadOnly = false) {
|
||||
|
||||
function loadNewTemplate(template) {
|
||||
|
||||
//reset navbar above all else
|
||||
resetNavBar();
|
||||
|
||||
//sessionVerfication check
|
||||
if (!sessionVerification()) {
|
||||
if (!passwordHash.verify()) {
|
||||
modalNotifier("Error: Session is not authenticated...", 0);
|
||||
}
|
||||
|
||||
@ -113,18 +111,41 @@ function loadNavBar() {
|
||||
}
|
||||
let createEntry = document.createElement("a");
|
||||
createEntry.setAttribute("href", "#");
|
||||
createEntry.setAttribute("data-template", "createNew");
|
||||
createEntry.setAttribute("data-template", "!createNew");
|
||||
createEntry.classList.add("w3-bar-item", "w3-button", "w3-padding-large");
|
||||
createEntry.style.borderTop = "2px solid rgb(221, 221, 221)";
|
||||
createEntry.innerHTML = "Manage templates";
|
||||
|
||||
divMob.appendChild(createEntry);
|
||||
|
||||
createEntry = document.createElement("a");
|
||||
createEntry.setAttribute("href", "#");
|
||||
createEntry.setAttribute("data-template", "!settings");
|
||||
createEntry.classList.add("w3-bar-item", "w3-button", "w3-padding-large");
|
||||
createEntry.innerHTML = "Settings";
|
||||
divMob.appendChild(createEntry);
|
||||
|
||||
createEntry = document.createElement("a");
|
||||
createEntry.setAttribute("href", "#");
|
||||
createEntry.setAttribute("data-template", "!logout");
|
||||
createEntry.classList.add("w3-bar-item", "w3-button", "w3-padding-large", "w3-flat-pomegranate");
|
||||
createEntry.innerHTML = "Logout";
|
||||
divMob.appendChild(createEntry);
|
||||
|
||||
divMob.addEventListener("click", (e) => {
|
||||
if (e.target && e.target.matches("a.w3-bar-item")) {
|
||||
let template = e.target.dataset.template;
|
||||
if (template == "createNew") {
|
||||
if (template == "!createNew") {
|
||||
createTemplate();
|
||||
return;
|
||||
}
|
||||
if (template == "!logout") {
|
||||
logout();
|
||||
return;
|
||||
}
|
||||
if (template == "!settings") {
|
||||
buildSettings();
|
||||
return;
|
||||
}
|
||||
loadNewTemplate(template);
|
||||
}
|
||||
});
|
||||
@ -263,6 +284,7 @@ function delStoredDataOnServer() {
|
||||
|
||||
|
||||
function retrieveForm(arr) {
|
||||
|
||||
for (let i = 0; i < arr.length; i++) {
|
||||
|
||||
let e = document.getElementById(arr[i].name);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
|
||||
var XORCipher = {
|
||||
const XORCipher = {
|
||||
encode: function (key, data, seed) {
|
||||
data = xor_encrypt(key, data, seed);
|
||||
return b64_encode(data);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user