From e44ac15d678350901809bc1c0036158fb38cad7f Mon Sep 17 00:00:00 2001
From: Florent Torregrosa
 <14238-florenttorregrosa@users.noreply.drupalcode.org>
Date: Fri, 2 Sep 2022 12:00:23 +0200
Subject: [PATCH 1/2] Issue #3307507: Support international phone

---
 ...clientside_validation_jquery.libraries.yml |  6 ++
 .../js/cv.intltelinput.method.js              | 14 ++++
 .../Plugin/CvValidator/PhoneInternational.php | 70 +++++++++++++++++++
 3 files changed, 90 insertions(+)
 create mode 100644 clientside_validation_jquery/js/cv.intltelinput.method.js
 create mode 100644 clientside_validation_jquery/src/Plugin/CvValidator/PhoneInternational.php

diff --git a/clientside_validation_jquery/clientside_validation_jquery.libraries.yml b/clientside_validation_jquery/clientside_validation_jquery.libraries.yml
index 23a090c..7ce378e 100755
--- a/clientside_validation_jquery/clientside_validation_jquery.libraries.yml
+++ b/clientside_validation_jquery/clientside_validation_jquery.libraries.yml
@@ -26,6 +26,12 @@ cv.pattern.method:
     js/cv.pattern.method.js: {}
   dependencies:
     - clientside_validation_jquery/jquery.validate
+cv.intltelinput.method:
+  js:
+    js/cv.intltelinput.method.js: {}
+  dependencies:
+    - clientside_validation_jquery/jquery.validate
+    - phone_international/phone_international
 cv.jquery.validate:
   js:
     js/cv.jquery.validate.js: {}
diff --git a/clientside_validation_jquery/js/cv.intltelinput.method.js b/clientside_validation_jquery/js/cv.intltelinput.method.js
new file mode 100644
index 0000000..7480ab4
--- /dev/null
+++ b/clientside_validation_jquery/js/cv.intltelinput.method.js
@@ -0,0 +1,14 @@
+/**
+ * @file
+ * Add validation on phone international.
+ */
+(function ($) {
+  $.validator.addMethod('phone_international', function (value, element, param) {
+    if (this.optional(element)) {
+      return true;
+    }
+
+    var iti = window.intlTelInputGlobals.getInstance(element);
+    return !!iti.isValidNumber();
+  }, 'Invalid format.');
+})(jQuery);
diff --git a/clientside_validation_jquery/src/Plugin/CvValidator/PhoneInternational.php b/clientside_validation_jquery/src/Plugin/CvValidator/PhoneInternational.php
new file mode 100644
index 0000000..91a3717
--- /dev/null
+++ b/clientside_validation_jquery/src/Plugin/CvValidator/PhoneInternational.php
@@ -0,0 +1,70 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\clientside_validation_jquery\Plugin\CvValidator;
+
+use Drupal\clientside_validation\CvValidatorBase;
+use Drupal\Core\Form\FormStateInterface;
+
+/**
+ * Provides a 'Phone international' validator.
+ *
+ * @CvValidator(
+ *     id = "phone_international",
+ *     name = @Translation("International phone"),
+ *     supports = {
+ *         "types" = {
+ *             "phone_international"
+ *         }
+ *     },
+ *     attachments = {
+ *         "library" = {
+ *             "clientside_validation_jquery/cv.intltelinput.method"
+ *         }
+ *     }
+ * )
+ */
+class PhoneInternational extends CvValidatorBase {
+
+  /**
+   * International phone rule.
+   *
+   * @param array $element
+   *   Element to validate.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The form state object.
+   *
+   * @return array[]
+   *   List of messages and rules.
+   */
+  protected function getRules($element, FormStateInterface $form_state) { // phpcs:ignore
+    $message = $element['#phone_international_error'] ??
+      $this->t('@title is not in a valid international phone number.', [
+        '@title' => $this->getElementTitle($element),
+      ]);
+
+    return [
+      'rules' => [
+        $this->pluginId => TRUE,
+      ],
+      'messages' => [
+        $this->pluginId => $message,
+      ],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function addValidation(array &$element, FormStateInterface $form_state) {
+    parent::addValidation($element, $form_state);
+
+    // Put attributes on the tel child element.
+    $element['int_phone']['#attributes']["data-rule-$this->pluginId"] = $element['#attributes']["data-rule-$this->pluginId"];
+    $element['int_phone']['#attributes']["data-msg-$this->pluginId"] = $element['#attributes']["data-msg-$this->pluginId"];
+    unset($element['#attributes']["data-rule-$this->pluginId"]);
+    unset($element['#attributes']["data-msg-$this->pluginId"]);
+  }
+
+}
-- 
GitLab


From 2f5ca745f2becba48f6125a5228eda59f785c742 Mon Sep 17 00:00:00 2001
From: Florent Torregrosa <florent.torregrosa@gmail.com>
Date: Tue, 2 Sep 2025 11:47:36 +0200
Subject: [PATCH 2/2] Issue #3307507 by grimreaper: Update to be compatible
 with lib intl-tel-input 25.3.1 and phone_international 4.0.0

---
 .../js/cv.intltelinput.method.js                    |  2 +-
 .../src/Plugin/CvValidator/PhoneInternational.php   | 13 -------------
 2 files changed, 1 insertion(+), 14 deletions(-)

diff --git a/clientside_validation_jquery/js/cv.intltelinput.method.js b/clientside_validation_jquery/js/cv.intltelinput.method.js
index 7480ab4..618d741 100644
--- a/clientside_validation_jquery/js/cv.intltelinput.method.js
+++ b/clientside_validation_jquery/js/cv.intltelinput.method.js
@@ -8,7 +8,7 @@
       return true;
     }
 
-    var iti = window.intlTelInputGlobals.getInstance(element);
+    var iti = window.intlTelInput.getInstance(element);
     return !!iti.isValidNumber();
   }, 'Invalid format.');
 })(jQuery);
diff --git a/clientside_validation_jquery/src/Plugin/CvValidator/PhoneInternational.php b/clientside_validation_jquery/src/Plugin/CvValidator/PhoneInternational.php
index 91a3717..d9b17fc 100644
--- a/clientside_validation_jquery/src/Plugin/CvValidator/PhoneInternational.php
+++ b/clientside_validation_jquery/src/Plugin/CvValidator/PhoneInternational.php
@@ -54,17 +54,4 @@ class PhoneInternational extends CvValidatorBase {
     ];
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function addValidation(array &$element, FormStateInterface $form_state) {
-    parent::addValidation($element, $form_state);
-
-    // Put attributes on the tel child element.
-    $element['int_phone']['#attributes']["data-rule-$this->pluginId"] = $element['#attributes']["data-rule-$this->pluginId"];
-    $element['int_phone']['#attributes']["data-msg-$this->pluginId"] = $element['#attributes']["data-msg-$this->pluginId"];
-    unset($element['#attributes']["data-rule-$this->pluginId"]);
-    unset($element['#attributes']["data-msg-$this->pluginId"]);
-  }
-
 }
-- 
GitLab

