diff --git a/patches/field-type-enhancer-3025283-3.patch b/patches/field-type-enhancer-3025283-3.patch index da26cf269e..b91841c801 100644 --- a/patches/field-type-enhancer-3025283-3.patch +++ b/patches/field-type-enhancer-3025283-3.patch @@ -1,5 +1,205 @@ +diff --git a/src/Form/JsonapiExtrasFieldTypesForm.php b/src/Form/JsonapiExtrasFieldTypesForm.php +new file mode 100644 +index 0000000..6b9dee2 +--- /dev/null ++++ b/src/Form/JsonapiExtrasFieldTypesForm.php +@@ -0,0 +1,194 @@ ++fieldManager = $field_manager; ++ $this->enhancerManager = $enhancer_manager; ++ $this->configManager = $config_manager; ++ } ++ ++ /** ++ * {@inheritdoc} ++ */ ++ public static function create(ContainerInterface $container) { ++ return new static( ++ $container->get('entity_field.manager'), ++ $container->get('plugin.manager.resource_field_enhancer'), ++ $container->get('config.factory') ++ ); ++ } ++ ++ public function getFormId() { ++ return 'jsonapi_extras_field_types_form'; ++ } ++ ++ public function buildForm(array $form, FormStateInterface $form_state): array { ++ // Get current field type configuration. ++ $config = $this->configManager->get('jsonapi_extras.jsonapi_field_type_config'); ++ ++ // Collect unique field types. ++ $field_types = $this->fieldManager->getFieldMap(); ++ $unique_field_types = []; ++ foreach ($field_types as $fields) { ++ foreach ($fields as $field_info) { ++ $unique_field_types[$field_info['type']] = $field_info['type']; ++ } ++ } ++ ++ // Sort field types alphabetically by key. ++ ksort($unique_field_types); ++ ++ // Get all the enhancers. ++ $options = $this->enhancerManager->getDefinitions(); ++ ++ // Get all option labels. ++ $labels = array_map(fn($option) => $option['label'], $options); ++ ++ // Add a none option. ++ $options = array_merge(['- None -' => $this->t('- None -')], $options); ++ $labels = array_merge(['- None -'], $labels); ++ ++ // Add a form element for each field type. ++ foreach ($unique_field_types as $field_type) { ++ $form['field_types'][$field_type] = [ ++ '#type' => 'container', ++ '#title' => $field_type, ++ '#suffix' => '
', ++ '#attributes' => ['style' => ++ 'display: flex; gap: 1rem; flex-direction: column;'], ++ ]; ++ ++ // Add name of the field type. ++ $form['field_types'][$field_type][$field_type . '_name'] = [ ++ '#markup' => "
Field Type: $field_type
", ++ ]; ++ ++ // Get enhancer from configuration. ++ $resource_field = $config->get('resourceFields')[$field_type]; ++ ++ $form['field_types'][$field_type][$field_type . '_enhancer_id'] = [ ++ '#type' => 'select', ++ '#title' => $this->t('Enhancer'), ++ '#options' => array_combine(array_keys($options), $labels), ++ '#default_value' => $resource_field['enhancer']['id'], ++ ]; ++ ++ $form['field_types'][$field_type][$field_type . '_enhancer_settings'] = [ ++ '#type' => 'container', ++ ]; ++ ++ // Add a container for each option. ++ foreach ($options as $key => $option) { ++ if ($key === '- None -') { ++ continue; ++ } ++ ++ $form['field_types'][$field_type][$field_type . '_enhancer_settings'][$key] = [ ++ '#type' => 'container', ++ '#states' => [ ++ 'visible' => [ ++ ':input[name="' . $field_type . '_enhancer_id"]' => ['value' => $key], ++ ], ++ ], ++ ]; ++ ++ /** @var \Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerInterface $enhancer */ ++ $enhancer = $this->enhancerManager->createInstance($key); ++ $stuff = $enhancer->getSettingsForm($resource_field); ++ ++ // Add field type and enhancer id prefix to the settings. ++ // e.g. 'link__url_link__absolute_url' ++ $settings = []; ++ foreach ($stuff as $setting_key => $setting) { ++ $settings[$field_type . '__' . $key . '__' . $setting_key] = $setting; ++ } ++ ++ $form['field_types'][$field_type][$field_type . '_enhancer_settings'][$key][] = $settings; ++ } ++ ++ } ++ ++ // Add submit button. ++ $form['submit'] = [ ++ '#type' => 'submit', ++ '#value' => $this->t('Save Configuration'), ++ ]; ++ ++ return $form; ++ } ++ ++ public function submitForm(array &$form, FormStateInterface $form_state): void { ++ $values = $form_state->getValues(); ++ ++ // Filter values to only include enhancer ids. ++ $enhancer_ids = array_filter($values, fn($value, $key) => str_contains($key, '_enhancer_id'), ARRAY_FILTER_USE_BOTH); ++ ++ // Loop through enhancer ids and look for settings related to each field type. ++ $field_types = []; ++ foreach ($enhancer_ids as $type => $enhancer_id) { ++ $field_type = str_replace('_enhancer_id', '', $type); ++ $field_types[$field_type] = [ ++ 'fieldName' => $field_type, ++ 'enhancer' => ['id' => $enhancer_id], ++ ]; ++ // No need to process the none option. ++ if ($enhancer_id === '- None -') { ++ $field_types[$field_type]['enhancer']['id'] = ''; ++ continue; ++ } ++ ++ // Filter values to only include settings related to the current field type. ++ $settings = array_filter($values, fn($value, $key) => str_contains($key, $field_type . '__' . $enhancer_id), ARRAY_FILTER_USE_BOTH); ++ if (!empty($settings)) { ++ // Remove the prefix from the settings keys. ++ // Preserve the $key as the index in the array. ++ $settings = array_combine(array_map(fn($key) => str_replace($field_type . '__' . $enhancer_id . '__', '', $key), array_keys($settings)), $settings); ++ $field_types[$field_type]['enhancer']['settings'] = $settings; ++ } ++ } ++ ++ $config = $this->configManager->getEditable('jsonapi_extras.jsonapi_field_type_config'); ++ $config->set('resourceFields', $field_types); ++ $config->save(); ++ } ++ ++} diff --git a/src/Normalizer/FieldItemNormalizer.php b/src/Normalizer/FieldItemNormalizer.php -index 8882870..9f8abc8 100644 +index 8882870..b496b8c 100644 --- a/src/Normalizer/FieldItemNormalizer.php +++ b/src/Normalizer/FieldItemNormalizer.php @@ -51,12 +51,30 @@ class FieldItemNormalizer extends JsonApiNormalizerDecoratorBase { @@ -17,7 +217,7 @@ index 8882870..9f8abc8 100644 + // Look for default field type enhancer. + $config = \Drupal::config('jsonapi_extras.jsonapi_field_type_config'); + $field_type = $object->getFieldDefinition()->getType(); -+ $field_type_config = $config->get('mapping.resourceFieldTypes')[$field_type]; ++ $field_type_config = $config->get('resourceFields')[$field_type]; + + if (!empty($field_type_config['enhancer']['id'])) { + // Get the enhancer instance. @@ -34,3 +234,42 @@ index 8882870..9f8abc8 100644 } $cacheability = CacheableMetadata::createFromObject($normalized_output) ->addCacheTags(['config:jsonapi_resource_config_list']); +diff --git a/src/Plugin/DateTimeEnhancerBase.php b/src/Plugin/DateTimeEnhancerBase.php +index 770efe3..df02bdf 100644 +--- a/src/Plugin/DateTimeEnhancerBase.php ++++ b/src/Plugin/DateTimeEnhancerBase.php +@@ -38,7 +38,7 @@ abstract class DateTimeEnhancerBase extends ResourceFieldEnhancerBase { + '#type' => 'textfield', + '#title' => $this->t('Format'), + '#description' => $this->t('Use a valid date format.'), +- '#default_value' => $settings['dateTimeFormat'], ++ '#default_value' => $settings['dateTimeFormat'] ?? $this->defaultConfiguration()['dateTimeFormat'], + ], + ]; + } +diff --git a/src/Plugin/jsonapi/FieldEnhancer/SingleNestedEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/SingleNestedEnhancer.php +index c712bf5..b570fad 100644 +--- a/src/Plugin/jsonapi/FieldEnhancer/SingleNestedEnhancer.php ++++ b/src/Plugin/jsonapi/FieldEnhancer/SingleNestedEnhancer.php +@@ -82,7 +82,7 @@ class SingleNestedEnhancer extends ResourceFieldEnhancerBase { + '#type' => 'textfield', + '#title' => $this->t('Path'), + '#description' => $this->t('A dot separated path to extract the sub-property.'), +- '#default_value' => $settings['path'], ++ '#default_value' => $settings['path'] ?? $this->defaultConfiguration()['path'], + ], + ]; + } +diff --git a/src/Plugin/jsonapi/FieldEnhancer/UrlLinkEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/UrlLinkEnhancer.php +index 0cf8ba5..ece4bcb 100644 +--- a/src/Plugin/jsonapi/FieldEnhancer/UrlLinkEnhancer.php ++++ b/src/Plugin/jsonapi/FieldEnhancer/UrlLinkEnhancer.php +@@ -94,7 +94,7 @@ class UrlLinkEnhancer extends ResourceFieldEnhancerBase implements ContainerFact + $form['absolute_url'] = [ + '#type' => 'checkbox', + '#title' => $this->t('Get Absolute Urls'), +- '#default_value' => $settings['absolute_url'], ++ '#default_value' => $settings['absolute_url'] ?? $this->defaultConfiguration()['absolute_url'], + ]; + + return $form;