From a57b64df872bf19c06c24da6f12164ea7c77a7d2 Mon Sep 17 00:00:00 2001 From: Andrea Zagli Date: Mon, 29 Jun 2020 17:43:12 +0200 Subject: [PATCH] Different way to render some control on Bootstrap v4. --- src/form.c | 38 +++++++++++++++++++++- src/form.h | 5 ++- src/formelement.c | 71 +++++++++++++++++++++++++++++++++++++++-- src/formelement.h | 5 ++- src/formelementcheck.c | 25 +++++++++++---- src/formelementradio.c | 35 ++++++++++++++------ src/formelementsubmit.c | 17 +++++++--- 7 files changed, 169 insertions(+), 27 deletions(-) diff --git a/src/form.c b/src/form.c index 1b2e494..cc01b2d 100644 --- a/src/form.c +++ b/src/form.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2016 Andrea Zagli + * Copyright (C) 2015-2020 Andrea Zagli * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -50,6 +50,7 @@ struct _ZakFormCgiFormPrivate ZakCgiMain *zakcgimain; GHashTable *ht_attrs; GPtrArray *ar_elems; + gchar *bootstrap_version; }; G_DEFINE_TYPE (ZakFormCgiForm, zak_form_cgi_form, ZAK_FORM_TYPE_FORM) @@ -99,6 +100,7 @@ zak_form_cgi_form_init (ZakFormCgiForm *zak_form_cgi_form) priv->zakcgimain = NULL; priv->ht_attrs = NULL; priv->ar_elems = ZAK_FORM_FORM_CLASS (zak_form_cgi_form_parent_class)->get_elements (ZAK_FORM_FORM (zak_form_cgi_form)); + priv->bootstrap_version = g_strdup ("3"); } /** @@ -335,6 +337,40 @@ gchar return g_strdup (str->str); } +void +zak_form_cgi_form_set_bootstrap_version (ZakFormCgiForm *zakcgiform, const gchar *version) +{ + guint i; + + ZakFormCgiFormPrivate *priv; + + priv = ZAK_FORM_CGI_FORM_GET_PRIVATE (zakcgiform); + + if (priv->bootstrap_version != NULL) + { + g_free (priv->bootstrap_version); + } + priv->bootstrap_version = g_strdup (version); + + /* for each element */ + for (i = 0; i < priv->ar_elems->len; i++) + { + ZakFormCgiFormElement *element = (ZakFormCgiFormElement *)g_ptr_array_index (priv->ar_elems, i); + + zak_form_cgi_form_element_set_bootstrap_version (element, priv->bootstrap_version); + } +} + +gchar +*zak_form_cgi_form_get_bootstrap_version (ZakFormCgiForm *zakcgiform) +{ + ZakFormCgiFormPrivate *priv; + + priv = ZAK_FORM_CGI_FORM_GET_PRIVATE (zakcgiform); + + return g_strdup (priv->bootstrap_version); +} + /* PRIVATE */ static void zak_form_cgi_form_set_property (GObject *object, diff --git a/src/form.h b/src/form.h index bb988c8..c152906 100644 --- a/src/form.h +++ b/src/form.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2016 Andrea Zagli + * Copyright (C) 2015-2020 Andrea Zagli * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -47,6 +47,9 @@ void zak_form_cgi_form_bind (ZakFormCgiForm *zakcgiform); gchar *zak_form_cgi_form_render_start (ZakFormCgiForm *zakcgiform); gchar *zak_form_cgi_form_render (ZakFormCgiForm *zakcgiform); +void zak_form_cgi_form_set_bootstrap_version (ZakFormCgiForm *zakcgiform, const gchar *version); +gchar *zak_form_cgi_form_get_bootstrap_version (ZakFormCgiForm *zakcgiform); + G_END_DECLS diff --git a/src/formelement.c b/src/formelement.c index 7ee4a2f..9934afb 100644 --- a/src/formelement.c +++ b/src/formelement.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2017 Andrea Zagli + * Copyright (C) 2015-2020 Andrea Zagli * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -24,6 +24,8 @@ #include #include "formelement.h" +#include "formelementcheck.h" +#include "formelementradio.h" enum { @@ -65,6 +67,7 @@ struct _ZakFormCgiFormElementPrivate GHashTable *ht_attrs; GHashTable *ht_label_attrs; GValue *value; + gchar *bootstrap_version; }; G_DEFINE_TYPE (ZakFormCgiFormElement, zak_form_cgi_form_element, ZAK_FORM_TYPE_ELEMENT) @@ -99,6 +102,7 @@ zak_form_cgi_form_element_init (ZakFormCgiFormElement *zak_form_cgi_form_element priv->ht_attrs = NULL; priv->ht_label_attrs = NULL; + priv->bootstrap_version = g_strdup ("3"); } gchar @@ -196,7 +200,10 @@ gchar if (messages != NULL && messages->len > 0) { - g_string_append (str, " has-error"); + if (g_strcmp0 (priv->bootstrap_version, "3") == 0) + { + g_string_append (str, " has-error"); + } } g_string_append (str, "\">\n"); @@ -227,11 +234,35 @@ gchar g_hash_table_insert (priv->ht_attrs, "class", g_strdup ("form-control")); } + if (messages != NULL + && messages->len > 0) + { + if (g_strcmp0 (priv->bootstrap_version, "4") == 0) + { + g_hash_table_insert (priv->ht_attrs, "class", g_strdup_printf ("%s is-invalid", g_hash_table_lookup (priv->ht_attrs, "class"))); + } + } + if (!zak_form_element_get_editable (ZAK_FORM_ELEMENT (element))) { g_hash_table_insert (priv->ht_attrs, (gpointer)"readonly", (gpointer)"readonly"); } + if ((ZAK_FORM_CGI_IS_FORM_ELEMENT_CHECK (element) + || ZAK_FORM_CGI_IS_FORM_ELEMENT_RADIO (element)) + && g_strcmp0 (zak_form_cgi_form_element_get_bootstrap_version (element), "4") == 0) + { + g_string_append (str, "
\n"); + } + g_string_append (str, ZAK_FORM_CGI_FORM_ELEMENT_GET_CLASS (element)->render (element)); } @@ -240,13 +271,21 @@ gchar for (i = 0; i < messages->len; i++) { g_string_append_printf (str, - "\n%s", + "\n%s", priv->id, i + 1, + g_strcmp0 (priv->bootstrap_version, "4") == 0 ? "invalid-feedback" : "help-block", (gchar *)g_ptr_array_index (messages, i)); } } + if ((ZAK_FORM_CGI_IS_FORM_ELEMENT_CHECK (element) + || ZAK_FORM_CGI_IS_FORM_ELEMENT_RADIO (element)) + && g_strcmp0 (zak_form_cgi_form_element_get_bootstrap_version (element), "4") == 0) + { + g_string_append (str, "
\n"); + } + g_string_append (str, "\n\n"); ret = g_strdup (str->str); @@ -300,6 +339,32 @@ gchar return ret; } +void +zak_form_cgi_form_element_set_bootstrap_version (ZakFormCgiFormElement *element, const gchar *version) +{ + guint i; + + ZakFormCgiFormElementPrivate *priv; + + priv = ZAK_FORM_CGI_FORM_ELEMENT_GET_PRIVATE (element); + + if (priv->bootstrap_version != NULL) + { + g_free (priv->bootstrap_version); + } + priv->bootstrap_version = g_strdup (version); +} + +gchar +*zak_form_cgi_form_element_get_bootstrap_version (ZakFormCgiFormElement *element) +{ + ZakFormCgiFormElementPrivate *priv; + + priv = ZAK_FORM_CGI_FORM_ELEMENT_GET_PRIVATE (element); + + return g_strdup (priv->bootstrap_version); +} + /* PRIVATE */ static void zak_form_cgi_form_element_construct (ZakFormCgiFormElement *element, diff --git a/src/formelement.h b/src/formelement.h index 7908571..c2a0eeb 100644 --- a/src/formelement.h +++ b/src/formelement.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2017 Andrea Zagli + * Copyright (C) 2015-2020 Andrea Zagli * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -55,6 +55,9 @@ void zak_form_cgi_form_element_bind (ZakFormCgiFormElement *element, GValue *val gchar *zak_form_cgi_form_element_render (ZakFormCgiFormElement *element); gchar *zak_form_cgi_form_element_render_label (ZakFormCgiFormElement *element); +void zak_form_cgi_form_element_set_bootstrap_version (ZakFormCgiFormElement *element, const gchar *version); +gchar *zak_form_cgi_form_element_get_bootstrap_version (ZakFormCgiFormElement *element); + G_END_DECLS diff --git a/src/formelementcheck.c b/src/formelementcheck.c index 157b23b..770a292 100644 --- a/src/formelementcheck.c +++ b/src/formelementcheck.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2017 Andrea Zagli + * Copyright (C) 2015-2020 Andrea Zagli * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -266,12 +266,23 @@ static gchar g_free (attr_class); } - g_string_append_printf (str, "\n%s\n%s %s%s", - priv->in_line ? "" : "
\n", - priv->in_line ? " class=\"checkbox-inline\"" : "", - zak_cgi_tag_tag_ht ("input", zak_form_cgi_form_element_get_id (element), ht_attrs), - zak_form_cgi_form_element_check_get_text (ZAK_FORM_CGI_FORM_ELEMENT_CHECK (element)), - priv->in_line ? "" : "\n

"); + if (g_strcmp0 (zak_form_cgi_form_element_get_bootstrap_version (element), "3") == 0) + { + g_string_append_printf (str, "\n%s\n%s %s%s", + priv->in_line ? "" : "
\n", + priv->in_line ? " class=\"checkbox-inline\"" : "", + zak_cgi_tag_tag_ht ("input", zak_form_cgi_form_element_get_id (element), ht_attrs), + zak_form_cgi_form_element_check_get_text (ZAK_FORM_CGI_FORM_ELEMENT_CHECK (element)), + priv->in_line ? "" : "\n

"); + } + else + { + g_hash_table_insert (ht_attrs, "class", g_strdup_printf ("%s form-check-input", g_hash_table_lookup (ht_attrs, "class"))); + + g_string_append_printf (str, "\n%s", + zak_cgi_tag_tag_ht ("input", zak_form_cgi_form_element_get_id (element), ht_attrs), + zak_form_cgi_form_element_check_get_text (ZAK_FORM_CGI_FORM_ELEMENT_CHECK (element))); + } if (ht_label_attrs != NULL) { diff --git a/src/formelementradio.c b/src/formelementradio.c index 8b00088..eaff505 100644 --- a/src/formelementradio.c +++ b/src/formelementradio.c @@ -276,16 +276,31 @@ gchar g_hash_table_insert (ht_attrs_option, (gpointer)"checked", (gpointer)"checked"); } - g_string_append_printf (ret, "\n%s\n%s %s%s", - priv->in_line ? "" : "
\n", - priv->in_line ? " class=\"radio-inline\"" : "", - zak_cgi_tag_tag_ht ("input", - g_strdup_printf ("%s_%d", - zak_form_cgi_form_element_get_id (element), - idx + 1), - ht_attrs_option), - opt->content, - priv->in_line ? "" : "\n
"); + if (g_strcmp0 (zak_form_cgi_form_element_get_bootstrap_version (element), "3") == 0) + { + g_string_append_printf (ret, "\n%s\n%s %s%s", + priv->in_line ? "" : "
\n", + priv->in_line ? " class=\"radio-inline\"" : "", + zak_cgi_tag_tag_ht ("input", + g_strdup_printf ("%s_%d", + zak_form_cgi_form_element_get_id (element), + idx + 1), + ht_attrs_option), + opt->content, + priv->in_line ? "" : "\n
"); + } + else + { + /* g_hash_table_insert (ht_attrs_option, "class", g_strdup_printf ("%s form-check-input", g_hash_table_lookup (ht_attrs_option, "class"))); */ + + g_string_append_printf (ret, "\n%s", + zak_cgi_tag_tag_ht ("input", + g_strdup_printf ("%s_%d", + zak_form_cgi_form_element_get_id (element), + idx + 1), + ht_attrs_option), + opt->content); + } g_hash_table_unref (ht_attrs_option); diff --git a/src/formelementsubmit.c b/src/formelementsubmit.c index 67f091d..3493339 100644 --- a/src/formelementsubmit.c +++ b/src/formelementsubmit.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2017 Andrea Zagli + * Copyright (C) 2015-2020 Andrea Zagli * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -187,9 +187,16 @@ static gchar g_string_erase (str_attr_class, form_control - str_attr_class->str, 12); } - if (g_strstr_len (attr_class, -1, "btn btn-default") == NULL) + if (g_strcmp0 (zak_form_cgi_form_element_get_bootstrap_version (element), "3") == 0) { - g_hash_table_insert (ht_attrs, "class", g_strdup_printf ("%s btn btn-default", str_attr_class->str)); + if (g_strstr_len (attr_class, -1, "btn btn-default") == NULL) + { + g_hash_table_insert (ht_attrs, "class", g_strdup_printf ("%s btn btn-default", str_attr_class->str)); + } + } + else + { + g_hash_table_insert (ht_attrs, "class", g_strdup_printf ("%s btn", str_attr_class->str)); } g_free (attr_class); @@ -197,7 +204,9 @@ static gchar } else { - g_hash_table_replace (ht_attrs, g_strdup ("class"), g_strdup ("btn btn-default")); + g_hash_table_replace (ht_attrs, g_strdup ("class"), + g_strdup_printf ("btn%s", + g_strcmp0 (zak_form_cgi_form_element_get_bootstrap_version (element), "3") == 0 ? " btn-default" : "")); } ret = zak_cgi_tag_submit_ht (zak_form_cgi_form_element_get_id (element), ht_attrs); -- 2.49.0