From b98e981349c484d0b28a16824a29d7af1fec0ec2 Mon Sep 17 00:00:00 2001
Date: Fri, 15 Aug 2025 19:35:16 +0530
Subject: [PATCH] Add always_display_fields option to Diff module

---
 .../contrib/diff/config/install/diff.settings.yml     |  1 +
 .../modules/contrib/diff/src/DiffBuilderManager.php   | 11 +++++++++++
 .../contrib/diff/src/Form/GeneralSettingsForm.php     | 11 ++++++++++-
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/modules/contrib/diff/config/install/diff.settings.yml b/modules/contrib/diff/config/install/diff.settings.yml
index db5ba4a7..9a3139d3 100644
--- a/modules/contrib/diff/config/install/diff.settings.yml
+++ b/modules/contrib/diff/config/install/diff.settings.yml
@@ -15,3 +15,4 @@ general_settings:
       weight: 2
   visual_default_view_mode: full
   visual_inline_theme: default
+  always_display_fields: false
\ No newline at end of file
diff --git a/modules/contrib/diff/src/DiffBuilderManager.php b/modules/contrib/diff/src/DiffBuilderManager.php
index 8bb35244..bde4faa5 100644
--- a/modules/contrib/diff/src/DiffBuilderManager.php
+++ b/modules/contrib/diff/src/DiffBuilderManager.php
@@ -153,6 +153,13 @@ public function getSelectedPluginForFieldStorageDefinition(FieldStorageDefinitio
     $plugin_options = $this->getApplicablePluginOptions($field_definition);
     $field_key = $field_definition->getTargetEntityTypeId() . '.' . $field_definition->getName();
 
+    if ($this->config->get('always_display_fields')) {
+      // Ignore stored 'hidden' type, pick first available plugin.
+      if (!empty($plugin_options)) {
+        return ['type' => key($plugin_options), 'settings' => []];
+      }
+    }
+
     // Start with the stored configuration, this returns NULL if there is none.
     $selected_plugin = $this->pluginsConfig->get('fields.' . $field_key);
 
@@ -182,6 +189,10 @@ public function getSelectedPluginForFieldStorageDefinition(FieldStorageDefinitio
    *   Whether the field is displayed.
    */
   public function isFieldStorageDefinitionDisplayed(FieldStorageDefinitionInterface $field_storage_definition) {
+    if ($this->config->get('always_display_fields')) {
+      return TRUE;
+    }
+ 
     if (($field_storage_definition instanceof BaseFieldDefinition && $field_storage_definition->isDisplayConfigurable('view')) || $field_storage_definition instanceof FieldStorageConfig) {
       $field_key = 'content.' . $field_storage_definition->getName() . '.type';
       $storage = $this->entityTypeManager->getStorage('entity_view_display');
diff --git a/modules/contrib/diff/src/Form/GeneralSettingsForm.php b/modules/contrib/diff/src/Form/GeneralSettingsForm.php
index 305982d6..0090ef3a 100644
--- a/modules/contrib/diff/src/Form/GeneralSettingsForm.php
+++ b/modules/contrib/diff/src/Form/GeneralSettingsForm.php
@@ -211,6 +211,13 @@ public function buildForm(array $form, FormStateInterface $form_state, $field_ty
         ]),
         '#default_value' => $config->get('general_settings')['visual_inline_theme'],
       ];
+      $form['always_display_fields'] = [
+        '#type' => 'checkbox',
+        '#title' => $this->t('Always treat fields as displayable'),
+        '#default_value' => $config->get('always_display_fields'),
+        '#description' => $this->t('If enabled, the Diff module will compare all fields regardless of Entity View Display settings. Useful for API-first/headless sites.'),
+      ];
+ 
     }
 
     return parent::buildForm($form, $form_state);
@@ -239,7 +246,9 @@ public function validateForm(array &$form, FormStateInterface $form_state) {
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
     $config = $this->config('diff.settings');
-
+    
+    $config->set('always_display_fields', $form_state->getValue('always_display_fields'));
+ 
     $keys = [
       'radio_behavior',
       'context_lines_leading',
-- 
2.50.0

