modified: index.js
modified:   public/lib/fn.js
	new file:   public/lib/inter_temp.js
	modified:   templates.js
	new file:   views/template.ejs
	modified:   views/templates.ejs
    added templates
			
			
This commit is contained in:
		
							
								
								
									
										29
									
								
								index.js
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								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; | ||||
|  | ||||
| @ -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"); | ||||
|  | ||||
							
								
								
									
										441
									
								
								public/lib/inter_temp.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										441
									
								
								public/lib/inter_temp.js
									
									
									
									
									
										Normal file
									
								
							| @ -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 = | ||||
|                 `<div style="display:flex;"> ` + | ||||
|                     `<div id='obj_cost_name' style='font-size:calc(var(--main-font-size)/1);'>${key.split("~g~")[0].replaceAll("$"," ")}`+ | ||||
|                     `<div id='obj_cost_count'> ${Object.keys(value).length}X</div> </div>`+ | ||||
|                 `</div>`+ | ||||
|                 `<div id='obj_cost'>${parseInt(parseInt(objs_store[key]["cost"]) * Object.keys(value).length)}</div>`; | ||||
|                 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}`; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										63
									
								
								templates.js
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								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); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										661
									
								
								views/template.ejs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										661
									
								
								views/template.ejs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,661 @@ | ||||
| <%- include('./static/start.ejs',{name:proj_name,async:true}) %> | ||||
| <%- include('./header.ejs') %> | ||||
| <script src="/lib/interact.js"></script> | ||||
| <script src="/lib/html2canvas.js"></script> | ||||
| <style> | ||||
|     .drag{ | ||||
|         height: 5vw; | ||||
|         width: 5vw; | ||||
|         position: absolute; | ||||
|         text-align: center; | ||||
|         margin: auto; | ||||
|         z-index: 10; | ||||
|         touch-action: none; | ||||
|     } | ||||
|  | ||||
|     #drags{ | ||||
|         position: absolute; | ||||
|         margin: auto; | ||||
|     } | ||||
|     .spawn{ | ||||
|         object-fit: contain; | ||||
|     } | ||||
|  | ||||
|     .zones{ | ||||
|         margin-block: 10px; | ||||
|     } | ||||
|  | ||||
|     .wall { | ||||
|         /* border: dashed 4px transparent; */ | ||||
|         border-radius: 4px; | ||||
|         transition: background-color 0.3s; | ||||
|         position: absolute; | ||||
|         inset: 0px; | ||||
|         margin: 5px auto; | ||||
|         width: 400px; | ||||
|         height: 200px; | ||||
|         background-color: #fff; | ||||
|         /* background-image: url("/img/bg1red.png"); */ | ||||
|         background-size: 200px; | ||||
|         background-repeat: repeat; | ||||
|         background-position: bottom 0px left 0px; | ||||
|         border: 2px solid black; | ||||
|         /* overflow: visible; */ | ||||
|         z-index: -1; | ||||
|     } | ||||
|  | ||||
|     .createzone { | ||||
|         background-color: #bfe4ff; | ||||
|         border: dashed 4px transparent; | ||||
|         border-radius: 0.4vw; | ||||
|         height: 3vw; | ||||
|         width: 3vw; | ||||
|         margin: 10px; | ||||
|         margin-top: 0px; | ||||
|         padding: 0.8vw; | ||||
|         transition: background-color 0.3s; | ||||
|     } | ||||
|  | ||||
|     .trash { | ||||
|         background-color: #bfe4ff; | ||||
|         border: dashed 4px transparent; | ||||
|         border-radius: 4px; | ||||
|         /* margin: 10px auto 30px; */ | ||||
|         /* padding: 10px; */ | ||||
|         height: 50px; | ||||
|         width: 50px; | ||||
|         transition: background-color 0.3s; | ||||
|         text-align: center; | ||||
|         /* z-index: -1; */ | ||||
|     } | ||||
|     .czones{ | ||||
|         display: flex; | ||||
|         margin: 0px auto; | ||||
|         margin-top: 3vh; | ||||
|         /* justify-content: space-around; */ | ||||
|         flex-wrap: wrap; | ||||
|         width: 75%; | ||||
|         height: 40vh; | ||||
|         /* overflow-x: auto; */ | ||||
|     } | ||||
|  | ||||
|     .drop-active { | ||||
|         border-color: #aaa; | ||||
|     } | ||||
|  | ||||
|     /* .drop-target { | ||||
|         background-color: #29e; | ||||
|         border-color: #fff; | ||||
|         border-style: solid; | ||||
|     } */ | ||||
|  | ||||
|     #proj_top{ | ||||
|         margin: auto; | ||||
|         width: 90%; | ||||
|         display: flex; | ||||
|         justify-content: space-around; | ||||
|     } | ||||
|     #proj_name{ | ||||
|         background-color: #aaa; | ||||
|         border: 0px; | ||||
|         text-align: center; | ||||
|     } | ||||
|  | ||||
|     .inputs{ | ||||
|         display: flex; | ||||
|         width: 80vw; | ||||
|         margin: auto; | ||||
|         padding-block: 20px; | ||||
|         padding-bottom: 0px; | ||||
|         /* margin-top: 50px; */ | ||||
|     } | ||||
|     #group{ | ||||
|         display: none; | ||||
|         position: absolute; | ||||
|         padding: 0px; | ||||
|         margin: 0px; | ||||
|     } | ||||
| </style> | ||||
|  | ||||
|  | ||||
| <div id="project_menu" class="cmenu"> | ||||
|     <button id='proj_csave_btn' onclick='save_proj()'>сохранить в облако</button> <br> | ||||
|     <!-- <button id='proj_cload_btn' onclick='load_proj_cloud()'>загрузить из облака</button> <br> --> | ||||
|     <!-- <button id='proj_lsave_btn' onclick='save_proj_local()'>сохранить на локальное хранилище</button> <br> | ||||
|     <button id='proj_lload_btn' onclick='load_proj_local()'>загрузить из локальное хранилище</button> <br> --> | ||||
|     <!-- <button id='proj_del_btn' onclick='del_proj()'>удалить проект</button> <br> --> | ||||
| </div> | ||||
|  | ||||
|      | ||||
|     <!-- <div class="dropzone"></div> --> | ||||
|  | ||||
| <div class="inputs"> | ||||
|     <div id="wall_input" style="display: flex;justify-content: space-between;width: 95%;margin-left: 20px;"> | ||||
|         <div style="display: flex;width: 16vw;justify-content: space-between;"> | ||||
|             <label for="wall_height" style="margin: auto;">Высота стены</label> | ||||
|             <input type="text" id="wall_height" style="width: 5vw; text-align: center; border-radius: 0.5vw; border: 1px solid gray;" value="2" oninput="this.value = this.value.replace(/[^0-9.]/g, '0').replace(/(\..*?)\..*/g, '$1').replace(/^0[^.]/, '0');wall_size_change('height');resize_drags();">  | ||||
|             <label for="wall_width" style="margin: auto;">М.</label> | ||||
|         </div> | ||||
|         <div style="display: flex;width: 16vw;justify-content: space-between;"> | ||||
|             <label for="wall_width" style="margin: auto;">Длина стены</label> | ||||
|             <input type="text" id="wall_width" style="width: 5vw; text-align: center; border-radius: 0.5vw; border: 1px solid gray;" value="4" oninput="this.value = this.value.replace(/[^0-9.]/g, '0').replace(/(\..*?)\..*/g, '$1').replace(/^0[^.]/, '0');wall_size_change('width');resize_drags();">  | ||||
|             <label for="wall_width" style="margin: auto;">М.</label> | ||||
|         </div> | ||||
|         <div style="display: flex;width: 16vw;justify-content: space-between;"> | ||||
|             <label for="wall_color" style="margin: auto;">Цвет стены</label> | ||||
|             <input type="color" id="wall_color" style="width: 5vw; border-radius: 0.5vw; border: 1px solid gray; min-height: 3.9vw;" value="#FFFFFF" onchange="wall_color_change()">  | ||||
|         </div> | ||||
|         <div id="cost_div" style="display: flex;width: 15vw;justify-content: space-between;"> | ||||
|             <button id="proj_cost" class="menu_btn" style="width: 100%;z-index: 3;"> | ||||
|                 <div id="proj_cost_text" style="pointer-events: none;">Расчет стоимости</div> | ||||
|                 <img src="/img/drop.png" style="width: 1vw;height: 0.5vw;pointer-events: none;" alt="\/"> | ||||
|             </button> | ||||
|             <style> | ||||
|                 #cost_list li{ | ||||
|                     display: flex; | ||||
|                     justify-content: space-between; | ||||
|                     width: 14vw; | ||||
|                     padding-block: 0.4vw; | ||||
|                 } | ||||
|                 #cost_list{ | ||||
|                     list-style-type: none; | ||||
|                     padding-left: 0px; | ||||
|                     margin-top: 59px; | ||||
|                     position: absolute; | ||||
|                     width: 14vw; | ||||
|                     padding: 0.45vw; | ||||
|                 } | ||||
|             </style> | ||||
|             <ul id="cost_list" class="cmenu"> | ||||
|             </ul> | ||||
|             <!-- <div style="display: flex;"><div id="proj_cost"></div> руб.</div> --> | ||||
|         </div> | ||||
|         <!-- <div style="display: flex;width: 150px;justify-content: space-between;"> | ||||
|             <label style="margin: auto;">Расчёт стоимости</label> | ||||
|         </div> --> | ||||
|     </div> | ||||
|     <!-- <img class="trash" style="height: 100px; width: 100px;" src="/img/shadow-energy.gif" alt="чёрная дыра"> --> | ||||
| </div> | ||||
|  | ||||
| <div class="zones" style="position: relative;"> | ||||
|     <div id="drags"> | ||||
|  | ||||
|     </div> | ||||
|     <div class="wall dropzone" id="wall"></div> | ||||
| </div> | ||||
|  | ||||
| <div style="display:flex; justify-content: space-around;"></div> | ||||
|  | ||||
|  | ||||
| <div class="inputs" style="display: flex;justify-content: space-between;height: 5vh;"> | ||||
|     <div id="obj_color_div" style="justify-content: space-evenly; width: 50vw;display: none;transform: translateX(30%);"> | ||||
|         <label for="obj_colors" style="min-width: 10vw;">цвет объекта</label> | ||||
|         <div id="obj_colors" style="display: flex; width: 30vw;overflow: auto;height: 4.5vh;"></div>       | ||||
|         <!-- <input id="obj_color" type="color" onchange="obj_color_change(event)"> --> | ||||
|     </div> | ||||
| </div> | ||||
| <div class="inputs" style="display: flex;justify-content: space-between;"> | ||||
|     <style> | ||||
|         .btn_icon{ | ||||
|             border: 1px solid gray; | ||||
|             border-radius: 0.5vw; | ||||
|             padding: 0.5vw; | ||||
|             height: 2vw; | ||||
|             width: 2vw; | ||||
|             cursor: pointer; | ||||
|         } | ||||
|         .btn_icon img{ | ||||
|             height: 2vw; | ||||
|             width: 2vw; | ||||
|         } | ||||
|     </style> | ||||
|     <div style="display: flex;justify-content: space-between; width: 35vw;"> | ||||
|         <div class="btn_icon"><img src="/img/icon/copy.png" alt="copy"></div> | ||||
|         <div class="btn_icon" onclick="go_back()"><img src="/img/icon/back.png" alt="back"></div> | ||||
|         <div class="btn_icon" onclick="go_forw()"><img src="/img/icon/forw.png" alt="forw"></div> | ||||
|         <div class="btn_icon" onclick="obj_del()"><img src="/img/icon/del.png" alt="del"></div> | ||||
|         <div class="layer_changer"> | ||||
|             <div class="btn_icon layer_btn" onclick="obj_change_layer('up')"><img src="/img/icon/up.png" alt="up"></div> | ||||
|             <input id="layer_inp" type="number" oninput="obj_change_layer('inp')"> | ||||
|             <div class="btn_icon layer_btn" onclick="obj_change_layer('down')"><img src="/img/icon/down.png" alt="down"></div> | ||||
|         </div> | ||||
|         <style> | ||||
|             #layer_inp{ | ||||
|                 width: 2vw; | ||||
|                 appearance: textfield; | ||||
|                 text-align: center; | ||||
|                 border: 0px; | ||||
|             } | ||||
|             .layer_btn{ | ||||
|                 border: 0px; | ||||
|             } | ||||
|             .layer_changer{ | ||||
|                 display: flex; | ||||
|                 background-color: white; | ||||
|                 border: 1px gray solid; | ||||
|                 border-radius: 0.5vw; | ||||
|             } | ||||
|         </style> | ||||
|     </div> | ||||
|     <div style="display: flex;justify-content: space-between; width: 15vw;"> | ||||
|         <div><input type="checkbox" id="grid_checkbox" checked="true" onchange='grid_view(JSON.parse(event.target.checked));'><label for="grid_checkbox">Показывать сетку</label></div> | ||||
|     </div> | ||||
|     <div style="display: flex;justify-content: space-between; width: 7vw;"> | ||||
|         <div id="save_btn_icon" class="btn_icon" onclick="save_proj()"><img src="/img/icon/save.png" alt="save"></div> | ||||
|         <div class="btn_icon" onclick="img_download()"><img src="/img/icon/download.png" alt="load"></div> | ||||
|         <!-- <div class="btn_icon" onclick="document.getElementById('import_file').click();"><img src="/img/icon/download.png" alt="load"></div> --> | ||||
|         <!-- <input type='file' id="import_file" style="display: none;" accept="application/JSON" onchange='openFile(event,load_file)'> --> | ||||
|     </div> | ||||
| </div> | ||||
| <div class="inputs" style="display: flex;justify-content: space-between;margin-top: 0px;"> | ||||
|     <div id="obj_group" style="display: flex;justify-content:space-evenly; width: 100vw;"> | ||||
|         <!-- <button name="" id="group_drop" >Помехи на стене</button> --> | ||||
|         <style> | ||||
|             .obj_group{ | ||||
|                 /* width: 100%; */ | ||||
|                 display: flex; | ||||
|                 padding-block: 0.3vw;          | ||||
|             } | ||||
|             .obj_group label{ | ||||
|                 width: 90%; | ||||
|                 /* padding-inline: 0.3vw;          */ | ||||
|             } | ||||
|             .group_drop{ | ||||
|                 width: 15vw; | ||||
|                 padding: 2px; | ||||
|                 min-width: 15vw; | ||||
|             } | ||||
|             .group_drop *{ | ||||
|                 pointer-events: none; | ||||
|                 overflow: auto; | ||||
|             } | ||||
|             .group_drop img{ | ||||
|                 width: 1vw; | ||||
|                 height: 0.5vw; | ||||
|             } | ||||
|         </style> | ||||
|         <div id="obj_parts" style="min-width: 50vw;display: flex;justify-content: space-evenly;"> | ||||
|         </div> | ||||
|         <style> | ||||
|             .group_inp{ | ||||
|                 height: 1vw; | ||||
|                 width: 1vw; | ||||
|                 border: 0px; | ||||
|                 border-radius: 0.4vw; | ||||
|                 overflow: auto; | ||||
|             } | ||||
|         </style> | ||||
|         <ul id="group" class="cmenu"></ul> | ||||
|     </div> | ||||
| </div> | ||||
| <div class="czones"></div> | ||||
| <script src="/lib/inter_temp.js"></script> | ||||
| <script> | ||||
|     let proj_name = "<%= proj_name %>"; | ||||
|     document.getElementById("layer_inp").value = 0; | ||||
|     img_cache(()=>{}) | ||||
|  | ||||
|  | ||||
|     if ( $.cookie("grid") != null){ | ||||
|         document.getElementById("grid_checkbox").checked = JSON.parse($.cookie("grid")); | ||||
|         grid_view(JSON.parse($.cookie("grid"))) | ||||
|     }else{ | ||||
|         $.cookie("grid",true) | ||||
|         document.getElementById("grid_checkbox").checked = true; | ||||
|         grid_view(true) | ||||
|     } | ||||
|     function grid_view(check){ | ||||
|         let grid = document.getElementsByClassName("wall")[0] | ||||
|         console.log(check); | ||||
|         if (check == false) { | ||||
|             grid.style.backgroundImage = ""; | ||||
|             $.cookie("grid",false); | ||||
|  | ||||
|         } | ||||
|         else{ | ||||
|             grid.style.backgroundImage = 'url("/img/bg1red.png")'; | ||||
|             $.cookie("grid",true); | ||||
|  | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function img_download(){ | ||||
|         msg("добавить на фото стоимость?",{type:"ask",res:(out)=>{ | ||||
|             let wait_msg = msg("делаем фото",{type:"wait"}) | ||||
|             proj_img((src)=>{ | ||||
|                 msg("изображение проекта готово",{time:3}) | ||||
|                 msg_del(wait_msg.id) | ||||
|                 downloadImg(src,`${proj_name}.png`) | ||||
|             },out) | ||||
|         }}) | ||||
|     } | ||||
|  | ||||
|     function proj_img(callback,cost = false){ | ||||
|         let width = (parseInt(document.getElementById("wall").style.width)) | ||||
|         document.getElementById("drags").append(document.getElementById("wall")); | ||||
|         document.getElementById("drags").style.height = document.getElementById("wall").style.height; | ||||
|         document.getElementById("cost_list").style.left = ""; | ||||
|         Object.values(document.getElementsByClassName("spawn")).forEach((spawn)=>{ | ||||
|             spawn.src = ""; | ||||
|         }) | ||||
|         if(cost == true){ | ||||
|             width += document.getElementById("proj_cost").getBoundingClientRect().width; | ||||
|             document.getElementById("drags").append(document.getElementById("cost_div")); | ||||
|             document.getElementById("cost_div").style.marginLeft = `${parseInt(document.getElementById("wall").style.width) + 4}px`; | ||||
|             document.getElementById("cost_list").style.display = "block"; | ||||
|         } | ||||
|         html2canvas(document.getElementById("drags"),{ | ||||
|             y:7, | ||||
|             x:2, | ||||
|             width:width, | ||||
|             logging:false, | ||||
|             scale:5 | ||||
|         }).then(canvas => { | ||||
|             if(cost == true){ | ||||
|                 document.getElementById("cost_div").style.marginLeft = `0`; | ||||
|                 document.getElementById("cost_list").style.display = "none"; | ||||
|                 document.getElementById("wall_input").append(document.getElementById("cost_div")); | ||||
|             } | ||||
|             document.getElementsByClassName("zones")[0].append(document.getElementById("wall")); | ||||
|             let src = ""; | ||||
|             src = canvas.toDataURL(); | ||||
|             // console.log(src); | ||||
|             callback(src) | ||||
|             drag_start(); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     function obj_colors_load(callback) { | ||||
|         let div = document.getElementById("obj_colors"); | ||||
|         div.innerHTML = ""; | ||||
|         load_colors((colors)=>{ | ||||
|             Object.entries(colors).forEach(([key,value]) => { | ||||
|                 // console.log(value); | ||||
|                 let color_div = document.createElement("div"); | ||||
|                 color_div.style = `background-color: #${value["color"]}; border-radius: 50%;height: 2vw;min-width: 2vw;margin-inline: 0.5vw;`; | ||||
|                 color_div.classList.add("color_palette"); | ||||
|                 color_div.id=`color_${value["color"]}`; | ||||
|                 color_div.setAttribute("color",`${value["color"]}`) | ||||
|                 color_div.setAttribute("onclick",`clear_palette();document.getElementById('color_${value["color"]}').style.border = "1px blue solid";obj_color_change('${value["color"]}')`) | ||||
|                 color_div.title = `#${value["color"]}`; | ||||
|                 div.append(color_div); | ||||
|                 if(key = Object.keys(colors).at(-1)){ | ||||
|                     if(callback)callback(); | ||||
|                 } | ||||
|             }); | ||||
|         }) | ||||
|     } | ||||
|  | ||||
|     function obj_color_change(color,in_obj = null){ | ||||
|         if(color != "null"){ | ||||
|             if (proj_state == "loaded"){objs_back.push(JSON.parse(JSON.stringify(objs)));} | ||||
|             let obj = (in_obj == null)? document.getElementById(cur_obj):in_obj; | ||||
|             // console.log(color); | ||||
|             color_change(color,obj.getAttribute("data-img"),(img)=>{ | ||||
|                 obj.src = img; | ||||
|                 obj.setAttribute("color",color) | ||||
|                 objs[obj.classList[0]][obj.id]["color"] = color; | ||||
|             }); | ||||
|         } | ||||
|     }  | ||||
|  | ||||
|     function load_file(text){ | ||||
|         if (proj_state == "loaded"){objs_back.push(JSON.parse(JSON.stringify(objs)));} | ||||
|  | ||||
|         // console.log(text); | ||||
|         // console.log(objs); | ||||
|         try{ | ||||
|             objs = JSON.parse(JSON.parse(text)["body"]); | ||||
|         } | ||||
|         catch{} | ||||
|         // console.log(objs); | ||||
|         reload(); | ||||
|         // save((res)=>{ | ||||
|         //     goto(""); | ||||
|         //     // document.getElementById('top_panel_center').innerHTML=`сохранено ${proj_name} в облако`; | ||||
|         // },false)     | ||||
|     } | ||||
|  | ||||
|     function go_back(){ | ||||
|         if(objs_back.length > 0){ | ||||
|             objs_forw.push(objs); | ||||
|             objs = objs_back.at(-1); | ||||
|             objs_back.pop(); | ||||
|             reload(); | ||||
|             calc_total(); | ||||
|         } | ||||
|     } | ||||
|     function go_forw(){ | ||||
|         if(objs_forw.length > 0){ | ||||
|             objs_back.push(objs); | ||||
|             objs = objs_forw.at(-1); | ||||
|             objs_forw.pop(); | ||||
|             reload(); | ||||
|             calc_total(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function obj_change_layer(type) { | ||||
|         let obj = document.getElementById(cur_obj); | ||||
|         if(obj != null){ | ||||
|             let cur_layer = obj.style.zIndex; | ||||
|             if (type == "up" && cur_layer < 9999){ | ||||
|                 objs[obj.classList[0]][obj.getAttribute("id")].layer = parseInt(cur_layer) + 1; | ||||
|                 obj.style.zIndex = parseInt(cur_layer) + 1; | ||||
|                 document.getElementById("layer_inp").value = parseInt(cur_layer) + 1; | ||||
|             } else if (type == "down" && cur_layer > 0){ | ||||
|                 objs[obj.classList[0]][obj.getAttribute("id")].layer = parseInt(cur_layer) - 1; | ||||
|                 obj.style.zIndex = parseInt(cur_layer) - 1; | ||||
|                 document.getElementById("layer_inp").value = parseInt(cur_layer) - 1; | ||||
|             } | ||||
|             else if ((type == "inp")){ | ||||
|                 let inp_val = parseInt(document.getElementById("layer_inp").value); | ||||
|                 if(inp_val >= 0 && inp_val < 9999){ | ||||
|                     objs[obj.classList[0]][obj.getAttribute("id")].layer = inp_val; | ||||
|                     obj.style.zIndex = inp_val; | ||||
|                 } | ||||
|                 else{ | ||||
|                     document.getElementById("layer_inp").value = cur_layer; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         // console.log(objs[obj.classList[0]][obj.getAttribute("id")]); | ||||
|     } | ||||
|  | ||||
|     function obj_del(){ | ||||
|        if (proj_state == "loaded"){objs_back.push(JSON.parse(JSON.stringify(objs)));} | ||||
|        document.getElementById("layer_inp").value = 0; | ||||
|  | ||||
|        try{ | ||||
|         let drag = document.getElementById(cur_obj); | ||||
|         if(drag.id != "none"){ | ||||
|             console.log(cur_obj); | ||||
|             // console.log(drag.classList); | ||||
|             if(objs[drag.classList[0]] != null&&objs[drag.classList[0]][drag.id] != null) { | ||||
|                 console.log(objs[drag.classList[0]]); | ||||
|                 delete objs[drag.classList[0]][drag.id]; | ||||
|                 if (Object.keys(objs[drag.classList[0]]).length < 1){ | ||||
|                     delete objs[drag.classList[0]]; | ||||
|                 } | ||||
|             } | ||||
|             calc_total() | ||||
|             drag.remove(); | ||||
|             document.getElementById("obj_color_div").style.display = "none"; | ||||
|             cur_obj = null; | ||||
|         } | ||||
|        } | ||||
|        catch{msg("объект не выбран")} | ||||
|     } | ||||
|  | ||||
|     function group_drop(){ | ||||
|         let e = document.getElementById("group_drop") | ||||
|         setTimeout(()=>{ | ||||
|             document.getElementById("group").style.display = "block"; | ||||
|             // document.getElementById("group").style.left = document.getElementById("group_drop").getBoundingClientRect().left; | ||||
|             let childs = document.getElementById("group").getElementsByTagName("input"); | ||||
|             let i = 0; | ||||
|             Object.entries(childs).forEach(([key,value]) => { | ||||
|                 console.log(key,value); | ||||
|                 if(value.checked == true){ | ||||
|                     get_objs(value) | ||||
|                     i++; | ||||
|                 } | ||||
|                 if (i==0){ | ||||
|                     // document.getElementsByClassName("czones")[0].innerHTML = ""; | ||||
|                     drag_start() | ||||
|                     // e.removeChild(e.getElementsByClassName(value)) | ||||
|                 } | ||||
|             }); | ||||
|         },1) | ||||
|     } | ||||
|  | ||||
|     load_parts((db)=>{ | ||||
|         let parts = document.getElementById("obj_parts"); | ||||
|         Object.values(db).forEach((value)=>{ | ||||
|             let part = document.createElement("button") | ||||
|             let part_text = document.createElement("div") | ||||
|             let part_drop = document.createElement("img") | ||||
|              | ||||
|             part_drop.src = "/img/drop.png"; | ||||
|             part_drop.alt = "\/"; | ||||
|  | ||||
|             part_text.innerText = `${value["name"].replaceAll("$", " ")}`; | ||||
|  | ||||
|             part.id = `group_drop-${value["id"]}`; | ||||
|             part.classList.add("menu_btn") | ||||
|             part.classList.add("group_drop") | ||||
|             part.setAttribute("groups",`${value["groups"]}`) | ||||
|             part.setAttribute("count",`${value["count"]}`) | ||||
|             part.setAttribute("no-cost",`${value["no-cost"]}`) | ||||
|             part.setAttribute("pid",`${value["id"]}`) | ||||
|  | ||||
|             part.append(part_text); | ||||
|             part.append(part_drop); | ||||
|  | ||||
|             parts.append(part); | ||||
|             console.log(value); | ||||
|         }) | ||||
|     }) | ||||
|      | ||||
|     // function cost_drop(id){ | ||||
|     //     // let e = document.getElementById("cost") | ||||
|     //     // setTimeout(()=>{ | ||||
|     //     //     document.getElementById("group").style.display = "block"; | ||||
|     //     //     // document.getElementById("group").style.left = document.getElementById("group_drop").getBoundingClientRect().left; | ||||
|     //     //     let childs = document.getElementById("group").getElementsByTagName("input"); | ||||
|     //     //     let i = 0; | ||||
|     //     //     Object.entries(childs).forEach(([key,value]) => { | ||||
|     //     //         console.log(key,value); | ||||
|     //     //         if(value.checked == true){ | ||||
|     //     //             get_objs(value) | ||||
|     //     //             i++; | ||||
|     //     //         } | ||||
|     //     //         if (i==0){ | ||||
|     //     //             document.getElementsByClassName("czones")[0].innerHTML = ""; | ||||
|     //     //             drag_start() | ||||
|     //     //             // e.removeChild(e.getElementsByClassName(value)) | ||||
|     //     //         } | ||||
|     //     //     }); | ||||
|     //     // },1) | ||||
|     // } | ||||
|  | ||||
|     function wall_color_change(){ | ||||
|        if (proj_state == "loaded"){objs_back.push(JSON.parse(JSON.stringify(objs)));} | ||||
|  | ||||
|         let wall = document.getElementById("wall") | ||||
|         let color = document.getElementById("wall_color") | ||||
|         wall.style.backgroundColor = color.value; | ||||
|         objs["color"] = color.value; | ||||
|     } | ||||
|  | ||||
|     function gids_change(){ | ||||
|         get_objs(); | ||||
|         drag_start() | ||||
|     } | ||||
|  | ||||
|     function get_groups(callback){ | ||||
|         // let select = document.getElementById("group"); | ||||
|         // let name = select.options[select.selectedIndex].text; | ||||
|         load_groups(callback(),gids); | ||||
|         // callback(); | ||||
|         // $.post( "/get_groups") | ||||
|         // .done(function( res ) { | ||||
|         //     if(res["out"] == "good"){ | ||||
|         //         // select.innerHTML = ""; | ||||
|         //         res["body"].forEach(group => { | ||||
|         //             console.log(group); | ||||
|         //             let gd = document.createElement("div"); | ||||
|         //             let group_div = document.createElement("input"); | ||||
|         //             let label = document.createElement("label"); | ||||
|  | ||||
|         //             group_div.style.cursor = "pointer"; | ||||
|         //             label.style.cursor = "pointer"; | ||||
|         //             // group_div.style.pointerEvents = "none"; | ||||
|         //             // label.style.pointerEvents = "none"; | ||||
|  | ||||
|         //             group_div.setAttribute("type","checkbox"); | ||||
|         //             group_div.setAttribute("onchange","group_drop()"); | ||||
|         //             label.setAttribute("for",`obj_group_${group["id"]}`); | ||||
|         //             label.innerText = group["name"].replace("$"," "); | ||||
|         //             // gd.innerText = group["name"].replace("$"," "); | ||||
|         //             group_div.setAttribute("group_count",group["count"]); | ||||
|         //             group_div.setAttribute("gid",group["id"]); | ||||
|         //             group_div.id = `obj_group_${group["id"]}`; | ||||
|         //             group_div.classList.add("group_inp"); | ||||
|         //             gd.append(group_div); | ||||
|         //             gd.append(label); | ||||
|         //             select.append(gd); | ||||
|         //             // select.append(label); | ||||
|         //             if(group["id"] == res["body"].at(-1)["id"]){ | ||||
|         //                 if(callback)callback(); | ||||
|         //             } | ||||
|         //         }); | ||||
|         //     } | ||||
|         //     // callback(res); | ||||
|         // }); | ||||
|     } | ||||
|     // get_groups(()=>{ | ||||
|         // get_objs(); | ||||
|         load_proj_cloud(); | ||||
|     // }); | ||||
|     function get_objs(group_div){ | ||||
|         document.getElementsByClassName("czones")[0].innerHTML = ""; | ||||
|         gids.forEach(group => { | ||||
|             load_objs((data)=>{ | ||||
|                 data.forEach(value => { | ||||
|                     let czones = document.getElementsByClassName("czones")[0]; | ||||
|                     let czone =  document.createElement('div'); | ||||
|                     czone.classList.add(value["name"]); | ||||
|                     czone.classList.add("createzone"); | ||||
|                     czones.append(czone)     | ||||
|                 }); | ||||
|                 drag_start() | ||||
|             },group) | ||||
|         }); | ||||
|         drag_start() | ||||
|     } | ||||
|  | ||||
|  | ||||
|     // console.log(proj_name); | ||||
|     // let menu = document.getElementById("project_menu"); | ||||
|     // document.getElementById("top_panel_left").innerHTML = `<div id='proj_menu' class="menu_btn">настройки проекта</div>`; | ||||
|      | ||||
|  | ||||
|     function save_proj(){ | ||||
|         // document.getElementById('top_panel_center').innerHTML=`сохранение ${proj_name}`; | ||||
|         let wait_msg = msg("идёт сохранение проекта",{type:"wait"}); | ||||
|         save((res)=>{ | ||||
|             msg_del(wait_msg.id); | ||||
|             msg("проект сохранён") | ||||
|             // document.getElementById('top_panel_center').innerHTML=`сохранено ${proj_name} в облако`; | ||||
|         }) | ||||
|     } | ||||
|     // drag_start(); | ||||
|     // console.log(px_ratio); | ||||
|     $(window).resize(function(){isZooming();}); | ||||
|  | ||||
|     function isZooming(){ | ||||
|         resize_drags(); | ||||
|     } | ||||
| </script> | ||||
| <%- include('./static/end.ejs',{soc:true}) %> | ||||
| @ -4,7 +4,7 @@ | ||||
| <style> | ||||
|     .t_img{ | ||||
|         /* pointer-events: none; */ | ||||
|         height: 200px; | ||||
|         height: 250px; | ||||
|         border-radius: 10px; | ||||
|         width: 290px; | ||||
|         box-shadow: 0px 4px 4px 0px #00000040; | ||||
| @ -40,13 +40,58 @@ | ||||
|         padding: 0px; | ||||
|         margin-top: 10px; | ||||
|     } | ||||
|     .temp_group_drop{ | ||||
|         display: flex; | ||||
|         /* width: 100%; */ | ||||
|         justify-content: space-between; | ||||
|         border: 1px gray solid; | ||||
|         border-radius: 0.5vw; | ||||
|         padding: 1vw; | ||||
|     } | ||||
|     .temp_group_drop div{ | ||||
|         /* display: flex; */ | ||||
|         width: 100%; | ||||
|         /* justify-content: space-between; */ | ||||
|         margin: auto; | ||||
|     } | ||||
|     .temp_group_list{ | ||||
|         display: flex; | ||||
|     } | ||||
|     .temp_group_div{ | ||||
|         margin-block: 6vh; | ||||
|     } | ||||
|     .temp_div{ | ||||
|         display: block; | ||||
|         padding: 1vw; | ||||
|         width: 15vw; | ||||
|     } | ||||
|     .temp_desc{ | ||||
|         padding: 0.5vw; | ||||
|     } | ||||
|     .temp_btn{ | ||||
|         margin: auto; | ||||
|         display: flex; | ||||
|     } | ||||
|     .admin_panel{ | ||||
|         display: flex; | ||||
|         justify-content: flex-end; | ||||
|     } | ||||
|     .admin_panel img{ | ||||
|         margin: 0.5vw; | ||||
|         width:24px; | ||||
|         height:24px; | ||||
|     } | ||||
| </style> | ||||
| <!-- <script src="/lib/interact.min.js"></script> --> | ||||
|  | ||||
| <section class="main"> | ||||
|     <div id="temp_div"> | ||||
|          | ||||
|     <!-- <div id="temp_group_div-0" class="temp_group_div"> | ||||
|         <div class="temp_group_drop" id="temp_group_drop-0"  onclick="temp_group_drop('0')"> | ||||
|             <div style="text-align: center;">Городская среда </div> | ||||
|             <img style="width: 1.5vw; height: 1.5vh; margin: auto;" src="/img/drop.png" alt=""> | ||||
|         </div> | ||||
|         <div class="temp_group_list" id="temp_group_list-0" ></div> | ||||
|     </div> --> | ||||
| </section> | ||||
|  | ||||
| <!-- <script src="/lib/inter.js"></script> --> | ||||
| @ -55,11 +100,185 @@ | ||||
|  | ||||
| <%- include('./static/end.ejs',{soc:true}) %> | ||||
| <script> | ||||
|     setTimeout(()=>{loaded()},500); | ||||
|     admin["temp"] = ()=>{ | ||||
|     setTimeout(()=>{loaded();load_temp_groups()},500); | ||||
|  | ||||
|         document.getElementById("temp_div").innerHTML += ` | ||||
|         <button onclick="new_temp()" class="new_temp"><img class="t_img" src="/img/new_proj.png" alt=""><h1>Новый проект</h1></button> | ||||
|         ` | ||||
|     function load_temp_groups(){ | ||||
|         $.post( "/template/group/loads") | ||||
|         .done(function( res ) { | ||||
|             console.log(res); | ||||
|             Object.values(res["body"]).forEach(group => { | ||||
|                 let temp_group_div = document.createElement("div"); | ||||
|                 let temp_group_drop = document.createElement("div"); | ||||
|                 let temp_group_list = document.createElement("div"); | ||||
|                 let name = document.createElement("div"); | ||||
|                 let img = document.createElement("img"); | ||||
|  | ||||
|                 temp_group_div.id = `temp_group_div-${group["id"]}`; | ||||
|                 temp_group_drop.id = `temp_group_drop-${group["id"]}`; | ||||
|                 temp_group_list.id = `temp_group_list-${group["id"]}`; | ||||
|  | ||||
|                 temp_group_div.classList.add(`temp_group_div`); | ||||
|                 temp_group_drop.classList.add(`temp_group_drop`); | ||||
|                 temp_group_list.classList.add(`temp_group_list`); | ||||
|  | ||||
|                 temp_group_drop.setAttribute("onclick", `temp_group_drop('${group["id"]}')`) | ||||
|  | ||||
|                 img.style = "width: 1.5vw; height: 1.5vh; margin: auto;"; | ||||
|                 name.style = "text-align: center;"; | ||||
|                 name.innerText = group["name"]; | ||||
|                 img.src = "/img/drop.png"; | ||||
|  | ||||
|                 temp_group_drop.append(name) | ||||
|                 temp_group_drop.append(img) | ||||
|  | ||||
|  | ||||
|                 temp_group_div.append(temp_group_drop); | ||||
|                 temp_group_div.append(temp_group_list); | ||||
|                 document.getElementsByClassName("main")[0].append(temp_group_div); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     function groups_close(){ | ||||
|         Object.values(document.getElementsByClassName("temp_group_list")).forEach(element => { | ||||
|             element.innerHTML = ""; | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     function temp_group_drop(gid){ | ||||
|         groups_close() | ||||
|         let temp_group_div = document.getElementById(`temp_group_div-${gid}`); | ||||
|         let temp_group_list = document.getElementById(`temp_group_list-${gid}`); | ||||
|         temp_group_list.innerHTML = ""; | ||||
|         $.post( "/template/loads",{gid:gid}) | ||||
|         .done(function( res ) { | ||||
|             console.log(res); | ||||
|             if(Object.values(res["body"]).length > 0){ | ||||
|                 Object.values(res["body"]).forEach(temp => { | ||||
|                     let div = document.createElement("div"); | ||||
|                     let name = document.createElement("div"); | ||||
|                     let cost = document.createElement("div"); | ||||
|                     let desc = document.createElement("div"); | ||||
|                     let use_btn = document.createElement("button"); | ||||
|  | ||||
|                     desc.classList.add("temp_desc") | ||||
|  | ||||
|                     div.classList.add("temp_div") | ||||
|                     div.id = `temp-${temp["id"]}`; | ||||
|  | ||||
|                     div.innerHTML = `<img class="t_img" src="${temp["img"]}" alt="">` | ||||
|                     name.innerText = `Название: ${temp["name"]}`; | ||||
|                     cost.innerText = `цена: ${JSON.parse(temp["body"])["total"]}`; | ||||
|                     use_btn.innerText = "Использовать шаблон"; | ||||
|                     use_btn.setAttribute("onclick", `copy_temp("${temp['name']}")`); | ||||
|                     use_btn.classList.add("btn_blue") | ||||
|                     use_btn.classList.add("temp_btn") | ||||
|  | ||||
|                     if(globalThis._admin_){ | ||||
|                         let admin_div = document.createElement("div"); | ||||
|  | ||||
|                         let edit_btn = document.createElement("img"); | ||||
|                         edit_btn.setAttribute("onclick",`goto("/template/load/${temp["name"]}");`) | ||||
|                         edit_btn.src = "/img/icon/edit.svg" | ||||
|                         admin_div.append(edit_btn) | ||||
|  | ||||
|                         let del_btn = document.createElement("img"); | ||||
|                         del_btn.setAttribute("onclick",`del_proj("${temp["name"]}")`) | ||||
|                         del_btn.src = "/img/icon/del.png" | ||||
|                         admin_div.append(del_btn) | ||||
|  | ||||
|                         admin_div.classList.add("admin_panel") | ||||
|                         div.append(admin_div) | ||||
|                     } | ||||
|  | ||||
|                     desc.append(name) | ||||
|                     desc.append(cost) | ||||
|                     div.append(desc) | ||||
|                     div.append(use_btn) | ||||
|                     temp_group_list.append(div) | ||||
|                 }); | ||||
|                 if(globalThis._admin_){ | ||||
|                     let div = document.createElement("div"); | ||||
|                     let use_btn = document.createElement("button"); | ||||
|                     let name = document.createElement("div"); | ||||
|                     div.classList.add("temp_div") | ||||
|  | ||||
|                     div.innerHTML = `<img class="t_img" src="/img/new_proj.png" onclick='new_temp(null,${gid})'>` | ||||
|                     name.innerText = "новый шаблон"; | ||||
|                     name.style.textAlign = "center"; | ||||
|  | ||||
|                     div.append(name) | ||||
|                     temp_group_list.append(div)             | ||||
|                 } | ||||
|             } | ||||
|             else{ | ||||
|                 if(globalThis._admin_){ | ||||
|                     let div = document.createElement("div"); | ||||
|                     let use_btn = document.createElement("button"); | ||||
|                     let name = document.createElement("div"); | ||||
|                     div.classList.add("temp_div") | ||||
|  | ||||
|                     div.innerHTML = `<img class="t_img" src="/img/new_proj.png" onclick='new_temp(null,${gid})'>` | ||||
|                     name.innerText = "новый шаблон"; | ||||
|                     name.style.textAlign = "center"; | ||||
|  | ||||
|                     div.append(name) | ||||
|                     temp_group_list.append(div)             | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|     } | ||||
|  | ||||
|  | ||||
|     function copy_temp(temp){ | ||||
|         $.post( "/template/get",{name:temp}) | ||||
|         .done(function( res ) { | ||||
|             if(res["out"] == "good"){ | ||||
|                 let name = ask("Введите название копии проекта ",{func:(name)=>{ | ||||
|                     if(name != null && name!= "" && name!=" " && typeof name != "undefined" && name!="undefined"){ | ||||
|                         $.post( "/save_proj", {proj:res["body"],name:name,img:"/img/placeholder.png"}) | ||||
|                         .done(function( res ) { | ||||
|                             if(res["out"] == "good"){ | ||||
|                                 goto(`/proj/load/${name}`); | ||||
|                             } | ||||
|                             else if(res["out"] == "bad" && res["err"] == "proj"){ | ||||
|                                 msg("Проект уже существует") | ||||
|                             } | ||||
|                         }) | ||||
|                     } | ||||
|                 }}); | ||||
|             } | ||||
|         }) | ||||
|     } | ||||
|  | ||||
|     function new_temp(objs = null,gid){ | ||||
|         msg("название нового шаблона",{type:"enter",res:(out)=>{ | ||||
|             name = out; | ||||
|             objs = (objs == null)? { height:"2",width:"4"}:objs; | ||||
|             if(name != null && name!= "" && name!=" " && typeof name != "undefined" && name!="undefined"){ | ||||
|                 $.post( "/template/save/", {proj:JSON.stringify(objs),name:name,img:"/img/placeholder.png",gid}) | ||||
|                 .done(function( res ) { | ||||
|                     if(res["out"] == "good"){ | ||||
|                         goto(`/template/load/${out}`); | ||||
|                     } | ||||
|                     else if(res["out"] == "bad" && res["err"] == "proj"){ | ||||
|                         msg("Проект уже существует") | ||||
|                     } | ||||
|                 }) | ||||
|             } | ||||
|         }}) | ||||
|     } | ||||
|  | ||||
|     function del_proj(proj_name){ | ||||
|         msg(`удалить шаблон ${proj_name}?`,{type:"ask",res:(out)=>{ | ||||
|             if(out){ | ||||
|                 $.post( "/admin/template/delete",{name:proj_name}) | ||||
|                 .done(function( res ) { | ||||
|                     if(res["out"] == "good"){ | ||||
|                         goto("/temp") | ||||
|                     } | ||||
|                 }) | ||||
|             } | ||||
|         }}) | ||||
|     } | ||||
| </script> | ||||
		Reference in New Issue
	
	Block a user