diff --git a/index.js b/index.js index a36ca76..db963c1 100644 --- a/index.js +++ b/index.js @@ -346,7 +346,18 @@ app.post("/admin/users/find", (req,res) => {try{ // templates -app.post('/admin/template/save', (req, res) => {try{ +app.get("/template/load/:name" , (req,res) =>{ + res.render('template',{proj_name:req.params["name"]}); +}) +app.post("/template/get", (req,res) => {try{ + let inp = req.body; + let cook = req.cookies; + func.sid(cook,res,()=>{ + templates.load(inp,cook,res); + }) +} catch (error) {route_err({req:req,error:error});} +}) +app.post('/template/save', (req, res) => {try{ let inp = req.body; let cook = req.cookies; func.sid(cook,res,()=>{ @@ -362,6 +373,14 @@ app.post("/admin/template/rename", (req,res) => {try{ },true,true) } catch (error) {route_err({req:req,error:error});} }) +app.post("/template/group/loads", (req,res) => {try{ + let inp = req.body; + let cook = req.cookies; + func.sid(cook,res,()=>{ + templates.load_groups(inp,cook,res); + },true,true) +} catch (error) {route_err({req:req,error:error});} +}) app.post("/admin/template/delete", (req,res) => {try{ let inp = req.body; let cook = req.cookies; @@ -370,14 +389,6 @@ app.post("/admin/template/delete", (req,res) => {try{ },true,true) } catch (error) {route_err({req:req,error:error});} }) -app.post("/template/load", (req,res) => {try{ - let inp = req.body; - let cook = req.cookies; - func.sid(cook,res,()=>{ - templates.load(inp,cook,res); - }) -} catch (error) {route_err({req:req,error:error});} -}) app.post("/template/loads", (req,res) => {try{ let inp = req.body; let cook = req.cookies; diff --git a/public/lib/fn.js b/public/lib/fn.js index 1257f80..b96c2f2 100644 --- a/public/lib/fn.js +++ b/public/lib/fn.js @@ -361,26 +361,26 @@ async function removeImageBackground(image) { } } - $.post( "/get_objs") - .done(function( res ) { - if(res["out"] == "good"){ - // console.log(res["body"]); - let sources = []; - res["body"].forEach(element => { - sources.push(element["img"]); - if(element == res["body"].at(-1)){ - // console.log(sources); - preloadImages(sources,()=>{ - // console.log("cached"); - callback(); - sources.forEach(element => { - console.log(element,is_cached(element)); - }); - }) - } - }); - } - }); + // $.post( "/get_objs") + // .done(function( res ) { + // if(res["out"] == "good"){ + // // console.log(res["body"]); + // let sources = []; + // res["body"].forEach(element => { + // sources.push(element["img"]); + // if(element == res["body"].at(-1)){ + // // console.log(sources); + // preloadImages(sources,()=>{ + // // console.log("cached"); + // callback(); + // // sources.forEach(element => { + // // console.log(element,is_cached(element)); + // // }); + // }) + // } + // }); + // } + // }); function is_cached(img_url){ var imgEle = document.createElement("img"); diff --git a/public/lib/inter_temp.js b/public/lib/inter_temp.js new file mode 100644 index 0000000..c6b901e --- /dev/null +++ b/public/lib/inter_temp.js @@ -0,0 +1,441 @@ +window.dragMoveListener = dragMoveListener; +let root = document.getElementById("drags"); +let objs = { height:"2",width:"4",color:"#FFFFFF"}; +let objs_store = {}; +let proj_from = "cloud"; +let cur_obj; +let objs_back = []; +let objs_forw = []; +let proj_state = "loading"; +let cm_mod = 2; + +function create(clas,x,y,color = null,id,size,layer = 0){ + let main_clas = clas.split(" ")[0]; + // if (body == null || body == "") body = "[]"; + let obj = document.createElement("img"); + obj.id = id; + obj.alt = id; + clas= clas.split(" "); + clas.forEach(cl => { + obj.classList.add(cl); + }); + get_obj(main_clas,(db_data)=>{ + // console.log(db_data); + // console.log(db_data); + // db_data.forEach(db_data => { + // }); + if (db_data == null) { + delete objs[main_clas]; + reload(); + // if(proj_from == "cloud"){ + // // save(()=>{ + // // // goto("/proj/load/"+proj_name); + // // },false); + // } + // else if (proj_from == "local"){ + // save_local(); + // load_proj_local(); + // } + } + else if (db_data != null){ + make(objs_store[main_clas]["img"]) + } + function make(img){ + // console.log(db_data); + obj.src = img; + obj.title = `${db_data["name"].replaceAll("$"," ").split("~g")[0]}\nцена:${db_data["cost"]}\nширина:${db_data["width"]}см высота:${db_data["height"]}см`; + obj.setAttribute("cost",db_data["cost"]) + obj.setAttribute("colors",Boolean(db_data["colors"])) + obj.setAttribute("data-img",img) + obj.setAttribute("gid",db_data["gid"]) + obj.setAttribute("pid",db_data["pid"]) + obj.setAttribute("color",color) + // drag.transform = `translate(${drag.getAttribute("data-y")}px, ${drag.getAttribute("data-y")}px) scale(${db_data["width"] * cm_mod} ${db_data["height"] * cm_mod})`; + if(size){ + obj.style.width = `${db_data["width"] * cm_mod}px`; + obj.style.height = `${db_data["height"] * cm_mod}px`; + } + if (color != null){ + obj_color_change(color,obj) + } + } + calc_total(); + }) + obj.setAttribute("decoding","async"); + obj.setAttribute("loading","lazy"); + if(id != "none"){obj.setAttribute("onclick",`obj_click("${id}")`);} + // console.log(main_clas); + if(main_clas.split("~p~").at(-1) == "Бизиборды"){ + obj.setAttribute("layer",9999); + obj.style.zIndex = 9999; + } + else{ + obj.setAttribute("layer",layer); + obj.style.zIndex = layer; + } + root.append(obj); + set_pos(obj,x,y); +} + +function obj_click(id){ + if (cur_obj != id){ + let obj = document.getElementById(id); + + let cur_layer = obj.style.zIndex; + + cur_obj = id; + if(cur_layer=="9999"){ + document.getElementsByClassName("layer_changer")[0].style.pointerEvents = "none"; + document.getElementById("layer_inp").value = "-"; + } + else{ + document.getElementsByClassName("layer_changer")[0].style.pointerEvents = "all"; + document.getElementById("layer_inp").value = cur_layer; + } + + if (obj.getAttribute("colors") == "true"){ + clear_palette(); + obj_colors_load(()=>{ + document.getElementById("obj_color_div").style.display = "flex"; + if( document.getElementById(`color_${obj.getAttribute("color")}`) != null){ + document.getElementById(`color_${obj.getAttribute("color")}`).style.border = "1px blue solid" + } + }); + } + else{ + document.getElementById("obj_color_div").style.display = "none"; + } + obj_selection(); + // console.log(obj.); + } + function obj_selection(){ + let drags = document.getElementsByClassName("drag"); + Object.values(drags).forEach(element => { + // console.log(element.id,cur_obj); + if (element.id != cur_obj){ + element.style.border = "0px"; + } + else{ + element.style.border = "2px black solid"; + element.style.borderRadius = "0.2vw"; + } + }); + } +} + +function resize_drags(){ + document.getElementById('drags').setAttribute("data-x",document.getElementsByClassName("wall")[0].getBoundingClientRect().left.toString()+"px"); + document.getElementById('drags').style.left = document.getElementsByClassName("wall")[0].getBoundingClientRect().left.toString()+"px"; + document.getElementById('drags').style.width = document.getElementsByClassName("wall")[0].style.width; + document.getElementsByClassName("zones")[0].style.height = document.getElementsByClassName("wall")[0].style.height; + drag_start(); +} + +function wall_size_change(type,value = null){ + if (proj_state == "loaded"){objs_back.push(JSON.parse(JSON.stringify(objs)));} + + let wall = document.getElementsByClassName("wall")[0]; + let drags = document.getElementById("drags"); + let scroll; + if(type != null && type == "width") { + if (value == null) scroll = parseFloat(document.getElementById("wall_width").value); + else if (value != null) scroll = value; + // document.getElementById("wall_width_value").innerHTML = (Math.ceil((parseFloat(scroll)+0.1)*10)/ 10); + // document.getElementById("wall_width_value").innerHTML = `${scroll}м`; + + // console.log(scroll); + wall.style.width = `${(scroll * 100) * cm_mod}px`; + wall.style.left = drags.getBoundingClientRect().left; + objs["width"] = scroll; + } + if(type != null && type == "height") { + if (value == null) scroll = parseFloat(document.getElementById("wall_height").value); + else if (value != null) scroll = value; + // document.getElementById("wall_height_value").innerHTML = (Math.ceil((parseFloat(scroll)+0.1)*10)/ 10); + // document.getElementById("wall_height_value").innerHTML = `${scroll}м`; + + // console.log(scroll); + wall.style.height = `${(scroll * 100) * cm_mod}px`; + objs["height"] = scroll; + } +} + +function calc_total(start = false){ + document.getElementById("cost_list").innerHTML = "" + if (start) { + document.getElementById("proj_cost_text").innerText = `Стоимость: ${objs["total"]} руб.`; + return; + } + let total=0; + Object.entries(objs).forEach(([key,value]) => { + // console.log(key); + if(key != "height"&&key!="width"&key!="total"){ + // console.log(Object.keys(value).length); + // console.log(objs_store[key]); + if(objs_store[key] != null && objs_store[key]["cost"] > 0 && JSON.parse(document.getElementById(`group_drop-${objs_store[key]["pid"]}`).getAttribute("no-cost")) == false){ + // console.log(key,value); + total += parseInt(parseInt(objs_store[key]["cost"]) * Object.keys(value).length); + let obj_cost_div = document.createElement("li"); + obj_cost_div.innerHTML = + `
` + + `
${key.split("~g~")[0].replaceAll("$"," ")}`+ + `
 ${Object.keys(value).length}X
`+ + `
`+ + `
${parseInt(parseInt(objs_store[key]["cost"]) * Object.keys(value).length)}
`; + document.getElementById("cost_list").append(obj_cost_div); + } + } + // console.log(Object.keys(objs).at(-1)); + }); + // return total; + + objs["total"] = total; + document.getElementById("proj_cost_text").innerText = `стоимость: ${total} руб.`; +} + +function load(objss){ + proj_state = "loading"; + // objs = JSON.parse($.cookie("objs")); + // console.log(objs); + objs = objss; + Object.entries(objs).forEach(([keys, values]) => { + // console.log(keys,values); + if (keys != "width" && keys != "height" && keys != "color" && keys != "grided"){ + Object.entries(values).forEach(([key, value]) => { + if(key != "class"){ + // console.log(key,keys); + // console.log(keys,value["x"],value["y"],value["body"]); + // let count = Object.keys(objs[keys]).length; + // console.log(count); + create(keys+" drag",value["x"],value["y"],value["color"],key,true,value["layer"]); + } + }) + } + else { + document.getElementById(`wall_${keys}`).value = values; + wall_size_change(keys,values); + // document.getElementById("drags").style.left = $(".dropzone")[0].getBoundingClientRect().x; + } + + if (keys == "color"){ + document.getElementById("wall").style.backgroundColor = values; + } + if (keys == Object.keys(objs).at(-1)){ + proj_state = "loaded"; + loaded(); + } + }); + resize_drags(); +} +function reload(save = false){ + // objs = JSON.parse($.cookie("objs")); + // console.log(objs); + document.getElementById("drags").innerHTML = ""; + load(objs); + if(save){save(()=>{},false)} +} + +function load_proj_cloud(){ + proj_from = "cloud"; + document.getElementById("drags").innerHTML = ""; + // document.getElementById("top_panel_center").innerText = `загрузка ${proj_name} из облака`; + $.post( "/template/get",{name:proj_name}) + .done(function( res ) { + if(res["out"] == "good"){ + // console.log("good"); + // console.log(JSON.parse(`'${res["body"]}'`)); + // console.log(JSON.parse(res["body"])); + // $.cookie("objs",res["body"]); + load(JSON.parse(res["body"])); + // document.getElementById("top_panel_center").innerText = `${proj_name} (облако)`; + } + else if(res["out"] == "bad proj"){ + // console.log("bad"); + save(()=>{ + goto("/template/load"+proj_name); + },false); + } + }) +} + +function save(callback,with_pic = true){ + // console.log(objs); + proj_from = "cloud"; + if(with_pic){ + proj_img((src)=>{ + make_save(src); + }) + } + else{ + make_save(); + } + function make_save(src = "img/img_placeholder.webp"){ + $.post( "/template/save", {proj:JSON.stringify(objs),name:proj_name,img:src}) + .done(function( res ) { + if(res["out"] == "good"){ + // console.log(scr) + // console.log("good"); + if(callback) callback(res); + } + }) + } +} + +function load_objs(callback,group){ + // let select = document.getElementById("group_select"); + // console.log(group); + $.post( "/get_objs",{gid:group}) + .done(function( res ) { + if(res["out"] == "good"){ + // console.log(res["body"]); + res["body"].forEach(element => { + objs_store[`${element["name"]}`] = {img:element["img"],height:element["height"],width:element["width"],id:element["id"],name:element["name"],cost:element["cost"],colors:element["colors"],gid:element["gid"],pid:element["pid"]} + }); + callback(res["body"]); + } + }); +} + +function get_obj(clas,callback){ + if(objs_store[clas] != null){ + callback(objs_store[clas]); + } + else{ + load_objs(()=>{ + callback(objs_store[clas]); + }) + } +} + +function load_obj(name,key,callback){ + $.post( "/get_obj",{name:name,key:key}) + .done(function( res ) { + if(res["out"] == "good"){ + // console.log(res["body"]); + callback(res["body"]); + } + }); +} + +function dragMoveListener (event) { + var drag = event.target + if(drag.id != "none"){obj_click(drag.id)} + var x = (parseFloat(drag.getAttribute('data-x')) || 0) + event.dx + var y = (parseFloat(drag.getAttribute('data-y')) || 0) + event.dy + set_pos(drag,x,y); +} + let dragzone = document.getElementsByClassName('wall')[0]; +interact('.drag').draggable({ + inertia: true, + modifiers: [ + interact.modifiers.restrictRect({restriction: dragzone,endOnly: true,elementRect:{ left: 0.15, right: 0.85, top: 0, bottom: 1 }}), + interact.modifiers.snap({targets: [interact.snappers.grid({ x: cm_mod, y: cm_mod })],range: Infinity,relativePoints: [ { x: 0, y: 0 } ]}), + ], + autoScroll: true, + listeners: {move: dragMoveListener, end (event) {}} +}) + +// interact('.trash').dropzone({ +// accept: '.drag', +// overlap: 0.2, + +// ondragenter: function (event) {var drag = event.relatedTarget;var zone = event.target; + +// // console.log(drag.classList); +// if(objs[drag.classList[0]] != null&&objs[drag.classList[0]][drag.id] != null) { +// delete objs[drag.classList[0]][drag.id]; +// } +// calc_total() + +// zone.classList.add('drop-target');drag.classList.add('can-drop'); +// drag.remove(); +// }, +// ondragleave: function (event) {var drag = event.relatedTarget;var zone = event.target;zone.classList.remove('drop-target');drag.classList.remove('in_zone');drag.classList.remove('can-drop');}, +// ondrop: function (event) {var drag = event.relatedTarget; +// // console.log(drag.id); +// // console.log(objs); +// drag.classList.add('in_zone');drag.classList.remove('can-drop'); +// }, +// ondropdeactivate: function (event) {var zone = event.target;zone.classList.remove('drop-active');zone.classList.remove('drop-target');} +// }) + +interact('.dropzone').dropzone({ + accept: '.drag', + overlap: 0.5, + + ondragenter: function (event) {var drag = event.relatedTarget;var zone = event.target; + + if (objs[drag.classList[0]] == null){ + objs[drag.classList[0]] = {}; + } + if(drag.id == "none") drag.id = get_id(drag.classList[0]); + if (objs[drag.classList[0]][drag.id] == null){ + objs[drag.classList[0]][drag.id] = {}; + drag.setAttribute("onclick",`obj_click("${drag.id}")`); + calc_total() + } + zone.classList.add('drop-target');drag.classList.add('can-drop'); + }, + ondragleave: function (event) {var drag = event.relatedTarget;var zone = event.target;zone.classList.remove('drop-target');drag.classList.remove('in_zone');drag.classList.remove('can-drop');}, + ondrop: function (event) {var drag = event.relatedTarget + + if (proj_state == "loaded"){objs_back.push(JSON.parse(JSON.stringify(objs)));} + objs[drag.classList[0]][drag.id] = {y:drag.getAttribute('data-y'),x:drag.getAttribute('data-x'),body:drag.innerHTML,color:drag.getAttribute("color"),layer:drag.getAttribute('layer')}; + drag.classList.add('in_zone');drag.classList.remove('can-drop'); + // console.log(objs["KeyBoard~g~не$основное"]["KeyBoard~g~не$основное_1"]); + + }, + ondropdeactivate: function (event) {var zone = event.target;zone.classList.remove('drop-active');zone.classList.remove('drop-target');} +}) + +interact('.createzone').dropzone({ + accept: '.spawn', + overlap: 0.2, + + ondragenter: function (event) {var drag = event.relatedTarget;var zone = event.target; + zone.classList.add('drop-target');drag.classList.add('can-drop'); + }, + ondragleave: function (event) {var drag = event.relatedTarget;var zone = event.target; + + if(drag.classList[1] == "spawn" && drag.classList[0] == zone.classList[0]){ + get_obj(drag.classList[0],(db_data)=>{ + // drag.transform = `translate(${drag.getAttribute("data-y")}px, ${drag.getAttribute("data-y")}px) scale(${db_data["width"] * cm_mod} ${db_data["height"] * cm_mod})`; + drag.style.width = `${db_data["width"] * cm_mod}px`; + drag.style.height = `${db_data["height"] * cm_mod}px`; + + // console.log(db_data); + }) + let x = zone.getBoundingClientRect().left - document.getElementById("drags").getBoundingClientRect().left; + let y = zone.getBoundingClientRect().top - document.getElementById("drags").getBoundingClientRect().top; + create(`${zone.classList[0]} spawn drag`,x,y,null,`none`,false,0); + if (proj_state == "loaded"){objs_back.push(JSON.parse(JSON.stringify(objs)));} + drag.classList.remove('spawn'); + } + zone.classList.remove('drop-target'); + }, + ondrop: function (event) {var drag = event.relatedTarget; + drag.classList.remove('in_zone');drag.classList.remove('can-drop');}, + ondropdeactivate: function (event) {var zone = event.target; + zone.classList.remove('drop-active');zone.classList.remove('drop-target');} +}) + +function drag_start() { + let spawns = document.getElementsByClassName("spawn"); + Object.entries(spawns).forEach(([key, spawn]) => { + spawn.parentElement.removeChild(spawn); + }); + let zones = document.getElementsByClassName("createzone"); + Object.entries(zones).forEach(([key, zone]) => { + let x = zone.getBoundingClientRect().left - document.getElementById("drags").getBoundingClientRect().left; + let y = zone.getBoundingClientRect().top - document.getElementById("drags").getBoundingClientRect().top; + create(`${zone.classList[0]} spawn drag`,x,y,null,`none`,false,0); + }); +} + +function get_id(clas){ + if(objs[clas] == null){ return `${clas}_0`} + else{ + let count = Object.keys(objs[clas]).length; + return `${clas}_${count}`; + } +} \ No newline at end of file diff --git a/templates.js b/templates.js index 3ef12bd..e0cf294 100644 --- a/templates.js +++ b/templates.js @@ -5,9 +5,9 @@ const vars = require('./vars'); module.exports.load = (inp,cook,res)=>{ try { - db.gv("projects","id",inp["id"],(pdata)=>{pdata = pdata[0]; + db.gv("templates","name",`'${inp["name"]}'`,(pdata)=>{pdata = pdata[0]; + console.log(pdata); if (pdata != null){ - func.log(`good boy ${cook["uuid"]} loaded project ${pdata["name"]}`); res.send({out:"good",body:pdata["body"]}); } else{ @@ -15,72 +15,93 @@ module.exports.load = (inp,cook,res)=>{ } }) } catch (error) { - func.log("backend project loading error - "); + func.log("backend template loading error - "); + } +} + +module.exports.load_all = (inp,cook,res)=>{ + try { + db.gav("templates","0",(pdata)=>{ + res.send({out:"good",body:pdata}); + }) + } catch (error) { + func.log("backend templates loading err0r - " - error); } } module.exports.loads = (inp,cook,res)=>{ try { - db.gav("projects","0",(pdata)=>{ + db.gv("templates",'gid',`${inp["gid"]}`,(pdata)=>{ res.send({out:"good",body:pdata}); }) } catch (error) { - func.log("backend projects loading err0r - " - error); + func.log("backend templates loading err0r - " - error); + } +} + + +module.exports.load_groups = (inp,cook,res)=>{ + try { + db.gav("template_groups","0",(pdata)=>{ + res.send({out:"good",body:pdata}); + }) + } catch (error) { + func.log("backend templates loading err0r - " - error); } } module.exports.rename = (inp,cook,res)=>{ try { - db.gv("projects","`id`",`'${inp["id"]}'`,(proj_name)=>{ proj_name = proj_name[0]; + db.gv("templates","`id`",`'${inp["id"]}'`,(proj_name)=>{ proj_name = proj_name[0]; // console.log(proj_name); if(proj_name == null){ - db.sv("projects","name",`${inp["name"]}`,"id",`${inp["id"]}`, (db)=>{ + db.sv("templates","name",`${inp["name"]}`,"id",`${inp["id"]}`, (db)=>{ res.send({out:"good"}); }) } }) } catch (error) { - func.log("backend projects loading err0r - " - error); + func.log("backend templates loading err0r - " - error); } } module.exports.del = (inp,cook,res)=>{ try { - db.gv("projects","id",`'${inp["id"]}'`,(pdata)=>{pdata=pdata[0] + db.gv("templates","name",`'${inp["name"]}'`,(pdata)=>{pdata=pdata[0] // res.send({out:"good",body:pdata}); if(pdata != null){ - db.dl("projects","id",pdata["id"],()=>{ + db.dl("templates","id",pdata["id"],()=>{ res.send({out:"good"}); func.log(`good boy ${cook["uuid"]} deleted project ${inp["name"]}`); - }) + },true) } else{ res.send({out:"bad"}); } }) } catch (error) { - func.log("backend projects delete err0r - " - error); + func.log("backend templates delete err0r - " - error); } } module.exports.save = (inp,cook,res)=>{ try { - db.gv("projects","id",`'${inp["id"]}'`,(pdata)=>{pdata = pdata[0] + db.gv("templates","name",`'${inp["name"]}'`,(pdata)=>{pdata = pdata[0] var date = moment().format('YYYY-MM-DD'); var time = moment().format('hh:mm:ss'); if(pdata == null){ // func.log("proj not in"); // func.log(pname,udata["id"],proj); - func.log(`good boy ${cook["uuid"]} created project ${inp["name"]}`); - db.nr("projects","`name`,`body`,`img`,creation_date",`'${inp["name"]}','${inp["proj"]}','${inp["img"]}','${date+"T"+time}'`,true); + func.log(`good boy ${cook["uuid"]} created template ${inp["name"]}`); + db.nr("templates","`name`,`body`,`img`,`creation_date`,`gid`",`'${inp["name"]}','${inp["proj"]}','${inp["img"]}','${date+"T"+time}','${inp["gid"]}'`,true); res.send({out:"good"}); } else if (pdata != null){ if(inp["proj"] != JSON.stringify({height:"2",width:"4"})){ - db.gv("projects","id",pdata["id"],(projin)=>{projin = projin[0] - db.sv("projects","body",inp["proj"],"id",projin["id"],()=>{},true); - db.sv("projects","last_change_date",`${date+"T"+time}`,"id",projin["id"],()=>{},true); - if(inp["img"] != "") db.sv("projects","img",inp["img"],"id",projin["id"],()=>{}); - func.log(`good boy ${cook["uuid"]} saved project ${projin["name"]}`); + db.gv("templates","id",pdata["id"],(projin)=>{projin = projin[0] + db.sv("templates","body",inp["proj"],"id",projin["id"],()=>{},true); + db.sv("templates","last_change_date",`${date+"T"+time}`,"id",projin["id"],()=>{},true); + if(inp["img"] != "") db.sv("templates","img",inp["img"],"id",projin["id"],()=>{},true); + func.log(`good boy ${cook["uuid"]} saved template ${projin["name"]}`); // func.log("proj in"); res.send({out:"good"}); }) @@ -91,6 +112,6 @@ module.exports.save = (inp,cook,res)=>{ } }) } catch (error) { - func.log("backend project saving err0r - "+error); + func.log("backend templates saving err0r - "+error); } } \ No newline at end of file diff --git a/views/template.ejs b/views/template.ejs new file mode 100644 index 0000000..c144093 --- /dev/null +++ b/views/template.ejs @@ -0,0 +1,661 @@ +<%- include('./static/start.ejs',{name:proj_name,async:true}) %> +<%- include('./header.ejs') %> + + + + + +
+
+ + + +
+ + + + +
+
+
+ + + +
+
+ + + +
+
+ + +
+
+ + +
    +
+ +
+ +
+ +
+ +
+
+ +
+
+
+ +
+ + +
+ +
+
+ +
+
copy
+
back
+
forw
+
del
+
+
up
+ +
down
+
+ +
+
+
+
+
+
save
+
load
+ + +
+
+
+
+ + +
+
+ + +
+
+
+ + +<%- include('./static/end.ejs',{soc:true}) %> \ No newline at end of file diff --git a/views/templates.ejs b/views/templates.ejs index 1353903..46b0317 100644 --- a/views/templates.ejs +++ b/views/templates.ejs @@ -4,7 +4,7 @@
-
- -
+
@@ -55,11 +100,185 @@ <%- include('./static/end.ejs',{soc:true}) %> \ No newline at end of file