added cut
This commit is contained in:
@@ -31,6 +31,6 @@ Content-Length: 51
|
||||
< strict-transport-security: max-age=2592000
|
||||
< x-powered-by: ASP.NET
|
||||
< 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
|
||||
|
||||
@@ -10,16 +10,16 @@
|
||||
* 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.
|
||||
* 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] [:scheme: https]
|
||||
* [HTTP/2] [1] [:authority: 93.43.5.102]
|
||||
* [HTTP/2] [1] [:path: /limsapi/api/odata/CommessaWeb(529435)]
|
||||
* [HTTP/2] [1] [authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjQ5MiIsIlhhZlNlY3VyaXR5QXV0aFBhc3NlZCI6IlhhZlNlY3VyaXR5QXV0aFBhc3NlZCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiJXZWJBcGlVc2VyIiwiWGFmU2VjdXJpdHkiOiJYYWZTZWN1cml0eSIsIlhhZkxvZ29uUGFyYW1zIjoicTFZS0xVNHQ4a3ZNVFZXeVVncFBUWElzeUFRSktPa29CU1FXRjVmbkY2VUF4Y3RUa3hJTE1rdUI0Z2FHU3JVQSIsImV4cCI6MTc1NzMyMDgxNCwiaXNzIjoiTXkiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjQyMDAifQ.enjh2WJVy0NQ8zEDX5S09glaAOamuzcG33TM_fTgTMo]
|
||||
* [HTTP/2] [1] [:path: /limsapi/api/odata/CustomField(1083)?$expand=CustomFieldsValues]
|
||||
* [HTTP/2] [1] [authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjQ5MiIsIlhhZlNlY3VyaXR5QXV0aFBhc3NlZCI6IlhhZlNlY3VyaXR5QXV0aFBhc3NlZCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiJXZWJBcGlVc2VyIiwiWGFmU2VjdXJpdHkiOiJYYWZTZWN1cml0eSIsIlhhZkxvZ29uUGFyYW1zIjoicTFZS0xVNHQ4a3ZNVFZXeVVncFBUWElzeUFRSktPa29CU1FXRjVmbkY2VUF4Y3RUa3hJTE1rdUI0Z2FHU3JVQSIsImV4cCI6MTc1NzMyNjM2MiwiaXNzIjoiTXkiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjQyMDAifQ.nc12p_9WtfSGJF4kxgnsEHzjRSeDn1rY90GuG2B7CAQ]
|
||||
* [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
|
||||
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjQ5MiIsIlhhZlNlY3VyaXR5QXV0aFBhc3NlZCI6IlhhZlNlY3VyaXR5QXV0aFBhc3NlZCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiJXZWJBcGlVc2VyIiwiWGFmU2VjdXJpdHkiOiJYYWZTZWN1cml0eSIsIlhhZkxvZ29uUGFyYW1zIjoicTFZS0xVNHQ4a3ZNVFZXeVVncFBUWElzeUFRSktPa29CU1FXRjVmbkY2VUF4Y3RUa3hJTE1rdUI0Z2FHU3JVQSIsImV4cCI6MTc1NzMyMDgxNCwiaXNzIjoiTXkiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjQyMDAifQ.enjh2WJVy0NQ8zEDX5S09glaAOamuzcG33TM_fTgTMo
|
||||
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjQ5MiIsIlhhZlNlY3VyaXR5QXV0aFBhc3NlZCI6IlhhZlNlY3VyaXR5QXV0aFBhc3NlZCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiJXZWJBcGlVc2VyIiwiWGFmU2VjdXJpdHkiOiJYYWZTZWN1cml0eSIsIlhhZkxvZ29uUGFyYW1zIjoicTFZS0xVNHQ4a3ZNVFZXeVVncFBUWElzeUFRSktPa29CU1FXRjVmbkY2VUF4Y3RUa3hJTE1rdUI0Z2FHU3JVQSIsImV4cCI6MTc1NzMyNjM2MiwiaXNzIjoiTXkiLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjQyMDAifQ.nc12p_9WtfSGJF4kxgnsEHzjRSeDn1rY90GuG2B7CAQ
|
||||
Accept: application/json
|
||||
|
||||
< HTTP/2 200
|
||||
@@ -30,6 +30,6 @@ Accept: application/json
|
||||
< odata-version: 4.0
|
||||
< x-powered-by: ASP.NET
|
||||
< 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
|
||||
|
||||
@@ -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
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
+266
-13
@@ -396,11 +396,21 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||
closeCollageBtn.addEventListener("click", () => {
|
||||
console.log("Chiusura modale collage");
|
||||
document.getElementById("collageModal").style.display = "none";
|
||||
if (isCropping) {
|
||||
console.log(
|
||||
"Chiusura modale durante ritaglio, esco dalla modalità ritaglio",
|
||||
);
|
||||
exitCropMode();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Inizializza canvas con Fabric.js
|
||||
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() {
|
||||
if (typeof fabric === "undefined") {
|
||||
console.error("Fabric.js non è caricato!");
|
||||
@@ -413,8 +423,206 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||
backgroundColor: "#fff",
|
||||
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
|
||||
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
|
||||
@@ -430,18 +638,31 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||
}
|
||||
checkboxes.forEach((cb) => {
|
||||
const imgPath = cb.getAttribute("data-path");
|
||||
fabric.Image.fromURL(imgPath, (img) => {
|
||||
img.set({
|
||||
left: Math.random() * 600, // Posizione random iniziale
|
||||
top: Math.random() * 400,
|
||||
scaleX: 0.5, // Scala iniziale
|
||||
scaleY: 0.5,
|
||||
hasControls: true, // Abilita resize/rotate
|
||||
hasBorders: true,
|
||||
});
|
||||
canvas.add(img);
|
||||
canvas.renderAll();
|
||||
});
|
||||
fabric.Image.fromURL(
|
||||
imgPath,
|
||||
(img) => {
|
||||
img.set({
|
||||
left: Math.random() * 600, // Posizione random iniziale
|
||||
top: Math.random() * 400,
|
||||
scaleX: 0.5, // Scala iniziale
|
||||
scaleY: 0.5,
|
||||
hasControls: true, // Abilita resize/rotate
|
||||
hasBorders: true,
|
||||
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
|
||||
checkboxes.forEach((cb) => (cb.checked = false));
|
||||
@@ -470,6 +691,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||
// Chiudi modale e ricarica popup
|
||||
document.getElementById("collageModal").style.display = "none";
|
||||
loadPopupContent(iddatadb);
|
||||
console.log("Collage salvato e modale chiuso");
|
||||
});
|
||||
}
|
||||
|
||||
@@ -480,6 +702,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||
canvas.clear();
|
||||
canvas.setBackgroundColor("#fff");
|
||||
canvas.renderAll();
|
||||
console.log("Canvas pulito");
|
||||
});
|
||||
}
|
||||
|
||||
@@ -491,6 +714,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||
if (activeObject) {
|
||||
canvas.bringToFront(activeObject);
|
||||
canvas.renderAll();
|
||||
console.log("Oggetto portato in primo piano");
|
||||
} else {
|
||||
alert("Seleziona un'immagine sul canvas!");
|
||||
}
|
||||
@@ -504,6 +728,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||
if (activeObject) {
|
||||
canvas.sendToBack(activeObject);
|
||||
canvas.renderAll();
|
||||
console.log("Oggetto mandato in fondo");
|
||||
} else {
|
||||
alert("Seleziona un'immagine sul canvas!");
|
||||
}
|
||||
@@ -517,6 +742,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||
if (activeObject) {
|
||||
canvas.bringForward(activeObject);
|
||||
canvas.renderAll();
|
||||
console.log("Oggetto spostato avanti di un livello");
|
||||
} else {
|
||||
alert("Seleziona un'immagine sul canvas!");
|
||||
}
|
||||
@@ -530,12 +756,39 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||
if (activeObject) {
|
||||
canvas.sendBackwards(activeObject);
|
||||
canvas.renderAll();
|
||||
console.log("Oggetto spostato indietro di un livello");
|
||||
} else {
|
||||
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
|
||||
const loader = document.getElementById("loader");
|
||||
if (loader) {
|
||||
|
||||
@@ -4,6 +4,8 @@ include('include/headscript.php');
|
||||
// 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
|
||||
// Includi l'autoloader di Composer
|
||||
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="bringForwardBtn" title="Sposta avanti di un livello">Avanti</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>
|
||||
|
||||
Reference in New Issue
Block a user