Pagina 1 di 1

Funzione personalizzata errore importazione

Inviato: sabato 5 febbraio 2022, 21:09
da GiuseppeFM
Salve,
ho una domanda per voi che mi sta mandando ai pazzi.

Ho trovato una funzione personalizzata che mi permette di aprire in un Webviever una pagina html per generare una firma (versione modificata di Easysignature).
Se creo un nuovo progetto, importo la funzione personalizzata e creo il record tutto è perfetto.

Se invece importo la funzione nel mio DB, dove ne avrei bisogno, mi crea il WebViewer ma non riesco a "Firmare".

Ho analizzato le differenze tra i due risultati prodotti dalle funzioni personalizzate del nuovo progetto e del mio DB.
In sostanza nel mio DB la funzione genera lo stesso codice, ma sostituisce alcuni segni (ad esempio mette " , " al posto di " . " , oppure " , " al posto di " ' ".

Da cosa potrebbe dipendere secondo voi?

Grazie a chiunque riesca a impedirmi di andare ai matti......

Re: Funzione personalizzata errore importazione

Inviato: martedì 8 febbraio 2022, 14:53
da fabio.beri
Salve. Mi astengo dalla riposta, per mancanza di elementi validi...

Re: Funzione personalizzata errore importazione

Inviato: martedì 8 febbraio 2022, 16:24
da GiuseppeFM
Salve,
Capisco.....cercherò di darvi qualche informazione in più.
Vi allego:
1) Custom Function
2) risultato della custom nel DB originale
3) Risultato della custom nel mio B (Non funziona).


1) C.F.

Codice: Seleziona tutto

// FMEasySignature v1.0
// http://fmeasysignature.com/
// Developed by Tim Dietrich and provided under an open source license.
// Uses "Signature Pad v1.3.3" by Szymon Nowak. https://github.com/szimek/signature_pad
// Signature Pad is (c) 2014 Szymon Nowak. Released under the MIT license. http://opensource.org/licenses/MIT

Dichiara ( [



// Settings.

// backgroundColor: Color used for the background, as an RGB value. Example: rgb(255, 255, 255)
backgroundColor = "rgb(255, 255, 255)"; 

// minWidth: Minimum width of a line. Recommended: .5
minWidth = .5; 

// maxWidth: Maximum width of a line. Recommended: 2.5
maxWidth = 2.5; 

// penColor: Color used for the pen, as an RGB value. Example: rgb(0, 0, 255)
penColor = "rgb(0, 0, 255)"; // Color used for the pen, as an RGB value. Example: rgb(0, 0, 255)

// instructions: Optional instructions, displayed between the save and clear buttons.
instructions = "Please sign above.";

// fmpurl: FMP URL to use when the "Save" button is clicked. Example: fmp://$/FMEasySignature.fmp12?script=Example - Save Signature to Container
//fmpurl = "fmp://$/FMEasySignature.fmp12?script=FMP URL Handler - Save Signature to Container" // FMPURL to use when the "Save" button is clicked.
//Added to compute filename automatically
fmpurl = "fmp://$/"&Dashboard::NomeFileperfirma&"?script=FMP URL Handler - Save Signature to Container" // FMPURL to use when the "Save" button is clicked.


];



// HTML / Javascript template.
"data:text/html,<!doctype html>
¶<html lang=\"en\">
¶	<head>
¶		<meta charset=\"utf-8\">
¶		<title>FM EasySignature v1.0</title>
¶		<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no\">
¶		<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">	
¶		<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">
¶		<script type=\"text/javascript\">		
¶			// Signature Pad v1.3.3 | https://github.com/szimek/signature_pad
¶			// (c) 2014 Szymon Nowak | Released under the MIT license
¶			var SignaturePad=function(a){\"use strict\";var b=function(a,b){var c=b||{};this.velocityFilterWeight=c.velocityFilterWeight||.7,this.minWidth=c.minWidth||.5,this.maxWidth=c.maxWidth||2.5,this.dotSize=c.dotSize||function(){return(this.minWidth+this.maxWidth)/2},this.penColor=c.penColor||\"black\",this.backgroundColor=c.backgroundColor||\"rgba(0,0,0,0)\",this.onEnd=c.onEnd,this.onBegin=c.onBegin,this._canvas=a,this._ctx=a.getContext(\"2d\"),this.clear(),this._handleMouseEvents(),this._handleTouchEvents()};b.prototype.clear=function(){var a=this._ctx,b=this._canvas;a.fillStyle=this.backgroundColor,a.clearRect(0,0,b.width,b.height),a.fillRect(0,0,b.width,b.height),this._reset()},b.prototype.toDataURL=function(){var a=this._canvas;return a.toDataURL.apply(a,arguments)},b.prototype.fromDataURL=function(a){var b=this,c=new Image,d=window.devicePixelWidth||1,e=this._canvas.width/d,f=this._canvas.height/d;this._reset(),c.src=a,c.onload=function(){b._ctx.drawImage(c,0,0,e,f)},this._isEmpty=!1},b.prototype._strokeUpdate=function(a){var b=this._createPoint(a);this._addPoint(b)},b.prototype._strokeBegin=function(a){this._reset(),this._strokeUpdate(a),\"function\"==typeof this.onBegin&&this.onBegin(a)},b.prototype._strokeDraw=function(a){var b=this._ctx,c=\"function\"==typeof this.dotSize?this.dotSize():this.dotSize;b.beginPath(),this._drawPoint(a.x,a.y,c),b.closePath(),b.fill()},b.prototype._strokeEnd=function(a){var b=this.points.length>2,c=this.points[0];!b&&c&&this._strokeDraw(c),\"function\"==typeof this.onEnd&&this.onEnd(a)},b.prototype._handleMouseEvents=function(){var b=this;this._mouseButtonDown=!1,this._canvas.addEventListener(\"mousedown\",function(a){1===a.which&&(b._mouseButtonDown=!0,b._strokeBegin(a))}),this._canvas.addEventListener(\"mousemove\",function(a){b._mouseButtonDown&&b._strokeUpdate(a)}),a.addEventListener(\"mouseup\",function(a){1===a.which&&b._mouseButtonDown&&(b._mouseButtonDown=!1,b._strokeEnd(a))})},b.prototype._handleTouchEvents=function(){var b=this;this._canvas.style.msTouchAction=\"none\",this._canvas.addEventListener(\"touchstart\",function(a){var c=a.changedTouches[0];b._strokeBegin(c)}),this._canvas.addEventListener(\"touchmove\",function(a){a.preventDefault();var c=a.changedTouches[0];b._strokeUpdate(c)}),a.addEventListener(\"touchend\",function(a){var c=a.target===b._canvas;c&&b._strokeEnd(a)})},b.prototype.isEmpty=function(){return this._isEmpty},b.prototype._reset=function(){this.points=[],this._lastVelocity=0,this._lastWidth=(this.minWidth+this.maxWidth)/2,this._isEmpty=!0,this._ctx.fillStyle=this.penColor},b.prototype._createPoint=function(a){var b=this._canvas.getBoundingClientRect();return new c(a.clientX-b.left,a.clientY-b.top)},b.prototype._addPoint=function(a){var b,c,e,f,g=this.points;g.push(a),g.length>2&&(3===g.length&&g.unshift(g[0]),f=this._calculateCurveControlPoints(g[0],g[1],g[2]),b=f.c2,f=this._calculateCurveControlPoints(g[1],g[2],g[3]),c=f.c1,e=new d(g[1],b,c,g[2]),this._addCurve(e),g.shift())},b.prototype._calculateCurveControlPoints=function(a,b,d){var e=a.x-b.x,f=a.y-b.y,g=b.x-d.x,h=b.y-d.y,i={x:(a.x+b.x)/2,y:(a.y+b.y)/2},j={x:(b.x+d.x)/2,y:(b.y+d.y)/2},k=Math.sqrt(e*e+f*f),l=Math.sqrt(g*g+h*h),m=i.x-j.x,n=i.y-j.y,o=l/(k+l),p={x:j.x+m*o,y:j.y+n*o},q=b.x-p.x,r=b.y-p.y;return{c1:new c(i.x+q,i.y+r),c2:new c(j.x+q,j.y+r)}},b.prototype._addCurve=function(a){var b,c,d=a.startPoint,e=a.endPoint;b=e.velocityFrom(d),b=this.velocityFilterWeight*b+(1-this.velocityFilterWeight)*this._lastVelocity,c=this._strokeWidth(b),this._drawCurve(a,this._lastWidth,c),this._lastVelocity=b,this._lastWidth=c},b.prototype._drawPoint=function(a,b,c){var d=this._ctx;d.moveTo(a,b),d.arc(a,b,c,0,2*Math.PI,!1),this._isEmpty=!1},b.prototype._drawCurve=function(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o=this._ctx,p=c-b;for(d=Math.floor(a.length()),o.beginPath(),f=0;d>f;f++)g=f/d,h=g*g,i=h*g,j=1-g,k=j*j,l=k*j,m=l*a.startPoint.x,m+=3*k*g*a.control1.x,m+=3*j*h*a.control2.x,m+=i*a.endPoint.x,n=l*a.startPoint.y,n+=3*k*g*a.control1.y,n+=3*j*h*a.control2.y,n+=i*a.endPoint.y,e=b+i*p,this._drawPoint(m,n,e);o.closePath(),o.fill()},b.prototype._strokeWidth=function(a){return Math.max(this.maxWidth/(a+1),this.minWidth)};var c=function(a,b,c){this.x=a,this.y=b,this.time=c||(new Date).getTime()};c.prototype.velocityFrom=function(a){return this.time!==a.time?this.distanceTo(a)/(this.time-a.time):1},c.prototype.distanceTo=function(a){return Math.sqrt(Math.pow(this.x-a.x,2)+Math.pow(this.y-a.y,2))};var d=function(a,b,c,d){this.startPoint=a,this.control1=b,this.control2=c,this.endPoint=d};return d.prototype.length=function(){var a,b,c,d,e,f,g,h,i=10,j=0;for(a=0;i>=a;a++)b=a/i,c=this._point(b,this.startPoint.x,this.control1.x,this.control2.x,this.endPoint.x),d=this._point(b,this.startPoint.y,this.control1.y,this.control2.y,this.endPoint.y),a>0&&(g=c-e,h=d-f,j+=Math.sqrt(g*g+h*h)),e=c,f=d;return j},d.prototype._point=function(a,b,c,d,e){return b*(1-a)*(1-a)*(1-a)+3*c*(1-a)*(1-a)*a+3*d*(1-a)*a*a+e*a*a*a},b}(document);						
¶		</script>		
¶	</head>
¶	
¶	<body 
¶		onselectstart=\"return false\"
¶		style=\"
¶			height:100%;
¶			background: #fff;
¶			margin: 0;
¶			text-align: center;
¶			font-family: Helvetica, Sans-Serif;
¶			-moz-user-select: none;
¶			-webkit-user-select: none;
¶			-ms-user-select: none;\">
¶				
¶		<div style=\"height: 100vh; width: 100vw;\">
¶				
¶			<!-- Signature canvas. -->
¶			<canvas 
¶				id=\"easycanvas\" 
¶				style=\"
¶					background : #fff;
¶					width: 98%;
¶					height: 70%;				
¶					border: solid thin #ccc;
¶					border-radius: 8px;
¶					margin: 3px;\"></canvas>
¶					
¶			<!-- Clear and Save buttons -->
¶			<div style=\"text-align: center; font-size: 9pt;\">
¶				<button id=\"clear-button\" data-action=\"clear\" style=\"margin-right: 20px; font-size: 9pt; padding: 4px;\">Clear</button>
¶				" & instructions & "
¶				<button id=\"save-button\" data-action=\"save\" style=\"margin-left: 20px; font-size: 9pt; padding: 4px;\">Save</button>
¶			</div>							
¶					
¶		</div>
¶		
¶		<script type=\"text/javascript\">
¶
¶			// Get the canvas.
¶			var canvas = document.getElementById(\"easycanvas\");
¶
¶			// Adjust canvas coordinate space taking into account pixel ratio,
¶			// to make it look crisp on mobile devices.
¶			// This also causes canvas to be cleared.			
¶			function resizeCanvas() {
¶				var ratio =  window.devicePixelRatio || 1;
¶				canvas.width = canvas.offsetWidth * ratio;
¶				canvas.height = canvas.offsetHeight * ratio;
¶				canvas.getContext(\"2d\").scale(ratio, ratio);
¶			};
¶			
¶			
¶			// Resize the canvas at startup.
¶			resizeCanvas();
¶			
¶			
¶			// Also resize the canvas if the window is resized.
¶			window.onresize = resizeCanvas;
¶			
¶									
¶			// Init the signature pad.
¶			var signaturePad = new SignaturePad(canvas, {
¶				backgroundColor: \"" & backgroundColor & "\",
¶				minWidth: " & minWidth & ",
¶				maxWidth: " & maxWidth & ",
¶				penColor: \"" & penColor & "\"
¶			});	
¶			
¶
¶			
¶			// Clear button.
¶			var clearButton = document.getElementById(\"clear-button\");
¶			clearButton.addEventListener(\"click\", function (event) {
¶				signaturePad.clear();
¶			});
¶
¶
¶			
¶			// Save button.			
¶			var saveButton = document.getElementById(\"save-button\");
¶			saveButton.addEventListener(\"click\", function (event) {
¶			
¶				// If the signature pad isn't empty...
¶				if (! signaturePad.isEmpty() ) {
¶
¶					// Convert the canvas into a data URL.
¶					var dataURL = signaturePad.toDataURL();
¶			
¶					// Encode the data.
¶					var_encoded = encodeURIComponent ( dataURL );

					// Prep the URL to use for the hand-off to FM.
¶					var fullURL = '" & fmpurl & "&param=' + var_encoded;
¶			
¶					// Send the data to FM.
¶					window.location = fullURL;									
¶					
¶				};
¶				
¶			});
¶
¶		</script>		
¶		
¶	</body>
¶	
¶</html>"
)

2) Risultato della custom nel DB Originale B (funziona).

Codice: Seleziona tutto

data:text/html,<!doctype html> 
<html lang="en"> 
	<head> 
		<meta charset="utf-8"> 
		<title>FM EasySignature v1.0</title> 
		<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"> 
		<meta name="apple-mobile-web-app-capable" content="yes">	 
		<meta name="apple-mobile-web-app-status-bar-style" content="black"> 
		<script type="text/javascript">		 
			// Signature Pad v1.3.3 | https://github.com/szimek/signature_pad 
			// (c) 2014 Szymon Nowak | Released under the MIT license 
			var SignaturePad=function(a){"use strict";var b=function(a,b){var c=b||{};this.velocityFilterWeight=c.velocityFilterWeight||.7,this.minWidth=c.minWidth||.5,this.maxWidth=c.maxWidth||2.5,this.dotSize=c.dotSize||function(){return(this.minWidth+this.maxWidth)/2},this.penColor=c.penColor||"black",this.backgroundColor=c.backgroundColor||"rgba(0,0,0,0)",this.onEnd=c.onEnd,this.onBegin=c.onBegin,this._canvas=a,this._ctx=a.getContext("2d"),this.clear(),this._handleMouseEvents(),this._handleTouchEvents()};b.prototype.clear=function(){var a=this._ctx,b=this._canvas;a.fillStyle=this.backgroundColor,a.clearRect(0,0,b.width,b.height),a.fillRect(0,0,b.width,b.height),this._reset()},b.prototype.toDataURL=function(){var a=this._canvas;return a.toDataURL.apply(a,arguments)},b.prototype.fromDataURL=function(a){var b=this,c=new Image,d=window.devicePixelWidth||1,e=this._canvas.width/d,f=this._canvas.height/d;this._reset(),c.src=a,c.onload=function(){b._ctx.drawImage(c,0,0,e,f)},this._isEmpty=!1},b.prototype._strokeUpdate=function(a){var b=this._createPoint(a);this._addPoint(b)},b.prototype._strokeBegin=function(a){this._reset(),this._strokeUpdate(a),"function"==typeof this.onBegin&&this.onBegin(a)},b.prototype._strokeDraw=function(a){var b=this._ctx,c="function"==typeof this.dotSize?this.dotSize():this.dotSize;b.beginPath(),this._drawPoint(a.x,a.y,c),b.closePath(),b.fill()},b.prototype._strokeEnd=function(a){var b=this.points.length>2,c=this.points[0];!b&&c&&this._strokeDraw(c),"function"==typeof this.onEnd&&this.onEnd(a)},b.prototype._handleMouseEvents=function(){var b=this;this._mouseButtonDown=!1,this._canvas.addEventListener("mousedown",function(a){1===a.which&&(b._mouseButtonDown=!0,b._strokeBegin(a))}),this._canvas.addEventListener("mousemove",function(a){b._mouseButtonDown&&b._strokeUpdate(a)}),a.addEventListener("mouseup",function(a){1===a.which&&b._mouseButtonDown&&(b._mouseButtonDown=!1,b._strokeEnd(a))})},b.prototype._handleTouchEvents=function(){var b=this;this._canvas.style.msTouchAction="none",this._canvas.addEventListener("touchstart",function(a){var c=a.changedTouches[0];b._strokeBegin(c)}),this._canvas.addEventListener("touchmove",function(a){a.preventDefault();var c=a.changedTouches[0];b._strokeUpdate(c)}),a.addEventListener("touchend",function(a){var c=a.target===b._canvas;c&&b._strokeEnd(a)})},b.prototype.isEmpty=function(){return this._isEmpty},b.prototype._reset=function(){this.points=[],this._lastVelocity=0,this._lastWidth=(this.minWidth+this.maxWidth)/2,this._isEmpty=!0,this._ctx.fillStyle=this.penColor},b.prototype._createPoint=function(a){var b=this._canvas.getBoundingClientRect();return new c(a.clientX-b.left,a.clientY-b.top)},b.prototype._addPoint=function(a){var b,c,e,f,g=this.points;g.push(a),g.length>2&&(3===g.length&&g.unshift(g[0]),f=this._calculateCurveControlPoints(g[0],g[1],g[2]),b=f.c2,f=this._calculateCurveControlPoints(g[1],g[2],g[3]),c=f.c1,e=new d(g[1],b,c,g[2]),this._addCurve(e),g.shift())},b.prototype._calculateCurveControlPoints=function(a,b,d){var e=a.x-b.x,f=a.y-b.y,g=b.x-d.x,h=b.y-d.y,i={x:(a.x+b.x)/2,y:(a.y+b.y)/2},j={x:(b.x+d.x)/2,y:(b.y+d.y)/2},k=Math.sqrt(e*e+f*f),l=Math.sqrt(g*g+h*h),m=i.x-j.x,n=i.y-j.y,o=l/(k+l),p={x:j.x+m*o,y:j.y+n*o},q=b.x-p.x,r=b.y-p.y;return{c1:new c(i.x+q,i.y+r),c2:new c(j.x+q,j.y+r)}},b.prototype._addCurve=function(a){var b,c,d=a.startPoint,e=a.endPoint;b=e.velocityFrom(d),b=this.velocityFilterWeight*b+(1-this.velocityFilterWeight)*this._lastVelocity,c=this._strokeWidth(b),this._drawCurve(a,this._lastWidth,c),this._lastVelocity=b,this._lastWidth=c},b.prototype._drawPoint=function(a,b,c){var d=this._ctx;d.moveTo(a,b),d.arc(a,b,c,0,2*Math.PI,!1),this._isEmpty=!1},b.prototype._drawCurve=function(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o=this._ctx,p=c-b;for(d=Math.floor(a.length()),o.beginPath(),f=0;d>f;f++)g=f/d,h=g*g,i=h*g,j=1-g,k=j*j,l=k*j,m=l*a.startPoint.x,m+=3*k*g*a.control1.x,m+=3*j*h*a.control2.x,m+=i*a.endPoint.x,n=l*a.startPoint.y,n+=3*k*g*a.control1.y,n+=3*j*h*a.control2.y,n+=i*a.endPoint.y,e=b+i*p,this._drawPoint(m,n,e);o.closePath(),o.fill()},b.prototype._strokeWidth=function(a){return Math.max(this.maxWidth/(a+1),this.minWidth)};var c=function(a,b,c){this.x=a,this.y=b,this.time=c||(new Date).getTime()};c.prototype.velocityFrom=function(a){return this.time!==a.time?this.distanceTo(a)/(this.time-a.time):1},c.prototype.distanceTo=function(a){return Math.sqrt(Math.pow(this.x-a.x,2)+Math.pow(this.y-a.y,2))};var d=function(a,b,c,d){this.startPoint=a,this.control1=b,this.control2=c,this.endPoint=d};return d.prototype.length=function(){var a,b,c,d,e,f,g,h,i=10,j=0;for(a=0;i>=a;a++)b=a/i,c=this._point(b,this.startPoint.x,this.control1.x,this.control2.x,this.endPoint.x),d=this._point(b,this.startPoint.y,this.control1.y,this.control2.y,this.endPoint.y),a>0&&(g=c-e,h=d-f,j+=Math.sqrt(g*g+h*h)),e=c,f=d;return j},d.prototype._point=function(a,b,c,d,e){return b*(1-a)*(1-a)*(1-a)+3*c*(1-a)*(1-a)*a+3*d*(1-a)*a*a+e*a*a*a},b}(document);						 
		</script>		 
	</head> 
	 
	<body  
		onselectstart="return false" 
		style=" 
			height:100%; 
			background: #fff; 
			margin: 0; 
			text-align: center; 
			font-family: Helvetica, Sans-Serif; 
			-moz-user-select: none; 
			-webkit-user-select: none; 
			-ms-user-select: none;"> 
				 
		<div style="height: 100vh; width: 100vw;"> 
				 
			<!-- Signature canvas. --> 
			<canvas  
				id="easycanvas"  
				style=" 
					background : #fff; 
					width: 98%; 
					height: 70%;				 
					border: solid thin #ccc; 
					border-radius: 8px; 
					margin: 3px;"></canvas> 
					 
			<!-- Clear and Save buttons --> 
			<div style="text-align: center; font-size: 9pt;"> 
				<button id="clear-button" data-action="clear" style="margin-right: 20px; font-size: 9pt; padding: 4px;">Clear</button> 
				Please sign above. 
				<button id="save-button" data-action="save" style="margin-left: 20px; font-size: 9pt; padding: 4px;">Save</button> 
			</div>							 
					 
		</div> 
		 
		<script type="text/javascript"> 
 
			// Get the canvas. 
			var canvas = document.getElementById("easycanvas"); 
 
			// Adjust canvas coordinate space taking into account pixel ratio, 
			// to make it look crisp on mobile devices. 
			// This also causes canvas to be cleared.			 
			function resizeCanvas() { 
				var ratio =  window.devicePixelRatio || 1; 
				canvas.width = canvas.offsetWidth * ratio; 
				canvas.height = canvas.offsetHeight * ratio; 
				canvas.getContext("2d").scale(ratio, ratio); 
			}; 
			 
			 
			// Resize the canvas at startup. 
			resizeCanvas(); 
			 
			 
			// Also resize the canvas if the window is resized. 
			window.onresize = resizeCanvas; 
			 
									 
			// Init the signature pad. 
			var signaturePad = new SignaturePad(canvas, { 
				backgroundColor: "rgb(255, 255, 255)", 
				minWidth: .5, 
				maxWidth: 2.5, 
				penColor: "rgb(0, 0, 255)" 
			});	 
			 
 
			 
			// Clear button. 
			var clearButton = document.getElementById("clear-button"); 
			clearButton.addEventListener("click", function (event) { 
				signaturePad.clear(); 
			}); 
 
 
			 
			// Save button.			 
			var saveButton = document.getElementById("save-button"); 
			saveButton.addEventListener("click", function (event) { 
			 
				// If the signature pad isn't empty... 
				if (! signaturePad.isEmpty() ) { 
 
					// Convert the canvas into a data URL. 
					var dataURL = signaturePad.toDataURL(); 
			 
					// Encode the data. 
					var_encoded = encodeURIComponent ( dataURL );  					// Prep the URL to use for the hand-off to FM. 
					var fullURL = 'fmp://$/FMEasySignature - Mac & Windows.fmp12?script=FMP URL Handler - Save Signature to Container&param=' + var_encoded; 
			 
					// Send the data to FM. 
					window.location = fullURL;									 
					 
				}; 
				 
			}); 
 
		</script>		 
		 
	</body> 
	 
</html>

3) Risultato della custom nel mio DB (Non funziona).

Codice: Seleziona tutto

data:text/html,<!doctype html> 
<html lang="en"> 
	<head> 
		<meta charset="utf-8"> 
		<title>FM EasySignature v1.0</title> 
		<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"> 
		<meta name="apple-mobile-web-app-capable" content="yes">	 
		<meta name="apple-mobile-web-app-status-bar-style" content="black"> 
		<script type="text/javascript">		 
			// Signature Pad v1.3.3 | https://github.com/szimek/signature_pad 
			// (c) 2014 Szymon Nowak | Released under the MIT license 
			var SignaturePad=function(a){"use strict";var b=function(a,b){var c=b||{};this.velocityFilterWeight=c.velocityFilterWeight||.7,this.minWidth=c.minWidth||.5,this.maxWidth=c.maxWidth||2.5,this.dotSize=c.dotSize||function(){return(this.minWidth+this.maxWidth)/2},this.penColor=c.penColor||"black",this.backgroundColor=c.backgroundColor||"rgba(0,0,0,0)",this.onEnd=c.onEnd,this.onBegin=c.onBegin,this._canvas=a,this._ctx=a.getContext("2d"),this.clear(),this._handleMouseEvents(),this._handleTouchEvents()};b.prototype.clear=function(){var a=this._ctx,b=this._canvas;a.fillStyle=this.backgroundColor,a.clearRect(0,0,b.width,b.height),a.fillRect(0,0,b.width,b.height),this._reset()},b.prototype.toDataURL=function(){var a=this._canvas;return a.toDataURL.apply(a,arguments)},b.prototype.fromDataURL=function(a){var b=this,c=new Image,d=window.devicePixelWidth||1,e=this._canvas.width/d,f=this._canvas.height/d;this._reset(),c.src=a,c.onload=function(){b._ctx.drawImage(c,0,0,e,f)},this._isEmpty=!1},b.prototype._strokeUpdate=function(a){var b=this._createPoint(a);this._addPoint(b)},b.prototype._strokeBegin=function(a){this._reset(),this._strokeUpdate(a),"function"==typeof this.onBegin&&this.onBegin(a)},b.prototype._strokeDraw=function(a){var b=this._ctx,c="function"==typeof this.dotSize?this.dotSize():this.dotSize;b.beginPath(),this._drawPoint(a.x,a.y,c),b.closePath(),b.fill()},b.prototype._strokeEnd=function(a){var b=this.points.length>2,c=this.points[0];!b&&c&&this._strokeDraw(c),"function"==typeof this.onEnd&&this.onEnd(a)},b.prototype._handleMouseEvents=function(){var b=this;this._mouseButtonDown=!1,this._canvas.addEventListener("mousedown",function(a){1===a.which&&(b._mouseButtonDown=!0,b._strokeBegin(a))}),this._canvas.addEventListener("mousemove",function(a){b._mouseButtonDown&&b._strokeUpdate(a)}),a.addEventListener("mouseup",function(a){1===a.which&&b._mouseButtonDown&&(b._mouseButtonDown=!1,b._strokeEnd(a))})},b.prototype._handleTouchEvents=function(){var b=this;this._canvas.style.msTouchAction="none",this._canvas.addEventListener("touchstart",function(a){var c=a.changedTouches[0];b._strokeBegin(c)}),this._canvas.addEventListener("touchmove",function(a){a.preventDefault();var c=a.changedTouches[0];b._strokeUpdate(c)}),a.addEventListener("touchend",function(a){var c=a.target===b._canvas;c&&b._strokeEnd(a)})},b.prototype.isEmpty=function(){return this._isEmpty},b.prototype._reset=function(){this.points=[],this._lastVelocity=0,this._lastWidth=(this.minWidth+this.maxWidth)/2,this._isEmpty=!0,this._ctx.fillStyle=this.penColor},b.prototype._createPoint=function(a){var b=this._canvas.getBoundingClientRect();return new c(a.clientX-b.left,a.clientY-b.top)},b.prototype._addPoint=function(a){var b,c,e,f,g=this.points;g.push(a),g.length>2&&(3===g.length&&g.unshift(g[0]),f=this._calculateCurveControlPoints(g[0],g[1],g[2]),b=f.c2,f=this._calculateCurveControlPoints(g[1],g[2],g[3]),c=f.c1,e=new d(g[1],b,c,g[2]),this._addCurve(e),g.shift())},b.prototype._calculateCurveControlPoints=function(a,b,d){var e=a.x-b.x,f=a.y-b.y,g=b.x-d.x,h=b.y-d.y,i={x:(a.x+b.x)/2,y:(a.y+b.y)/2},j={x:(b.x+d.x)/2,y:(b.y+d.y)/2},k=Math.sqrt(e*e+f*f),l=Math.sqrt(g*g+h*h),m=i.x-j.x,n=i.y-j.y,o=l/(k+l),p={x:j.x+m*o,y:j.y+n*o},q=b.x-p.x,r=b.y-p.y;return{c1:new c(i.x+q,i.y+r),c2:new c(j.x+q,j.y+r)}},b.prototype._addCurve=function(a){var b,c,d=a.startPoint,e=a.endPoint;b=e.velocityFrom(d),b=this.velocityFilterWeight*b+(1-this.velocityFilterWeight)*this._lastVelocity,c=this._strokeWidth(b),this._drawCurve(a,this._lastWidth,c),this._lastVelocity=b,this._lastWidth=c},b.prototype._drawPoint=function(a,b,c){var d=this._ctx;d.moveTo(a,b),d.arc(a,b,c,0,2*Math.PI,!1),this._isEmpty=!1},b.prototype._drawCurve=function(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o=this._ctx,p=c-b;for(d=Math.floor(a.length()),o.beginPath(),f=0;d>f;f++)g=f/d,h=g*g,i=h*g,j=1-g,k=j*j,l=k*j,m=l*a.startPoint.x,m+=3*k*g*a.control1.x,m+=3*j*h*a.control2.x,m+=i*a.endPoint.x,n=l*a.startPoint.y,n+=3*k*g*a.control1.y,n+=3*j*h*a.control2.y,n+=i*a.endPoint.y,e=b+i*p,this._drawPoint(m,n,e);o.closePath(),o.fill()},b.prototype._strokeWidth=function(a){return Math.max(this.maxWidth/(a+1),this.minWidth)};var c=function(a,b,c){this.x=a,this.y=b,this.time=c||(new Date).getTime()};c.prototype.velocityFrom=function(a){return this.time!==a.time?this.distanceTo(a)/(this.time-a.time):1},c.prototype.distanceTo=function(a){return Math.sqrt(Math.pow(this.x-a.x,2)+Math.pow(this.y-a.y,2))};var d=function(a,b,c,d){this.startPoint=a,this.control1=b,this.control2=c,this.endPoint=d};return d.prototype.length=function(){var a,b,c,d,e,f,g,h,i=10,j=0;for(a=0;i>=a;a++)b=a/i,c=this._point(b,this.startPoint.x,this.control1.x,this.control2.x,this.endPoint.x),d=this._point(b,this.startPoint.y,this.control1.y,this.control2.y,this.endPoint.y),a>0&&(g=c-e,h=d-f,j+=Math.sqrt(g*g+h*h)),e=c,f=d;return j},d.prototype._point=function(a,b,c,d,e){return b*(1-a)*(1-a)*(1-a)+3*c*(1-a)*(1-a)*a+3*d*(1-a)*a*a+e*a*a*a},b}(document);						 
		</script>		 
	</head> 
	 
	<body  
		onselectstart="return false" 
		style=" 
			height:100%; 
			background: #fff; 
			margin: 0; 
			text-align: center; 
			font-family: Helvetica, Sans-Serif; 
			-moz-user-select: none; 
			-webkit-user-select: none; 
			-ms-user-select: none;"> 
				 
		<div style="height: 100vh; width: 100vw;"> 
				 
			<!-- Signature canvas. --> 
			<canvas  
				id="easycanvas"  
				style=" 
					background : #fff; 
					width: 98%; 
					height: 70%;				 
					border: solid thin #ccc; 
					border-radius: 8px; 
					margin: 3px;"></canvas> 
					 
			<!-- Clear and Save buttons --> 
			<div style="text-align: center; font-size: 9pt;"> 
				<button id="clear-button" data-action="clear" style="margin-right: 20px; font-size: 9pt; padding: 4px;">Clear</button> 
				Please sign above. 
				<button id="save-button" data-action="save" style="margin-left: 20px; font-size: 9pt; padding: 4px;">Save</button> 
			</div>							 
					 
		</div> 
		 
		<script type="text/javascript"> 
 
			// Get the canvas. 
			var canvas = document.getElementById("easycanvas"); 
 
			// Adjust canvas coordinate space taking into account pixel ratio, 
			// to make it look crisp on mobile devices. 
			// This also causes canvas to be cleared.			 
			function resizeCanvas() { 
				var ratio =  window.devicePixelRatio || 1; 
				canvas.width = canvas.offsetWidth * ratio; 
				canvas.height = canvas.offsetHeight * ratio; 
				canvas.getContext("2d").scale(ratio, ratio); 
			}; 
			 
			 
			// Resize the canvas at startup. 
			resizeCanvas(); 
			 
			 
			// Also resize the canvas if the window is resized. 
			window.onresize = resizeCanvas; 
			 
									 
			// Init the signature pad. 
			var signaturePad = new SignaturePad(canvas, { 
				backgroundColor: "rgb(255, 255, 255)", 
				minWidth: ,5, 
				maxWidth: 2,5, 
				penColor: "rgb(0, 0, 255)" 
			});	 
			 
 
			 
			// Clear button. 
			var clearButton = document.getElementById("clear-button"); 
			clearButton.addEventListener("click", function (event) { 
				signaturePad.clear(); 
			}); 
 
 
			 
			// Save button.			 
			var saveButton = document.getElementById("save-button"); 
			saveButton.addEventListener("click", function (event) { 
			 
				// If the signature pad isn't empty... 
				if (! signaturePad.isEmpty() ) { 
 
					// Convert the canvas into a data URL. 
					var dataURL = signaturePad.toDataURL(); 
			 
					// Encode the data. 
					var_encoded = encodeURIComponent ( dataURL );  					// Prep the URL to use for the hand-off to FM. 
					var fullURL = 'fmp://$/Studio Privato 2.4 (Script Veloce).fmp12?script=FMP URL Handler - Save Signature to Container&param=' + var_encoded; 
			 
					// Send the data to FM. 
					window.location = fullURL;									 
					 
				}; 
				 
			}); 
 
		</script>		 
		 
	</body> 
	 
</html>

Re: Funzione personalizzata errore importazione

Inviato: mercoledì 9 febbraio 2022, 12:53
da fabio.beri
Tra i due risultati, cambia solamente il nome del file.

Perché non fa una prova cambiando il nome del file da "Studio Privato 2.4 (Script Veloce)" a "FMEasySignature - Mac & Windows".

Le parentesi, negli url vengono codificate, quindi cambia il nome alla chiamata.

Attendo l'esito.

Re: Funzione personalizzata errore importazione

Inviato: mercoledì 9 febbraio 2022, 15:26
da GiuseppeFM
La ringrazio.
In realtà analizzando i due testi con un editor esterno mi dava delle differenze, ma guardandoli qui ora anche io non ne trovo.
Ho provato a usare tutti i nomi possibili ed immaginabili (anche una singola lettera!) ma niente...
La cosa strana è che non sono tanto gli script a non funzionare, quanto il visualizzatore web...o meglio. FM lo crea, comprensivo di background, pulsanti e scritta, ma se provo a firmarci sopra, non visualizza niente.
Se però lo importo con gli stessi medesimo passaggi in un DB "vergine" funziona alla grande....non capisco cosa possa impedirmi di "disegnare" la firma nel mio Db.....

Re: Funzione personalizzata errore importazione

Inviato: lunedì 14 febbraio 2022, 19:40
da GiuseppeFM
Ciao....
Per cercare di essere più "chiaro" ho epurato il mio DB da ogni tabella, script e altro e ho importato nel file la funzione di FMEASYSIGNATURE (che non funziona).
Ho poi creato un nuovo DB Vergine, ed ho seguito gli stessi passaggi per l'importazione....e magicamente funziona...

Così a occhio mi pare che il problema sia nel mio file...come se qualche impostazione in qualche modo modificasse la sintassi della funzione personalizzata....ma proprio non riesco a capire ne come ne dove...

Vi allego il due file...magari voi riuscite a capirci qualcosa in più...
Grazie.
Archivio.zip

Re: Funzione personalizzata errore importazione  Risolto!

Inviato: lunedì 21 febbraio 2022, 15:22
da GiuseppeFM
Me la canto e me la suono da solo….

Nella CF, le variabili:

Codice: Seleziona tutto

 minWidth: Minimum width of a line. Recommended: .5
minWidth = .5; 

// maxWidth: Maximum width of a line. Recommended: 2.5
maxWidth = 2.5; 
Andavano inserite con le “ “…. Ovvero:

Codice: Seleziona tutto

 minWidth: Minimum width of a line. Recommended: .5
minWidth = “.5”; 

// maxWidth: Maximum width of a line. Recommended: 2.5
maxWidth = “2.5”; 

Questo però solo nel mio db….nei nuovi no….boh..

Re: Funzione personalizzata errore importazione

Inviato: domenica 27 marzo 2022, 10:40
da helpwithmypc
anche se contrassegnato come risolto io ho trovato questo Addon completamente personalizzabile, adattabile e perfettamente utilizzabile in ogni ambiente (win mac webdirect) https://kyologic.com/2020/06/17/esignature-addon/. Non riuscivo ad implementare in alcun modo questa soluzione qui proposta anche con le soluzioni proposte.. ma dopo diverse ricerche questo addon appena implementato e fatte alcune modifiche funzionamento perfetto in tutti gli ambienti :)

Re: Funzione personalizzata errore importazione

Inviato: domenica 27 marzo 2022, 22:31
da GiuseppeFM
VEro, però questo add-on funziona solo con FM 19....con le versioni precedenti non va...