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:
parent
88b6403ced
commit
cf9658c0cd
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>
|
||||
<!-- <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>
|
Loading…
Reference in New Issue
Block a user