Skip to content

Commit

Permalink
Code refactored to satisfy CodeClimate issues, Identifier field is no…
Browse files Browse the repository at this point in the history
…w a randomly generated UUID, Code cleanup.
  • Loading branch information
kaise-lafrai committed Apr 8, 2024
1 parent 30c36ac commit 530100f
Show file tree
Hide file tree
Showing 11 changed files with 290 additions and 109 deletions.
5 changes: 5 additions & 0 deletions modules/data_dictionary_widget/css/dataDictionaryWidget.css
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,8 @@
width: 200px;
background-color: #ccc;
}
#edit-field-json-metadata-0-identifier {
background-color: #f4f4f4;
color: #666;
cursor: not-allowed;
}
7 changes: 7 additions & 0 deletions modules/data_dictionary_widget/data_dictionary_widget.module
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,13 @@ function data_dictionary_widget_form_alter(&$form, &$form_state, $form_id) {
$form["field_json_metadata"]["widget"][0]["dictionary_fields"]["current_fields"] = $formatted_current_fields;
}

// Set the default value of the identifier field to a randomly generated uuid.
$identifier_uuid = $form["field_json_metadata"]["widget"][0]["identifier"]["#default_value"] ?? NULL;
if (!$identifier_uuid) {
$uuid = \Drupal::service('uuid')->generate();
$form["field_json_metadata"]["widget"][0]["identifier"]['#default_value'] = $uuid;
$form["field_json_metadata"]["widget"][0]["identifier"]['#description'] = t('<div class="form-item__description">This is the UUID of this Data Dictionary. To assign this data dictionary to a specific distribution use this <a href="/api/1/metastore/schemas/data-dictionary/items/' .$uuid. '" target="_blank">URL</a>.</div>');
}
}
}

Expand Down
14 changes: 12 additions & 2 deletions modules/data_dictionary_widget/src/Fields/FieldButtons.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public static function addButton() {
'wrapper' => 'field-json-metadata-dictionary-fields',
'effect' => 'fade',
],
'#limit_validation_errors' => []
'#limit_validation_errors' => [],
];
}

Expand Down Expand Up @@ -84,15 +84,25 @@ public static function submitButton($location, $key) {
'wrapper' => 'field-json-metadata-dictionary-fields',
'effect' => 'fade',
],
'#element_validate' => [['Drupal\data_dictionary_widget\Fields\FieldCallbacks', 'customValidationCallback']],
'#element_validate' => [self::assembleValidation()],
];

if ($location == 'edit') {
$edit_button['#name'] = 'update_' . $key;
}

return $edit_button;
}

/**
* Assemble element validation property.
*/
protected static function assembleValidation() {
return ['Drupal\data_dictionary_widget\Fields\FieldCallbacks',
'customValidationCallback',
];
}

/**
* Create Cancel button.
*/
Expand Down
42 changes: 10 additions & 32 deletions modules/data_dictionary_widget/src/Fields/FieldCallbacks.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@ public static function updateFormatOptions(array &$form, FormStateInterface $for
$op = $trigger['#op'];
$op_index = explode("_", $trigger['#op']);
$field = $form_state->getValue(["field_json_metadata"]);
$format_field = $form["field_json_metadata"]["widget"][0]['dictionary_fields']["field_collection"]["group"]["format"];
$format_field = $form["field_json_metadata"]["widget"][0]['dictionary_fields']["field_collection"]["group"]["format"] ?? NULL;
$data_type = $field[0]['dictionary_fields']["field_collection"]["group"]["type"] ?? 'string';
$field_index = $op_index[1];

// The update format field is located in a diferent location.
// Update format field and data type when in edit mode.
if (str_contains($op, 'format')) {
$field_index = $op_index[1];
$format_field = $form["field_json_metadata"]["widget"][0]["dictionary_fields"]["edit_fields"][$field_index]["format"];
$data_type = $field[0]["dictionary_fields"]["data"][$field_index]["field_collection"]["type"] ?? 'string';
}
Expand All @@ -31,8 +31,8 @@ public static function updateFormatOptions(array &$form, FormStateInterface $for
$options = FieldOperations::setFormatOptions($data_type);

$format_field["#options"] = $options;
return $format_field;

return $format_field;
}

/**
Expand Down Expand Up @@ -63,7 +63,7 @@ public static function editSubformCallback(array &$form, FormStateInterface $for
$currently_modifying[$op_index[1]] = $current_fields[$op_index[1]];
}

// Reindex the current_fields array.
// Re-index the current_fields array.
if ($current_fields) {
$current_fields = array_values($current_fields);
}
Expand All @@ -80,7 +80,6 @@ public static function addSubformCallback(array &$form, FormStateInterface $form
$trigger = $form_state->getTriggeringElement();
$op = $trigger['#op'];
$form_state->set('add_new_field', '');
// $fields_being_added = $form_state->set('fields_being_added', '');
$current_fields = $form["field_json_metadata"]["widget"][0]["dictionary_fields"]["data"]["#rows"];
if ($current_fields) {
$form_state->set('current_fields', $current_fields);
Expand Down Expand Up @@ -121,37 +120,16 @@ public static function customValidationCallback($element, FormStateInterface &$f
'name' => 'Name',
'title' => 'Title',
'description' => 'Description',
'format_other' => "Other Format"
'format_other' => 'Other Format',
];

$edit_fields_array = $form_state->getValues()["field_json_metadata"][0]["dictionary_fields"]["edit_fields"] ?? [];
$index = $edit_fields_array ? key($edit_fields_array) : null;

foreach ($fields_to_validate as $field_key => $field_label) {
$format = $form_state->getValue(['field_json_metadata', 0, 'dictionary_fields', 'data', $index, 'field_collection', 'format']);

if ($form_state->hasValue(['field_json_metadata', 0, 'dictionary_fields', 'data', $index, 'field_collection'])) {
$field_value = $form_state->getValue(['field_json_metadata', 0, 'dictionary_fields', 'data', $index, 'field_collection', $field_key]);
$error_field = "field_json_metadata][0][dictionary_fields][edit_fields][$index][$field_key";
} elseif ($form_state->hasValue(['field_json_metadata', 0, 'dictionary_fields', 'field_collection', 'group', $field_key])) {
$field_value = $form_state->getValue(['field_json_metadata', 0, 'dictionary_fields', 'field_collection', 'group', $field_key]);
$error_field = "field_json_metadata[0][dictionary_fields][field_collection][group][format_other";
}

if ($field_value === "" && $field_key !== "format_other") {
$form_state->setErrorByName($error_field, t('@label is required.', ['@label' => $field_label]));
}

if ($field_key === "format_other" && $field_value === "" && $format === "other") {
$form_state->setErrorByName($error_field, t('@label is required when "Other" is selected as the format.', ['@label' => $field_label]));
}
}
$index = $edit_fields_array ? key($edit_fields_array) : NULL;

$format_field = $form_state->getUserInput()['field_json_metadata'][0]['dictionary_fields']['field_collection']['group']['format'];
$other_format_value = $form_state->getUserInput()['field_json_metadata'][0]['dictionary_fields']['field_collection']['group']['format_other'];
FieldValidation::validateFormatOther($form_state, $index);

if ($format_field === 'other' && empty($other_format_value)) {
$form_state->setErrorByName('field_json_metadata][0][dictionary_fields][field_collection][group][format_other', t('Other format is required when "Other" is selected as the format.'));
foreach ($fields_to_validate as $field_key => $field_label) {
FieldValidation::validateField($form_state, $field_key, $field_label, $index);
}
}

Expand Down
73 changes: 52 additions & 21 deletions modules/data_dictionary_widget/src/Fields/FieldCreation.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace Drupal\data_dictionary_widget\Fields;

use Drupal\Core\Form\FormStateInterface;

/**
* Various operations for creating Data Dictionary Widget fields.
*/
Expand All @@ -10,23 +12,11 @@ class FieldCreation {
/**
* Create basic widget.
*/
public static function createGeneralFields($element, $field_json_metadata, $current_fields, $fields_being_modified) {

$element['identifier'] = [
'#name' => 'field_json_metadata[0][identifier]',
'#type' => 'textfield',
'#required' => TRUE,
'#title' => t('Identifier'),
'#default_value' => $field_json_metadata['identifier'] ?? '',
];
public static function createGeneralFields($element, $field_json_metadata, $current_fields, $form_state) {

$element['title'] = [
'#name' => 'field_json_metadata[0][title]',
'#type' => 'textfield',
'#required' => TRUE,
'#title' => t('Title'),
'#default_value' => $field_json_metadata['title'] ?? '',
];
$element['identifier'] = self::createField('identifier', $field_json_metadata, $form_state);

$element['title'] = self::createField('title', $field_json_metadata, $form_state);

$element['dictionary_fields'] = [
'#type' => 'fieldset',
Expand All @@ -35,19 +25,60 @@ public static function createGeneralFields($element, $field_json_metadata, $curr
'#suffix' => '</div>',
'#markup' => t('<div class="claro-details__description">A data dictionary for this resource, compliant with the <a href="https://specs.frictionlessdata.io/table-schema/" target="_blank">Table Schema</a> specification.</div>'),
];

$element['dictionary_fields']['current_fields'] = $current_fields;

if (isset($field_json_metadata['data']['indexes'])) {
$element['indexes'] = [
$element['indexes'] = self::createField('indexes', $field_json_metadata, $form_state);
}

return $element;
}

/**
* Build data dictionary fields from field_json_metadata.
*
* @param string $field
* Data dictionary field.
* @param array $field_json_metadata
* Data dictionary indexes.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The current form state object.
*
* @return array
* Field array structure.
*/
protected static function createField(string $field, array $field_json_metadata, FormStateInterface &$form_state) {
$identifier_uuid = $field_json_metadata['identifier'] ?? $form_state->getUserInput()["field_json_metadata"][0]["identifier"] ?? NULL;

$fieldMappings = [
'title' => [
'#name' => 'field_json_metadata[0][title]',
'#type' => 'textfield',
'#required' => TRUE,
'#title' => t('Title'),
'#default_value' => $field_json_metadata['title'] ?? '',
],
'identifier' => [
'#name' => 'field_json_metadata[0][identifier]',
'#type' => 'textfield',
'#required' => TRUE,
'#title' => t('Identifier'),
'#default_value' => $field_json_metadata['identifier'] ?? '',
'#attributes' => ['readonly' => 'readonly'],
'#default_value' => $identifier_uuid ?? '',
'#description' => t('<div class="form-item__description">This is the UUID of this Data Dictionary. To assign this data dictionary to a specific distribution use this <a href="@url" target="_blank">URL</a>.</div>', ['@url' => '/api/1/metastore/schemas/data-dictionary/items/' . $identifier_uuid]),
],
'indexes' => [
'#type' => 'textarea',
'#access' => FALSE,
'#required' => TRUE,
'#title' => t('Index'),
'#default_value' => json_encode($field_json_metadata['data']['indexes']) ?? '',
];
}
'#default_value' => isset($field_json_metadata['data']['indexes']) ? json_encode($field_json_metadata['data']['indexes']) : '',
],
];

return $element;
return $fieldMappings[$field] ?? [];
}

/**
Expand Down

0 comments on commit 530100f

Please sign in to comment.