From: Andrea Zagli <azagli@libero.it>
Date: Mon, 20 Jul 2020 08:52:50 +0000 (+0200)
Subject: Real time validation on lost focus via js.
X-Git-Url: https://saetta.ns0.it/gitweb?a=commitdiff_plain;h=4dc999d2fc943bcb671dc843e29a4feca972eae0;p=zakform%2Ftests

Real time validation on lost focus via js.
---

diff --git a/.gitignore b/.gitignore
index 17b9837..63be726 100644
--- a/.gitignore
+++ b/.gitignore
@@ -50,7 +50,9 @@ intltool-*
 Rules-quot
 *.exe
 *.csv
-cgi_ini*
+cgi_ini
+cgi_ini_b4
+cgi_validate
 cgi_render_each_element
 get_elements
 get_element_filters
diff --git a/src/Makefile.am b/src/Makefile.am
index 7abcd18..e831c29 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -11,6 +11,7 @@ noinst_PROGRAMS = \
                   cgi_ini \
                   cgi_ini_b4 \
                   cgi_render_each_element \
+                  cgi_validate \
                   get_elements \
                   get_element_filters \
                   get_element_validators \
diff --git a/src/cgi.js b/src/cgi.js
index 970dd3c..7b0faec 100644
--- a/src/cgi.js
+++ b/src/cgi.js
@@ -1,3 +1,25 @@
+$(document).ready (function (){
+	$("#birthday").focusout (function (){
+		alert("focusout");
+
+		var element = $(this);
+		$.ajax ({
+			url: '/zakformtests/cgi_validate',
+			data: 'f=' + $(this).attr('name') + '&v=' + $(this).val(),
+		    type: 'get',
+		    success: function (data) {
+				alert (data + element.attr('name'));
+				$("#spanMsg_" + element.attr('name')).remove();
+				if (data != '')
+				{
+					element.addClass("is-invalid");
+					element.parent().append("<span id=\"spanMsg_" + element.attr('name') + "\" class=\"invalid-feedback\">" + data + "</span>");
+				}
+			}
+		});
+	});
+});
+
 function click_add ()
 {
 	alert ("add");
diff --git a/src/cgi_ini_b4.c b/src/cgi_ini_b4.c
index ff8fd71..7d177ce 100644
--- a/src/cgi_ini_b4.c
+++ b/src/cgi_ini_b4.c
@@ -148,10 +148,10 @@ main (int argc, char *argv[])
 
 	g_string_append (str,
 	                 "\n</div>\n"
-	                 "<script src=\"https://code.jquery.com/jquery-3.5.1.slim.min.js\"></script>\n"
+	                 "<script src=\"https://code.jquery.com/jquery-3.5.1.min.js\"></script>\n"
 	                 "<script src=\"https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js\"></script>\n"
 	                 "<script src=\"https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js\"></script>\n"
-	                 "<script src=\"cgi.js\"></script>\n"
+	                 "<script src=\"cgi.js\" language=\"javascript\" type=\"text/javascript\"></script>\n"
 	                 "</body>\n"
 	                 "</html>");
 
diff --git a/src/cgi_validate.c b/src/cgi_validate.c
new file mode 100644
index 0000000..b5a1344
--- /dev/null
+++ b/src/cgi_validate.c
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2016-2020 Andrea Zagli <azagli@libero.it>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#endif
+
+#include <unistd.h>
+#include <locale.h>
+
+#include <libzakcgi/libzakcgi.h>
+#include <libzakform/libzakform.h>
+#include <libzakformcgi/libzakformcgi.h>
+#include <libzakutils/libzakutils.h>
+
+int
+main (int argc, char *argv[])
+{
+	ZakCgiMain *zakcgimain;
+
+	GString *str;
+
+	GValue *val;
+	gchar *field;
+	gchar *value;
+
+	ZakFormCgiForm *form;
+
+	ZakFormElement *element;
+
+	setlocale (LC_ALL, "");
+
+	zakcgimain = zak_cgi_main_new ();
+
+	str = g_string_new ("");
+
+	val = zak_cgi_main_get_parameter (zakcgimain, "f");
+	if (val != NULL)
+		{
+			field = (gchar *)g_value_get_string (val);
+			g_warning ("RET field %s", field);
+		}
+	else
+		{
+			g_warning ("RET no field");
+			zak_cgi_main_out (NULL, str->str);
+			return 0;
+		}
+
+	val = zak_cgi_main_get_parameter (zakcgimain, "v");
+	if (val != NULL)
+		{
+			value = (gchar *)g_value_get_string (val);
+			g_warning ("RET value %s", value);
+		}
+	else
+		{
+			g_warning ("RET no value");
+			zak_cgi_main_out (NULL, str->str);
+			return 0;
+		}
+
+	form = zak_form_cgi_form_new (zakcgimain,
+	                              NULL);
+
+	if (zak_form_form_load_from_file (ZAK_FORM_FORM (form), XMLDIR "/cgi.xml"))
+		{
+			element = zak_form_form_get_element_by_id (ZAK_FORM_FORM (form), field);
+			if (element != NULL)
+				{
+					zak_form_cgi_form_element_bind  (ZAK_FORM_CGI_FORM_ELEMENT (element), zak_utils_gvalue_new_string (value));
+					if (!zak_form_element_is_valid (element))
+						{
+							g_warning ("RET not valid");
+
+							guint i;
+							GPtrArray *messages = zak_form_element_get_messages (element);
+
+							for (i = 0; i < messages->len; i++)
+								{
+									g_string_append_printf (str, "%s<br/>\n", (gchar *)g_ptr_array_index (messages, i));
+								}
+						}
+				}
+			else
+				{
+					g_string_append_printf (str, "Element «%s» not found", field);
+				}
+		}
+	g_warning("RET %s",str->str);
+	zak_cgi_main_out (NULL, str->str);
+
+	return 0;
+}