added cut
This commit is contained in:
parent
7a944a73f7
commit
a45ba1c8b3
@ -31,6 +31,6 @@ Content-Length: 51
|
|||||||
< strict-transport-security: max-age=2592000
|
< strict-transport-security: max-age=2592000
|
||||||
< x-powered-by: ASP.NET
|
< x-powered-by: ASP.NET
|
||||||
< x-content-type-options: nosniff
|
< x-content-type-options: nosniff
|
||||||
< date: Mon, 08 Sep 2025 06:40:14 GMT
|
< date: Mon, 08 Sep 2025 08:12:42 GMT
|
||||||
<
|
<
|
||||||
* Connection #0 to host 93.43.5.102 left intact
|
* Connection #0 to host 93.43.5.102 left intact
|
||||||
|
|||||||
@ -10,16 +10,16 @@
|
|||||||
* issuer: C=US; O=Corporation Service Company; CN=Corporation Service Company RSA OV SSL CA
|
* issuer: C=US; O=Corporation Service Company; CN=Corporation Service Company RSA OV SSL CA
|
||||||
* SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
|
* SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
|
||||||
* using HTTP/2
|
* using HTTP/2
|
||||||
* [HTTP/2] [1] OPENED stream for https://93.43.5.102/limsapi/api/odata/CommessaWeb(529435)
|
* [HTTP/2] [1] OPENED stream for https://93.43.5.102/limsapi/api/odata/CustomField(1083)?$expand=CustomFieldsValues
|
||||||
* [HTTP/2] [1] [:method: GET]
|
* [HTTP/2] [1] [:method: GET]
|
||||||
* [HTTP/2] [1] [:scheme: https]
|
* [HTTP/2] [1] [:scheme: https]
|
||||||
* [HTTP/2] [1] [:authority: 93.43.5.102]
|
* [HTTP/2] [1] [:authority: 93.43.5.102]
|
||||||
* [HTTP/2] [1] [:path: /limsapi/api/odata/CommessaWeb(529435)]
|
* [HTTP/2] [1] [:path: /limsapi/api/odata/CustomField(1083)?$expand=CustomFieldsValues]
|
||||||
* [HTTP/2] [1] [authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjQ5MiIsIlhhZlNlY3VyaXR5QXV0aFBhc3NlZCI6IlhhZlNlY3VyaXR5QXV0aFBhc3NlZCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiJXZWJBcGlVc2VyIiwiWGFmU2VjdXJpdHkiOiJYYWZTZWN1cml0eSIsIlhhZkxvZ29uUGFyYW1zIjoicTFZS0xVNHQ4a3ZNVFZXeVVncFBUWElzeUFRSktPa29CU1FXRjVmbkY2VUF4Y3RUa3hJTE1rdUI0Z2FHU3JVQSIsImV4cCI6MTc1NzMyMDgxNCwiaXNzIjoiTXkiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjQyMDAifQ.enjh2WJVy0NQ8zEDX5S09glaAOamuzcG33TM_fTgTMo]
|
* [HTTP/2] [1] [authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjQ5MiIsIlhhZlNlY3VyaXR5QXV0aFBhc3NlZCI6IlhhZlNlY3VyaXR5QXV0aFBhc3NlZCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiJXZWJBcGlVc2VyIiwiWGFmU2VjdXJpdHkiOiJYYWZTZWN1cml0eSIsIlhhZkxvZ29uUGFyYW1zIjoicTFZS0xVNHQ4a3ZNVFZXeVVncFBUWElzeUFRSktPa29CU1FXRjVmbkY2VUF4Y3RUa3hJTE1rdUI0Z2FHU3JVQSIsImV4cCI6MTc1NzMyNjM2MiwiaXNzIjoiTXkiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjQyMDAifQ.nc12p_9WtfSGJF4kxgnsEHzjRSeDn1rY90GuG2B7CAQ]
|
||||||
* [HTTP/2] [1] [accept: application/json]
|
* [HTTP/2] [1] [accept: application/json]
|
||||||
> GET /limsapi/api/odata/CommessaWeb(529435) HTTP/2
|
> GET /limsapi/api/odata/CustomField(1083)?$expand=CustomFieldsValues HTTP/2
|
||||||
Host: 93.43.5.102
|
Host: 93.43.5.102
|
||||||
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjQ5MiIsIlhhZlNlY3VyaXR5QXV0aFBhc3NlZCI6IlhhZlNlY3VyaXR5QXV0aFBhc3NlZCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiJXZWJBcGlVc2VyIiwiWGFmU2VjdXJpdHkiOiJYYWZTZWN1cml0eSIsIlhhZkxvZ29uUGFyYW1zIjoicTFZS0xVNHQ4a3ZNVFZXeVVncFBUWElzeUFRSktPa29CU1FXRjVmbkY2VUF4Y3RUa3hJTE1rdUI0Z2FHU3JVQSIsImV4cCI6MTc1NzMyMDgxNCwiaXNzIjoiTXkiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjQyMDAifQ.enjh2WJVy0NQ8zEDX5S09glaAOamuzcG33TM_fTgTMo
|
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjQ5MiIsIlhhZlNlY3VyaXR5QXV0aFBhc3NlZCI6IlhhZlNlY3VyaXR5QXV0aFBhc3NlZCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiJXZWJBcGlVc2VyIiwiWGFmU2VjdXJpdHkiOiJYYWZTZWN1cml0eSIsIlhhZkxvZ29uUGFyYW1zIjoicTFZS0xVNHQ4a3ZNVFZXeVVncFBUWElzeUFRSktPa29CU1FXRjVmbkY2VUF4Y3RUa3hJTE1rdUI0Z2FHU3JVQSIsImV4cCI6MTc1NzMyNjM2MiwiaXNzIjoiTXkiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjQyMDAifQ.nc12p_9WtfSGJF4kxgnsEHzjRSeDn1rY90GuG2B7CAQ
|
||||||
Accept: application/json
|
Accept: application/json
|
||||||
|
|
||||||
< HTTP/2 200
|
< HTTP/2 200
|
||||||
@ -30,6 +30,6 @@ Accept: application/json
|
|||||||
< odata-version: 4.0
|
< odata-version: 4.0
|
||||||
< x-powered-by: ASP.NET
|
< x-powered-by: ASP.NET
|
||||||
< x-content-type-options: nosniff
|
< x-content-type-options: nosniff
|
||||||
< date: Mon, 08 Sep 2025 06:40:14 GMT
|
< date: Mon, 08 Sep 2025 08:12:45 GMT
|
||||||
<
|
<
|
||||||
* Connection #0 to host 93.43.5.102 left intact
|
* Connection #0 to host 93.43.5.102 left intact
|
||||||
|
|||||||
@ -0,0 +1,23 @@
|
|||||||
|
# Swagger Codegen Ignore
|
||||||
|
# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen
|
||||||
|
|
||||||
|
# Use this file to prevent files from being overwritten by the generator.
|
||||||
|
# The patterns follow closely to .gitignore or .dockerignore.
|
||||||
|
|
||||||
|
# As an example, the C# client generator defines ApiClient.cs.
|
||||||
|
# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line:
|
||||||
|
#ApiClient.cs
|
||||||
|
|
||||||
|
# You can match any string of characters against a directory, file or extension with a single asterisk (*):
|
||||||
|
#foo/*/qux
|
||||||
|
# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
|
||||||
|
|
||||||
|
# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
|
||||||
|
#foo/**/qux
|
||||||
|
# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
|
||||||
|
|
||||||
|
# You can also negate patterns with an exclamation (!).
|
||||||
|
# For example, you can ignore all files in a docs folder with the file extension .md:
|
||||||
|
#docs/*.md
|
||||||
|
# Then explicitly reverse the ignore rule for a single file:
|
||||||
|
#!docs/README.md
|
||||||
@ -0,0 +1 @@
|
|||||||
|
3.0.34
|
||||||
BIN
public/userarea/docs/Swagger documentation/VisualLims API.pdf
Normal file
BIN
public/userarea/docs/Swagger documentation/VisualLims API.pdf
Normal file
Binary file not shown.
19518
public/userarea/docs/Swagger documentation/index.html
Normal file
19518
public/userarea/docs/Swagger documentation/index.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
public/userarea/docs/VisualLims-WebApi.docx
Normal file
BIN
public/userarea/docs/VisualLims-WebApi.docx
Normal file
Binary file not shown.
BIN
public/userarea/docs/VisualLims-WebApi.pdf
Normal file
BIN
public/userarea/docs/VisualLims-WebApi.pdf
Normal file
Binary file not shown.
1824
public/userarea/docs/metadata.xml
Normal file
1824
public/userarea/docs/metadata.xml
Normal file
File diff suppressed because it is too large
Load Diff
28530
public/userarea/docs/swagger.json
Normal file
28530
public/userarea/docs/swagger.json
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -396,11 +396,21 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
closeCollageBtn.addEventListener("click", () => {
|
closeCollageBtn.addEventListener("click", () => {
|
||||||
console.log("Chiusura modale collage");
|
console.log("Chiusura modale collage");
|
||||||
document.getElementById("collageModal").style.display = "none";
|
document.getElementById("collageModal").style.display = "none";
|
||||||
|
if (isCropping) {
|
||||||
|
console.log(
|
||||||
|
"Chiusura modale durante ritaglio, esco dalla modalità ritaglio",
|
||||||
|
);
|
||||||
|
exitCropMode();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inizializza canvas con Fabric.js
|
// Inizializza canvas con Fabric.js
|
||||||
let canvas;
|
let canvas;
|
||||||
|
let cropRect = null;
|
||||||
|
let isCropping = false;
|
||||||
|
let croppedImage = null; // Memorizza l'immagine da ritagliare
|
||||||
|
let isApplyingCrop = false; // Flag per prevenire duplicazioni
|
||||||
function initCollageCanvas() {
|
function initCollageCanvas() {
|
||||||
if (typeof fabric === "undefined") {
|
if (typeof fabric === "undefined") {
|
||||||
console.error("Fabric.js non è caricato!");
|
console.error("Fabric.js non è caricato!");
|
||||||
@ -413,8 +423,206 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
backgroundColor: "#fff",
|
backgroundColor: "#fff",
|
||||||
selection: true,
|
selection: true,
|
||||||
});
|
});
|
||||||
|
// Imposta stile globale per i controlli
|
||||||
|
fabric.Object.prototype.set({
|
||||||
|
cornerColor: "black",
|
||||||
|
cornerStrokeColor: "black",
|
||||||
|
cornerSize: 12,
|
||||||
|
borderColor: "black",
|
||||||
|
transparentCorners: false,
|
||||||
|
});
|
||||||
// Abilita ridimensionamento e trascinamento
|
// Abilita ridimensionamento e trascinamento
|
||||||
canvas.on("object:modified", () => canvas.renderAll());
|
canvas.on("object:modified", () => {
|
||||||
|
console.log("Oggetto modificato nel canvas");
|
||||||
|
canvas.renderAll();
|
||||||
|
});
|
||||||
|
// Gestisci selezione per abilitare/disabilitare pulsanti di ritaglio
|
||||||
|
canvas.on("selection:created", () => {
|
||||||
|
console.log("Evento selection:created triggerato");
|
||||||
|
updateCropButtons();
|
||||||
|
});
|
||||||
|
canvas.on("selection:updated", () => {
|
||||||
|
console.log("Evento selection:updated triggerato");
|
||||||
|
updateCropButtons();
|
||||||
|
});
|
||||||
|
canvas.on("selection:cleared", () => {
|
||||||
|
console.log("Evento selection:cleared triggerato");
|
||||||
|
if (!isCropping) {
|
||||||
|
updateCropButtons();
|
||||||
|
} else {
|
||||||
|
console.log(
|
||||||
|
"Ignoro selection:cleared perché in modalità ritaglio",
|
||||||
|
);
|
||||||
|
if (cropRect) {
|
||||||
|
canvas.setActiveObject(cropRect); // Ripristina selezione del rettangolo
|
||||||
|
canvas.renderAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// Forza un aggiornamento iniziale dei pulsanti
|
||||||
|
updateCropButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Aggiorna stato dei pulsanti di ritaglio
|
||||||
|
function updateCropButtons() {
|
||||||
|
const cropBtn = document.getElementById("cropImageBtn");
|
||||||
|
const applyCropBtn = document.getElementById("applyCropBtn");
|
||||||
|
const cancelCropBtn = document.getElementById("cancelCropBtn");
|
||||||
|
const activeObject = canvas.getActiveObject();
|
||||||
|
console.log(
|
||||||
|
"updateCropButtons: activeObject =",
|
||||||
|
activeObject ? activeObject.type : null,
|
||||||
|
"isCropping =",
|
||||||
|
isCropping,
|
||||||
|
);
|
||||||
|
if (isCropping && cropRect) {
|
||||||
|
console.log(
|
||||||
|
"Modo ritaglio attivo, applyCropBtn e cancelCropBtn abilitati",
|
||||||
|
);
|
||||||
|
cropBtn.disabled = true;
|
||||||
|
applyCropBtn.disabled = false;
|
||||||
|
if (cancelCropBtn) cancelCropBtn.disabled = false;
|
||||||
|
} else if (
|
||||||
|
activeObject &&
|
||||||
|
activeObject.type === "image" &&
|
||||||
|
!isCropping
|
||||||
|
) {
|
||||||
|
console.log("Abilitazione cropImageBtn");
|
||||||
|
cropBtn.disabled = false;
|
||||||
|
applyCropBtn.disabled = true;
|
||||||
|
if (cancelCropBtn) cancelCropBtn.disabled = true;
|
||||||
|
} else {
|
||||||
|
console.log(
|
||||||
|
"Disabilitazione cropImageBtn, applyCropBtn e cancelCropBtn",
|
||||||
|
);
|
||||||
|
cropBtn.disabled = true;
|
||||||
|
applyCropBtn.disabled = true;
|
||||||
|
if (cancelCropBtn) cancelCropBtn.disabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Entra in modalità ritaglio
|
||||||
|
function enterCropMode() {
|
||||||
|
const activeObject = canvas.getActiveObject();
|
||||||
|
if (!activeObject || activeObject.type !== "image") {
|
||||||
|
console.warn("Nessuna immagine selezionata per il ritaglio");
|
||||||
|
alert("Seleziona un'immagine prima di attivare il ritaglio!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log(
|
||||||
|
"Entrata in modalità ritaglio per immagine:",
|
||||||
|
activeObject,
|
||||||
|
);
|
||||||
|
isCropping = true;
|
||||||
|
croppedImage = activeObject; // Memorizza l'immagine da ritagliare
|
||||||
|
canvas.discardActiveObject(); // Deseleziona l'immagine
|
||||||
|
// Crea un rettangolo di ritaglio
|
||||||
|
cropRect = new fabric.Rect({
|
||||||
|
left: activeObject.left,
|
||||||
|
top: activeObject.top,
|
||||||
|
width: activeObject.width * activeObject.scaleX * 0.5,
|
||||||
|
height: activeObject.height * activeObject.scaleY * 0.5,
|
||||||
|
fill: "rgba(0, 0, 0, 0.3)",
|
||||||
|
stroke: "red",
|
||||||
|
strokeWidth: 2,
|
||||||
|
hasBorders: true,
|
||||||
|
hasControls: true,
|
||||||
|
lockRotation: true,
|
||||||
|
selectable: true,
|
||||||
|
cornerColor: "black",
|
||||||
|
cornerStrokeColor: "black",
|
||||||
|
cornerSize: 12,
|
||||||
|
borderColor: "black",
|
||||||
|
transparentCorners: false,
|
||||||
|
});
|
||||||
|
canvas.add(cropRect);
|
||||||
|
canvas.setActiveObject(cropRect);
|
||||||
|
canvas.renderAll();
|
||||||
|
document.getElementById("cropImageBtn").disabled = true;
|
||||||
|
document.getElementById("applyCropBtn").disabled = false;
|
||||||
|
const cancelCropBtn = document.getElementById("cancelCropBtn");
|
||||||
|
if (cancelCropBtn) cancelCropBtn.disabled = false;
|
||||||
|
console.log("Rettangolo di ritaglio creato e applicato");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Esci dalla modalità ritaglio
|
||||||
|
function exitCropMode() {
|
||||||
|
if (cropRect) {
|
||||||
|
console.log("Rimozione rettangolo di ritaglio");
|
||||||
|
canvas.remove(cropRect);
|
||||||
|
cropRect = null;
|
||||||
|
}
|
||||||
|
isCropping = false;
|
||||||
|
croppedImage = null;
|
||||||
|
isApplyingCrop = false;
|
||||||
|
canvas.discardActiveObject();
|
||||||
|
canvas.renderAll();
|
||||||
|
updateCropButtons();
|
||||||
|
console.log("Uscita dalla modalità ritaglio");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Applica il ritaglio
|
||||||
|
function applyCrop() {
|
||||||
|
if (isApplyingCrop) {
|
||||||
|
console.log("applyCrop già in esecuzione, ignoro chiamata");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log("applyCrop chiamato, stato:", {
|
||||||
|
isCropping,
|
||||||
|
cropRect: !!cropRect,
|
||||||
|
croppedImage: !!croppedImage,
|
||||||
|
});
|
||||||
|
if (!isCropping || !cropRect || !croppedImage) {
|
||||||
|
console.warn("Condizioni per il ritaglio non soddisfatte", {
|
||||||
|
isCropping,
|
||||||
|
cropRect: !!cropRect,
|
||||||
|
croppedImage: !!croppedImage,
|
||||||
|
});
|
||||||
|
alert(
|
||||||
|
"Nessun rettangolo di ritaglio attivo o immagine selezionata!",
|
||||||
|
);
|
||||||
|
exitCropMode();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
isApplyingCrop = true;
|
||||||
|
console.log("Applicazione ritaglio all'immagine:", croppedImage);
|
||||||
|
const img = croppedImage;
|
||||||
|
const cropX = (cropRect.left - img.left) / img.scaleX;
|
||||||
|
const cropY = (cropRect.top - img.top) / img.scaleY;
|
||||||
|
const cropWidth = cropRect.width / img.scaleX;
|
||||||
|
const cropHeight = cropRect.height / img.scaleY;
|
||||||
|
|
||||||
|
// Crea un'immagine ritagliata
|
||||||
|
fabric.Image.fromURL(
|
||||||
|
img.getSrc(),
|
||||||
|
(newImg) => {
|
||||||
|
newImg.set({
|
||||||
|
left: cropRect.left,
|
||||||
|
top: cropRect.top,
|
||||||
|
scaleX: img.scaleX,
|
||||||
|
scaleY: img.scaleY,
|
||||||
|
cropX: cropX,
|
||||||
|
cropY: cropY,
|
||||||
|
width: cropWidth,
|
||||||
|
height: cropHeight,
|
||||||
|
hasControls: true,
|
||||||
|
hasBorders: true,
|
||||||
|
cornerColor: "black",
|
||||||
|
cornerStrokeColor: "black",
|
||||||
|
cornerSize: 12,
|
||||||
|
borderColor: "black",
|
||||||
|
transparentCorners: false,
|
||||||
|
});
|
||||||
|
canvas.remove(img); // Rimuovi l'immagine originale
|
||||||
|
canvas.remove(cropRect); // Rimuovi il rettangolo di ritaglio
|
||||||
|
canvas.add(newImg); // Aggiungi l'immagine ritagliata
|
||||||
|
canvas.setActiveObject(newImg);
|
||||||
|
exitCropMode();
|
||||||
|
canvas.renderAll();
|
||||||
|
console.log("Ritaglio applicato con successo");
|
||||||
|
},
|
||||||
|
{ crossOrigin: "anonymous" },
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Aggiungi foto selezionate al canvas
|
// Aggiungi foto selezionate al canvas
|
||||||
@ -430,18 +638,31 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
}
|
}
|
||||||
checkboxes.forEach((cb) => {
|
checkboxes.forEach((cb) => {
|
||||||
const imgPath = cb.getAttribute("data-path");
|
const imgPath = cb.getAttribute("data-path");
|
||||||
fabric.Image.fromURL(imgPath, (img) => {
|
fabric.Image.fromURL(
|
||||||
img.set({
|
imgPath,
|
||||||
left: Math.random() * 600, // Posizione random iniziale
|
(img) => {
|
||||||
top: Math.random() * 400,
|
img.set({
|
||||||
scaleX: 0.5, // Scala iniziale
|
left: Math.random() * 600, // Posizione random iniziale
|
||||||
scaleY: 0.5,
|
top: Math.random() * 400,
|
||||||
hasControls: true, // Abilita resize/rotate
|
scaleX: 0.5, // Scala iniziale
|
||||||
hasBorders: true,
|
scaleY: 0.5,
|
||||||
});
|
hasControls: true, // Abilita resize/rotate
|
||||||
canvas.add(img);
|
hasBorders: true,
|
||||||
canvas.renderAll();
|
cornerColor: "black",
|
||||||
});
|
cornerStrokeColor: "black",
|
||||||
|
cornerSize: 12,
|
||||||
|
borderColor: "black",
|
||||||
|
transparentCorners: false,
|
||||||
|
});
|
||||||
|
canvas.add(img);
|
||||||
|
canvas.renderAll();
|
||||||
|
console.log(
|
||||||
|
"Immagine aggiunta al canvas:",
|
||||||
|
imgPath,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
{ crossOrigin: "anonymous" },
|
||||||
|
);
|
||||||
});
|
});
|
||||||
// Deseleziona checkbox dopo aggiunta
|
// Deseleziona checkbox dopo aggiunta
|
||||||
checkboxes.forEach((cb) => (cb.checked = false));
|
checkboxes.forEach((cb) => (cb.checked = false));
|
||||||
@ -470,6 +691,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
// Chiudi modale e ricarica popup
|
// Chiudi modale e ricarica popup
|
||||||
document.getElementById("collageModal").style.display = "none";
|
document.getElementById("collageModal").style.display = "none";
|
||||||
loadPopupContent(iddatadb);
|
loadPopupContent(iddatadb);
|
||||||
|
console.log("Collage salvato e modale chiuso");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -480,6 +702,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
canvas.clear();
|
canvas.clear();
|
||||||
canvas.setBackgroundColor("#fff");
|
canvas.setBackgroundColor("#fff");
|
||||||
canvas.renderAll();
|
canvas.renderAll();
|
||||||
|
console.log("Canvas pulito");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -491,6 +714,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
if (activeObject) {
|
if (activeObject) {
|
||||||
canvas.bringToFront(activeObject);
|
canvas.bringToFront(activeObject);
|
||||||
canvas.renderAll();
|
canvas.renderAll();
|
||||||
|
console.log("Oggetto portato in primo piano");
|
||||||
} else {
|
} else {
|
||||||
alert("Seleziona un'immagine sul canvas!");
|
alert("Seleziona un'immagine sul canvas!");
|
||||||
}
|
}
|
||||||
@ -504,6 +728,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
if (activeObject) {
|
if (activeObject) {
|
||||||
canvas.sendToBack(activeObject);
|
canvas.sendToBack(activeObject);
|
||||||
canvas.renderAll();
|
canvas.renderAll();
|
||||||
|
console.log("Oggetto mandato in fondo");
|
||||||
} else {
|
} else {
|
||||||
alert("Seleziona un'immagine sul canvas!");
|
alert("Seleziona un'immagine sul canvas!");
|
||||||
}
|
}
|
||||||
@ -517,6 +742,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
if (activeObject) {
|
if (activeObject) {
|
||||||
canvas.bringForward(activeObject);
|
canvas.bringForward(activeObject);
|
||||||
canvas.renderAll();
|
canvas.renderAll();
|
||||||
|
console.log("Oggetto spostato avanti di un livello");
|
||||||
} else {
|
} else {
|
||||||
alert("Seleziona un'immagine sul canvas!");
|
alert("Seleziona un'immagine sul canvas!");
|
||||||
}
|
}
|
||||||
@ -530,12 +756,39 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
if (activeObject) {
|
if (activeObject) {
|
||||||
canvas.sendBackwards(activeObject);
|
canvas.sendBackwards(activeObject);
|
||||||
canvas.renderAll();
|
canvas.renderAll();
|
||||||
|
console.log("Oggetto spostato indietro di un livello");
|
||||||
} else {
|
} else {
|
||||||
alert("Seleziona un'immagine sul canvas!");
|
alert("Seleziona un'immagine sul canvas!");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Gestione ritaglio immagini
|
||||||
|
const cropImageBtn = document.getElementById("cropImageBtn");
|
||||||
|
if (cropImageBtn) {
|
||||||
|
cropImageBtn.addEventListener("click", () => {
|
||||||
|
console.log("Pulsante Ritaglia cliccato");
|
||||||
|
enterCropMode();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const applyCropBtn = document.getElementById("applyCropBtn");
|
||||||
|
if (applyCropBtn) {
|
||||||
|
applyCropBtn.addEventListener("click", () => {
|
||||||
|
console.log("Pulsante Applica Ritaglio cliccato");
|
||||||
|
applyCrop();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gestione pulsante Annulla Ritaglio
|
||||||
|
const cancelCropBtn = document.getElementById("cancelCropBtn");
|
||||||
|
if (cancelCropBtn) {
|
||||||
|
cancelCropBtn.addEventListener("click", () => {
|
||||||
|
console.log("Pulsante Annulla Ritaglio cliccato");
|
||||||
|
exitCropMode();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Assicurati che il loader sia nascosto all'apertura del popup
|
// Assicurati che il loader sia nascosto all'apertura del popup
|
||||||
const loader = document.getElementById("loader");
|
const loader = document.getElementById("loader");
|
||||||
if (loader) {
|
if (loader) {
|
||||||
|
|||||||
@ -4,6 +4,8 @@ include('include/headscript.php');
|
|||||||
// Includi Fabric.js solo per questa pagina
|
// Includi Fabric.js solo per questa pagina
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/5.3.1/fabric.min.js"></script>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
// Includi l'autoloader di Composer
|
// Includi l'autoloader di Composer
|
||||||
require_once __DIR__ . '/../../vendor/autoload.php';
|
require_once __DIR__ . '/../../vendor/autoload.php';
|
||||||
@ -201,6 +203,8 @@ $result->saveToFile($qrCodeFile);
|
|||||||
<button id="sendToBackBtn" title="Manda in fondo">In Fondo</button>
|
<button id="sendToBackBtn" title="Manda in fondo">In Fondo</button>
|
||||||
<button id="bringForwardBtn" title="Sposta avanti di un livello">Avanti</button>
|
<button id="bringForwardBtn" title="Sposta avanti di un livello">Avanti</button>
|
||||||
<button id="sendBackwardBtn" title="Sposta indietro di un livello">Indietro</button>
|
<button id="sendBackwardBtn" title="Sposta indietro di un livello">Indietro</button>
|
||||||
|
<button id="cropImageBtn" title="Ritaglia immagine selezionata" disabled>Ritaglia</button>
|
||||||
|
<button id="applyCropBtn" title="Applica ritaglio" disabled>Applica Ritaglio</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user