From 78061c766c7ebd6c7b2a248fbcf6488fab669d9a 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] 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

