create export feature in editor

This commit is contained in:
Michi 2024-11-11 20:14:19 +01:00
parent 4845a4a3a6
commit 5fe8d3adb4
2 changed files with 80 additions and 6 deletions

View file

@ -26,11 +26,24 @@ fileInput.addEventListener("change", (event) => {
reader.readAsText(file); reader.readAsText(file);
}); });
// add step // export guide button
const exportBtn = document.getElementById("exportBtn");
exportBtn.addEventListener('click', function(){
exportGuide();
});
// share guide button
const shareBtn = document.getElementById("shareBtn");
shareBtn.addEventListener('click', function(){
alert("Coming soon...")
});
// add step button
const addStepBtn = document.getElementById("addStepBtn"); const addStepBtn = document.getElementById("addStepBtn");
addStepBtn.addEventListener('click', function(){ addStepBtn.addEventListener('click', function(){
const stepsContainer = document.getElementById("stepsContainer"); const stepsContainer = document.getElementById("stepsContainer");
stepsContainer.append(createStepElement("Title", "Description", "../logo/mockup-viewer-editor.jpg")); stepsContainer.append(createStepElement("Title", "Description", "../logo/mockup-viewer-editor.jpg", "note", ""));
}); });
// render guide with steps // render guide with steps
@ -49,16 +62,20 @@ function loadGuide(data){
const stepsContainer = document.getElementById("stepsContainer"); const stepsContainer = document.getElementById("stepsContainer");
for (const step of steps){ for (const step of steps){
const element = createStepElement(step.label, step.description, step.image); const element = createStepElement(step.label, step.description, step.image, step.action, step.element);
stepsContainer.append(element); stepsContainer.append(element);
} }
} }
function createStepElement(label, description, imgSrc){ function createStepElement(label, description, imgSrc, triggerAction, triggerElement){
// create container // create container
const container = document.createElement("div"); const container = document.createElement("div");
container.classList = "step"; container.classList = "step";
// add attributes
container.dataset.triggerAction = triggerAction;
container.dataset.triggerElement = triggerElement;
// create container for text & image // create container for text & image
const textContainer = document.createElement("div"); const textContainer = document.createElement("div");
const imgContainer = document.createElement("div"); const imgContainer = document.createElement("div");
@ -84,4 +101,61 @@ function createStepElement(label, description, imgSrc){
// return step element // return step element
return container; return container;
}
// export guide
function exportGuide(){
// get metadata
const guideTitle = document.getElementById("guideTitle");
const guideDescription = document.getElementById("guideDescription");
const guideAuthor = document.getElementById("guideAuthor");
// generate file structure
const dateToday = new Date().toISOString().split('T')[0];
let guide = {
"title":guideTitle.textContent,
"description":guideDescription.textContent,
"date":dateToday,
"author":guideAuthor.textContent,
};
let guideSteps = [];
// add steps to array
const steps = document.getElementsByClassName("step");
for (const step of steps){
const stepObject = {
"label":step.querySelector("h2").textContent,
"description":step.querySelector("p").textContent,
"action":step.dataset.triggerAction,
"element":step.dataset.triggerElement,
"image":step.querySelector("img").src
}
guideSteps.push(stepObject);
}
// add steps to guide object
guide.steps = guideSteps;
// export guide
exportJSON(guide, "guide.json");
}
// export json file
function exportJSON(object, filename){
try{
const json = JSON.stringify(object, null, 2);
const blob = new Blob([json], { type: "application/json" });
const url = URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = url;
link.download = filename;
link.click();
URL.revokeObjectURL(url);
}
catch(error){
return error
}
} }

View file

@ -31,7 +31,7 @@
<input id="file-import-input" type="file" accept=".json"> <input id="file-import-input" type="file" accept=".json">
<p>Import</p> <p>Import</p>
</button> </button>
<button class="toolBtn"> <button id="exportBtn" class="toolBtn">
<span class="material-symbols-outlined">download</span> <span class="material-symbols-outlined">download</span>
<p>Export</p> <p>Export</p>
</button> </button>
@ -39,7 +39,7 @@
<span class="material-symbols-outlined">print</span> <span class="material-symbols-outlined">print</span>
<p>Print</p> <p>Print</p>
</button> </button>
<button class="toolBtn"> <button id="shareBtn" class="toolBtn">
<span class="material-symbols-outlined">share</span> <span class="material-symbols-outlined">share</span>
<p>Share link</p> <p>Share link</p>
</button> </button>