diff --git a/db.js b/db.js
index 2e70bae..84aad41 100644
--- a/db.js
+++ b/db.js
@@ -1,6 +1,6 @@
const mysql = require('mysql');
const vars = require('./vars');
-const db_host = "db";
+const db_host = "localhost";
const admin = mysql.createConnection({
host: db_host,
diff --git a/index.js b/index.js
index b5b20cb..f9ee8bb 100644
--- a/index.js
+++ b/index.js
@@ -203,6 +203,14 @@ app.get("/admin", (req,res) =>{try {
},true,true)
} catch (error) {route_err({req:req,error:error});}
});
+app.get("/admin/group_object", (req,res) =>{try {
+ let inp = req.body;
+ let cook = req.cookies;
+ func.sid(cook,res,(rights)=>{
+ res.render('admin/objects/group_object');
+ },true,true)
+} catch (error) {route_err({req:req,error:error});}
+});
app.get("/admin/:type", (req,res) =>{try {
let inp = req.body;
let cook = req.cookies;
@@ -213,7 +221,7 @@ app.get("/admin/:type", (req,res) =>{try {
else if ((req.params["type"] == "users") && (rights == 2 || rights == 3)){
res.render('admin/users');
}
- else{res.redirect('/admin');}
+ // else{res.redirect('/admin');}
},true,true)
} catch (error) {route_err({req:req,error:error});}
});
@@ -221,6 +229,26 @@ app.get("/get_logs", (req,res) => {
try{let cook = req.cookies;func.sid(cook,res,()=>{func.logs_file(res);})}
catch (error) {route_err({req:req,error:error});}
})
+app.post("/admin/object/grouped/save", (req,res) => {
+ try{
+ let inp = req.body;
+ let cook = req.cookies;
+ // func.log(inp["name"]);
+ func.sid(cook,res,()=>{
+ obj.save_grouped(inp,cook,res);
+ },true,true)
+ } catch (error) {route_err({req:req,error:error});}
+})
+app.post("/admin/object/grouped/load", (req,res) => {
+ try{
+ let inp = req.body;
+ let cook = req.cookies;
+ // func.log(inp["name"]);
+ func.sid(cook,res,()=>{
+ obj.load_grouped(inp,cook,res);
+ },true,true)
+ } catch (error) {route_err({req:req,error:error});}
+})
app.post("/admin/colors/new", (req,res) => {try{
let inp = req.body;
let cook = req.cookies;
diff --git a/object.js b/object.js
index e758ba5..5e0c177 100644
--- a/object.js
+++ b/object.js
@@ -11,7 +11,7 @@ module.exports.loads = (inp,cook,res)=>{
let gin
if (typeof inp["gid"] == 'undefined' || inp["gid"] == null) gin = "1 OR 1=1"
else gin = inp["gid"]
- db.ggv("objects","`name`,`id`,`height`,`width`,`cost`,`gid`,`colors`,`pid`,`img`","gid",`${gin}`,(odata)=>{
+ db.ggv("objects","`name`,`id`,`height`,`width`,`cost`,`gid`,`colors`,`grouped`,`pid`,`img`","gid",`${gin}`,(odata)=>{
// func.log(odata);
res.send({out:"good",body:odata});
})
@@ -35,6 +35,7 @@ module.exports.load = (inp,cook,res)=>{
module.exports.new = (inp,cook,res)=>{
try {
if (typeof inp["colors"] != 'undefined'){inp["colors"] = (inp["colors"] == "false")? 0:1;}
+ if (typeof inp["grouped"] != 'undefined'){inp["grouped"] = (inp["grouped"] == "false")? 0:1;}
db.gv("object_groups","id",`'${inp["gid"]}'`,(gname)=>{gname = gname[0]
db.gv("object_partition","id",`'${gname["pid"]}'`,(pname)=>{pname = pname[0]
save_img(inp["img"],`${inp["name"]}~g~${gname["name"]}~p~${pname["name"]}`,(img_path)=>{
@@ -43,7 +44,7 @@ module.exports.new = (inp,cook,res)=>{
res.send({out:"bad",err:"name"});
}
else if (db_name[0] == null){
- db.nr("objects","`cost`,`name`,`img`,`height`,`width`,`gid`,`colors`,`pid`",`'${inp["cost"]}','${inp["name"]}~g~${gname["name"]}~p~${pname["name"]}','${img_path}','${inp["height"]}','${inp["width"]}','${inp["gid"]}','${inp["colors"]}','${gname["pid"]}'`,true);
+ db.nr("objects","`cost`,`name`,`img`,`height`,`width`,`gid`,`colors`,`grouped`,`pid`",`'${inp["cost"]}','${inp["name"]}~g~${gname["name"]}~p~${pname["name"]}','${img_path}','${inp["height"]}','${inp["width"]}','${inp["gid"]}','${inp["colors"]}','${inp["grouped"]}','${gname["pid"]}'`,true);
db.sv("object_groups","count",`(count + 1)`,"id",inp["gid"],()=>{},true,true)
func.log(`admin object created name:${inp["name"]} group:${gname["name"]}`);
res.send({out:"good"});
@@ -105,12 +106,37 @@ module.exports.load_colors = (inp,cook,res)=>{
}
}
+module.exports.save_grouped = (inp,cook,res)=>{
+ try {
+ db.sv("objects","group_obj",inp["json"],"id",inp["id"],()=>{
+ let img = imageDataURI.decode(inp["data"]);
+ if (!fs.existsSync(`public/img/object/${inp["name"]}`)){fs.mkdirSync(`public/img/object/${inp["name"]}`);}
+ fs.writeFile(`public/img/object/${inp["name"]}/main.${img.imageType.split("/").at(-1)}`, img.dataBuffer,()=>{
+ res.send({body:"good"})
+ });
+ },true)
+ } catch (error) {
+ func.log("backend object creating error - "+error);
+ }
+}
+module.exports.load_grouped = (inp,cook,res)=>{
+ try {
+ db.ggv("objects","group_obj","id",`'${inp["id"]}'`,(odata)=>{
+ // func.log(odata);
+ res.send({out:"good",body:odata[0]});
+ },true)
+ } catch (error) {
+ func.log("backend object creating error - "+error);
+ }
+}
+
module.exports.save = (inp,cook,res)=>{
try {
// let changed = [];
let changes = JSON.parse(inp["changes"]);
let taken_name = false;
if (typeof changes["colors"] != 'undefined'){changes["colors"] = (changes["colors"] == "false")? 0:1;}
+ if (typeof changes["grouped"] != 'undefined'){changes["grouped"] = (changes["grouped"] == "false")? 0:1;}
// console.log(changes);
Object.entries(changes).forEach(([key,value]) => {
// console.log(key,value);
diff --git a/public/lib/fn.js b/public/lib/fn.js
index b96c2f2..f735a5d 100644
--- a/public/lib/fn.js
+++ b/public/lib/fn.js
@@ -363,6 +363,7 @@ async function removeImageBackground(image) {
// $.post( "/get_objs")
// .done(function( res ) {
+ // let wait_msg = msg("загрузка изображений",{type:"wait"})
// if(res["out"] == "good"){
// // console.log(res["body"]);
// let sources = [];
@@ -373,6 +374,7 @@ async function removeImageBackground(image) {
// preloadImages(sources,()=>{
// // console.log("cached");
// callback();
+ // msg_del(wait_msg.id)
// // sources.forEach(element => {
// // console.log(element,is_cached(element));
// // });
diff --git a/public/lib/inter_group_object.js b/public/lib/inter_group_object.js
new file mode 100644
index 0000000..12fcde5
--- /dev/null
+++ b/public/lib/inter_group_object.js
@@ -0,0 +1,443 @@
+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(clear = false){
+ cur_obj = (clear == true)? null:cur_obj;
+ let drags = document.getElementsByClassName("drag");
+ Object.values(drags).forEach(element => {
+ // console.log(element.id,cur_obj);
+ if (element.id != cur_obj){
+ element.style.border = "0px";
+ }
+ else{
+ element.style.border = "2px black solid";
+ element.style.borderRadius = "0.2vw";
+ }
+ });
+}
+
+function resize_drags(){
+ document.getElementById('drags').setAttribute("data-x",document.getElementsByClassName("wall")[0].getBoundingClientRect().left.toString()+"px");
+ document.getElementById('drags').style.left = document.getElementsByClassName("wall")[0].getBoundingClientRect().left.toString()+"px";
+ document.getElementById('drags').style.width = document.getElementsByClassName("wall")[0].style.width;
+ document.getElementsByClassName("zones")[0].style.height = document.getElementsByClassName("wall")[0].style.height;
+ drag_start();
+}
+
+function wall_size_change(type,value = null){
+ if (proj_state == "loaded"){objs_back.push(JSON.parse(JSON.stringify(objs)));}
+
+ let wall = document.getElementsByClassName("wall")[0];
+ let drags = document.getElementById("drags");
+ let scroll;
+ if(type != null && type == "width") {
+ if (value == null) scroll = parseFloat(document.getElementById("wall_width").value);
+ else if (value != null) scroll = value;
+ // document.getElementById("wall_width_value").innerHTML = (Math.ceil((parseFloat(scroll)+0.1)*10)/ 10);
+ // document.getElementById("wall_width_value").innerHTML = `${scroll}м`;
+
+ // console.log(scroll);
+ wall.style.width = `${(scroll * 100) * cm_mod}px`;
+ wall.style.left = drags.getBoundingClientRect().left;
+ objs["width"] = scroll;
+ }
+ if(type != null && type == "height") {
+ if (value == null) scroll = parseFloat(document.getElementById("wall_height").value);
+ else if (value != null) scroll = value;
+ // document.getElementById("wall_height_value").innerHTML = (Math.ceil((parseFloat(scroll)+0.1)*10)/ 10);
+ // document.getElementById("wall_height_value").innerHTML = `${scroll}м`;
+
+ // console.log(scroll);
+ wall.style.height = `${(scroll * 100) * cm_mod}px`;
+ objs["height"] = scroll;
+ }
+}
+
+function calc_total(start = false){
+ document.getElementById("cost_list").innerHTML = ""
+ if (start) {
+ document.getElementById("proj_cost_text").innerText = `Стоимость: ${objs["total"]} руб.`;
+ return;
+ }
+ let total=0;
+ Object.entries(objs).forEach(([key,value]) => {
+ // console.log(key);
+ if(key != "height"&&key!="width"&key!="total"){
+ // console.log(Object.keys(value).length);
+ // console.log(objs_store[key]);
+ if(objs_store[key] != null && objs_store[key]["cost"] > 0 && JSON.parse(document.getElementById(`group_drop-${objs_store[key]["pid"]}`).getAttribute("no-cost")) == false){
+ // console.log(key,value);
+ total += parseInt(parseInt(objs_store[key]["cost"]) * Object.keys(value).length);
+ let obj_cost_div = document.createElement("li");
+ obj_cost_div.innerHTML =
+ `
` +
+ `
${key.split("~g~")[0].replaceAll("$"," ")}`+
+ `
 ${Object.keys(value).length}X
`+
+ `
`+
+ `${parseInt(parseInt(objs_store[key]["cost"]) * Object.keys(value).length)}
`;
+ document.getElementById("cost_list").append(obj_cost_div);
+ }
+ }
+ // console.log(Object.keys(objs).at(-1));
+ });
+ // return total;
+
+ objs["total"] = total;
+ document.getElementById("proj_cost_text").innerText = `стоимость: ${total} руб.`;
+}
+
+function load(objss){
+ proj_state = "loading";
+ // objs = JSON.parse($.cookie("objs"));
+ // console.log(objs);
+ objs = objss;
+ Object.entries(objs).forEach(([keys, values]) => {
+ // console.log(keys,values);
+ if (keys != "width" && keys != "height" && keys != "color" && keys != "grided"){
+ Object.entries(values).forEach(([key, value]) => {
+ if(key != "class"){
+ // console.log(key,keys);
+ // console.log(keys,value["x"],value["y"],value["body"]);
+ // let count = Object.keys(objs[keys]).length;
+ // console.log(count);
+ create(keys+" drag",value["x"],value["y"],value["color"],key,true,value["layer"]);
+ }
+ })
+ }
+ else {
+ document.getElementById(`wall_${keys}`).value = values;
+ wall_size_change(keys,values);
+ // document.getElementById("drags").style.left = $(".dropzone")[0].getBoundingClientRect().x;
+ }
+
+ if (keys == "color"){
+ document.getElementById("wall").style.backgroundColor = values;
+ }
+ if (keys == Object.keys(objs).at(-1)){
+ proj_state = "loaded";
+ loaded();
+ }
+ });
+ resize_drags();
+}
+function reload(save = false){
+ // objs = JSON.parse($.cookie("objs"));
+ // console.log(objs);
+ document.getElementById("drags").innerHTML = "";
+ load(objs);
+ if(save){save(()=>{},false)}
+}
+
+// function load_proj_cloud(){
+// proj_from = "cloud";
+// document.getElementById("drags").innerHTML = "";
+// // document.getElementById("top_panel_center").innerText = `загрузка ${proj_name} из облака`;
+// $.post( "/load_proj",{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("/proj/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( "/save_proj", {proj:JSON.stringify(objs),name:proj_name,img:src})
+// .done(function( res ) {
+// if(res["out"] == "good"){
+// // console.log(scr)
+// // console.log("good");
+// if(callback) callback(res);
+// }
+// })
+// }
+// }
+
+function load_objs(callback,group){
+ // let select = document.getElementById("group_select");
+ // console.log(group);
+ $.post( "/get_objs",{gid:group})
+ .done(function( res ) {
+ if(res["out"] == "good"){
+ // console.log(res["body"]);
+ res["body"].forEach(element => {
+ objs_store[`${element["name"]}`] = {img:element["img"],height:element["height"],width:element["width"],id:element["id"],name:element["name"],cost:element["cost"],colors:element["colors"],gid:element["gid"],pid:element["pid"]}
+ });
+ callback(res["body"]);
+ }
+ });
+}
+
+function get_obj(clas,callback){
+ if(objs_store[clas] != null){
+ callback(objs_store[clas]);
+ }
+ else{
+ load_objs(()=>{
+ callback(objs_store[clas]);
+ })
+ }
+}
+
+function load_obj(name,key,callback){
+ $.post( "/get_obj",{name:name,key:key})
+ .done(function( res ) {
+ if(res["out"] == "good"){
+ // console.log(res["body"]);
+ callback(res["body"]);
+ }
+ });
+}
+
+function dragMoveListener (event) {
+ var drag = event.target
+ if(drag.id != "none"){obj_click(drag.id)}
+ var x = (parseFloat(drag.getAttribute('data-x')) || 0) + event.dx
+ var y = (parseFloat(drag.getAttribute('data-y')) || 0) + event.dy
+ set_pos(drag,x,y);
+}
+ let dragzone = document.getElementsByClassName('wall')[0];
+interact('.drag').draggable({
+ inertia: true,
+ modifiers: [
+ interact.modifiers.restrictRect({restriction: dragzone,endOnly: true,elementRect:{ left: 0.15, right: 0.85, top: 0, bottom: 1 }}),
+ interact.modifiers.snap({targets: [interact.snappers.grid({ x: cm_mod, y: cm_mod })],range: Infinity,relativePoints: [ { x: 0, y: 0 } ]}),
+ ],
+ autoScroll: true,
+ listeners: {move: dragMoveListener, end (event) {}}
+})
+
+// interact('.trash').dropzone({
+// accept: '.drag',
+// overlap: 0.2,
+
+// ondragenter: function (event) {var drag = event.relatedTarget;var zone = event.target;
+
+// // console.log(drag.classList);
+// if(objs[drag.classList[0]] != null&&objs[drag.classList[0]][drag.id] != null) {
+// delete objs[drag.classList[0]][drag.id];
+// }
+// calc_total()
+
+// zone.classList.add('drop-target');drag.classList.add('can-drop');
+// drag.remove();
+// },
+// ondragleave: function (event) {var drag = event.relatedTarget;var zone = event.target;zone.classList.remove('drop-target');drag.classList.remove('in_zone');drag.classList.remove('can-drop');},
+// ondrop: function (event) {var drag = event.relatedTarget;
+// // console.log(drag.id);
+// // console.log(objs);
+// drag.classList.add('in_zone');drag.classList.remove('can-drop');
+// },
+// ondropdeactivate: function (event) {var zone = event.target;zone.classList.remove('drop-active');zone.classList.remove('drop-target');}
+// })
+
+interact('.dropzone').dropzone({
+ accept: '.drag',
+ overlap: 0.5,
+
+ ondragenter: function (event) {var drag = event.relatedTarget;var zone = event.target;
+
+ if (objs[drag.classList[0]] == null){
+ objs[drag.classList[0]] = {};
+ }
+ if(drag.id == "none") drag.id = get_id(drag.classList[0]);
+ if (objs[drag.classList[0]][drag.id] == null){
+ objs[drag.classList[0]][drag.id] = {};
+ drag.setAttribute("onclick",`obj_click("${drag.id}")`);
+ calc_total()
+ }
+ zone.classList.add('drop-target');drag.classList.add('can-drop');
+ },
+ ondragleave: function (event) {var drag = event.relatedTarget;var zone = event.target;zone.classList.remove('drop-target');drag.classList.remove('in_zone');drag.classList.remove('can-drop');},
+ ondrop: function (event) {var drag = event.relatedTarget
+
+ if (proj_state == "loaded"){objs_back.push(JSON.parse(JSON.stringify(objs)));}
+ objs[drag.classList[0]][drag.id] = {y:drag.getAttribute('data-y'),x:drag.getAttribute('data-x'),body:drag.innerHTML,color:drag.getAttribute("color"),layer:drag.getAttribute('layer')};
+ drag.classList.add('in_zone');drag.classList.remove('can-drop');
+ // console.log(objs["KeyBoard~g~не$основное"]["KeyBoard~g~не$основное_1"]);
+
+ },
+ ondropdeactivate: function (event) {var zone = event.target;zone.classList.remove('drop-active');zone.classList.remove('drop-target');}
+})
+
+interact('.createzone').dropzone({
+ accept: '.spawn',
+ overlap: 0.2,
+
+ ondragenter: function (event) {var drag = event.relatedTarget;var zone = event.target;
+ zone.classList.add('drop-target');drag.classList.add('can-drop');
+ },
+ ondragleave: function (event) {var drag = event.relatedTarget;var zone = event.target;
+
+ if(drag.classList[1] == "spawn" && drag.classList[0] == zone.classList[0]){
+ get_obj(drag.classList[0],(db_data)=>{
+ // drag.transform = `translate(${drag.getAttribute("data-y")}px, ${drag.getAttribute("data-y")}px) scale(${db_data["width"] * cm_mod} ${db_data["height"] * cm_mod})`;
+ drag.style.width = `${db_data["width"] * cm_mod}px`;
+ drag.style.height = `${db_data["height"] * cm_mod}px`;
+
+ // console.log(db_data);
+ })
+ let x = zone.getBoundingClientRect().left - document.getElementById("drags").getBoundingClientRect().left;
+ let y = zone.getBoundingClientRect().top - document.getElementById("drags").getBoundingClientRect().top;
+ create(`${zone.classList[0]} spawn drag`,x,y,null,`none`,false,0);
+ if (proj_state == "loaded"){objs_back.push(JSON.parse(JSON.stringify(objs)));}
+ drag.classList.remove('spawn');
+ }
+ zone.classList.remove('drop-target');
+ },
+ ondrop: function (event) {var drag = event.relatedTarget;
+ drag.classList.remove('in_zone');drag.classList.remove('can-drop');},
+ ondropdeactivate: function (event) {var zone = event.target;
+ zone.classList.remove('drop-active');zone.classList.remove('drop-target');}
+})
+
+function drag_start() {
+ let spawns = document.getElementsByClassName("spawn");
+ Object.entries(spawns).forEach(([key, spawn]) => {
+ spawn.parentElement.removeChild(spawn);
+ });
+ let zones = document.getElementsByClassName("createzone");
+ Object.entries(zones).forEach(([key, zone]) => {
+ let x = zone.getBoundingClientRect().left - document.getElementById("drags").getBoundingClientRect().left;
+ let y = zone.getBoundingClientRect().top - document.getElementById("drags").getBoundingClientRect().top;
+ create(`${zone.classList[0]} spawn drag`,x,y,null,`none`,false,0);
+ });
+}
+
+function get_id(clas){
+ if(objs[clas] == null){ return `${clas}_0`}
+ else{
+ let count = Object.keys(objs[clas]).length;
+ return `${clas}_${count}`;
+ }
+}
\ No newline at end of file
diff --git a/templates.js b/templates.js
index dfe8196..c5e78cc 100644
--- a/templates.js
+++ b/templates.js
@@ -6,7 +6,7 @@ const vars = require('./vars');
module.exports.load = (inp,cook,res)=>{
try {
db.gv("templates","name",`'${inp["name"]}'`,(pdata)=>{pdata = pdata[0];
- console.log(pdata);
+ // console.log(pdata);
if (pdata != null){
res.send({out:"good",body:pdata["body"]});
}
diff --git a/views/admin/objects/group_object copy.ejs b/views/admin/objects/group_object copy.ejs
new file mode 100644
index 0000000..7fd22de
--- /dev/null
+++ b/views/admin/objects/group_object copy.ejs
@@ -0,0 +1,582 @@
+<%- include('../../static/start.ejs',{name:"",async:true}) %>
+<%- include('../../header.ejs') %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<%- include('../../static/end.ejs',{soc:true}) %>
\ No newline at end of file
diff --git a/views/admin/objects/group_object.ejs b/views/admin/objects/group_object.ejs
new file mode 100644
index 0000000..eba10a4
--- /dev/null
+++ b/views/admin/objects/group_object.ejs
@@ -0,0 +1,595 @@
+<%- include('../../static/start.ejs',{name:"",async:true}) %>
+<%- include('../../header.ejs') %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<%- include('../../static/end.ejs',{soc:true}) %>
\ No newline at end of file
diff --git a/views/admin/objects/object_creation.ejs b/views/admin/objects/object_creation.ejs
index 49809a1..fb68803 100644
--- a/views/admin/objects/object_creation.ejs
+++ b/views/admin/objects/object_creation.ejs
@@ -41,13 +41,13 @@
-
+
+
+
+
+
@@ -130,7 +147,7 @@
}
}
- function set_obj_edit_params(img = "/img/placeholder.png",name = "",height = 100,width = 100,cost = 0,gid = 0,colors = false, id = null){
+ function set_obj_edit_params(img = "/img/placeholder.png",name = "",height = 100,width = 100,cost = 0,gid = 0,colors = false,grouped = false,id = null){
// поменять на if id == null усё
if(id == null){
obj_edit_type = "new";
@@ -145,6 +162,7 @@
del_btn.innerText = "удалить товар";
del_btn.classList.add("btn_blue");
document.getElementById("object_edit_type").append(del_btn);
+ document.getElementById("obj_group_check").setAttribute("object_id",id)
document.getElementById("obj_apply_btn").value = "сохранить";
document.getElementById("obj_apply_btn").setAttribute("onclick",`save_edited_obj(${id})`);
// document.getElementById("group_select").selectedIndex = document.getElementById("group_select").options[`obj_group_${gid}`].index;
@@ -161,6 +179,7 @@
let width_text = document.getElementById("obj_width_value");
let cost_text = document.getElementById("obj_cost");
let colors_div = document.getElementById("obj_color_check");
+ let grouped_div = document.getElementById("obj_group_check");
name_div.value = name;
img_file.value = null;
@@ -171,11 +190,14 @@
img_prev.style.width = `${width* cm_mult}px`;
cost_text.value = cost;
colors_div.checked = JSON.parse(colors);
+ grouped_div.checked = JSON.parse(grouped);
height_slider.value = height;
width_slider.value = width;
height_text.value = `${height}`;
width_text.value = `${width}`;
+
+ group_object_check();
}
function previewFile() {
diff --git a/views/admin/objects/object_edit.ejs b/views/admin/objects/object_edit.ejs
index 9b54f54..d593e22 100644
--- a/views/admin/objects/object_edit.ejs
+++ b/views/admin/objects/object_edit.ejs
@@ -60,6 +60,7 @@
// load_groups(()=>{
// edit_get_objs();
// });
+
function set_edit(id){
let menu = document.getElementById(`object_${id}`);
@@ -70,10 +71,11 @@
menu.getAttribute("cost"),
menu.getAttribute("gid"),
menu.getAttribute("colors"),
+ menu.getAttribute("grouped"),
menu.getAttribute("obj_id"));
window.scrollTo({
- top: 0,
- behavior: "smooth",
+ top: 0,
+ behavior: "smooth",
});
}
@@ -90,6 +92,10 @@
if(data.at(-1)["id"] == value["id"]){
msg_del(wait_msg.id);
msg("Объекты загружены")
+ if(new URL(window.location).searchParams.get("object_id") != null){
+ const get_object_id = new URL(window.location).searchParams.get("object_id");
+ set_edit(new URL(window.location).searchParams.get("object_id"));
+ }
if(callback)callback(true);
}
})
@@ -131,14 +137,15 @@
function save_edited_obj(id){
let gid = gids[0];
let menu = document.getElementById(`object_${id}`);
- let attributes = ["name","img","height","width","cost","colors"];
+ let attributes = ["name","img","height","width","cost","colors","grouped"];
let cur_atts = {
name : document.getElementById("nobj_name").value,
height : document.getElementById("obj_height").value,
width : document.getElementById("obj_width").value,
img : document.getElementById('img_prev').getAttribute("src"),
cost : document.getElementById("obj_cost").value,
- colors : String(document.getElementById("obj_color_check").checked)
+ colors : String(document.getElementById("obj_color_check").checked),
+ grouped : String(document.getElementById("obj_group_check").checked)
}
let changes = {}
attributes.forEach(element => {
@@ -253,6 +260,7 @@
obj.setAttribute("obj_id",value["id"])
obj.setAttribute("cost",value["cost"])
obj.setAttribute("colors",Boolean(value["colors"]))
+ obj.setAttribute("grouped",Boolean(value["grouped"]))
obj.setAttribute("gid",value["gid"])
// // name_text.innerText = value["name"].split("~")[0].replaceAll("$"," ");
// img_elm.src = img;
@@ -272,6 +280,7 @@
cost : value["cost"],
link : img,
color : Boolean(value["colors"]),
+ grouped : Boolean(value["grouped"]),
edit : `set_edit(${value["id"]})`
}
@@ -283,6 +292,7 @@
cost : "Цена",
link : "Ссылка на изображение",
color : "Меняет цвет",
+ grouped : "группированный",
edit : "Радактировать"
}
@@ -299,6 +309,7 @@
`
${labels["cost"]} | `+
`
${labels["link"]} | `+
`
${labels["color"]} | `+
+ `
${labels["grouped"]} | `+
`
${labels["edit"]} | `+
""+
"
"+
@@ -309,6 +320,7 @@
`${divs["cost"]} | `+
`${divs["link"]} | `+
` | `+
+ ` | `+
` | `+
"
";
diff --git a/views/project.ejs b/views/project.ejs
index 1f2bb94..509723b 100644
--- a/views/project.ejs
+++ b/views/project.ejs
@@ -190,7 +190,7 @@