Skip to content
Snippets Groups Projects
Commit 1d57ef14 authored by Joao Paulo Constantino's avatar Joao Paulo Constantino
Browse files

Feature/empty value exp

parent f44ca328
No related branches found
No related tags found
1 merge request!5Feature/empty value exp
......@@ -39,16 +39,24 @@
const deepFields = JSON.parse(fieldElement.dataset.evaluateDeepFields || "{}");
const fieldEvaluateDecimals = fieldElement.dataset.evaluateDecimals || null;
const buildExpression = (exp, field) => {
const currentElement = document.querySelector(`input[name="${field}"], select[name="${field}"]`);
const [fieldName, defaultValue] = field.split('|');
const currentElement = document.querySelector(`input[name="${fieldName}"], select[name="${fieldName}"]`);
let currentFieldValue;
if (currentElement === null && deepFields[field] !== undefined) {
currentFieldValue = deepFields[field];
if (currentElement === null && deepFields[fieldName] !== undefined) {
currentFieldValue = deepFields[fieldName];
}
else {
currentFieldValue = currentElement.value;
if (currentFieldValue === "" && defaultValue !== undefined) {
currentFieldValue = defaultValue
}
}
let fieldExp = fieldName;
if (defaultValue !== undefined) {
fieldExp += `|${defaultValue}`;
}
if (currentFieldValue !== '') {
return exp.replaceAll(`:${field}`, currentFieldValue);
return exp.replaceAll(`:${fieldExp}`, currentFieldValue);
}
return exp;
}
......@@ -57,7 +65,6 @@
// If the value was clear. Rollback the element to the initial state.
if (e.target.value === "" && previousValue[e.target.name] !== undefined && previousValue[e.target.name] !== "") {
updateResult(fieldElement, "");
return;
}
const convertedExpression = fields.reduce(buildExpression, expression);
......@@ -75,7 +82,8 @@
if (formContext !== '') {
selectorFormContext = `form#${formContext} `;
}
fields.forEach(name => {
fields.forEach(fieldExp => {
const [name] = fieldExp.split('|');
const elementSelector = `${selectorFormContext}input[name="${name}"], select[name="${name}"]`;
const element = document.querySelector(elementSelector);
if (element) {
......
......@@ -2,6 +2,7 @@
namespace Drupal\webform_calculation_fields\Plugin\WebformElement;
use Drupal\calculation_fields\Element\FormCalculationElement;
use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\Plugin\WebformElement\Number;
......@@ -41,13 +42,53 @@ class WebformCalculationNumber extends Number {
'#weight' => 1,
];
$description = $this->t('e.g.:
:webform_element_key_1 + :webform_element_key_2 - (:webform_element_key_1 * :webform_element_key_3).
For non required field you must provide a default value to be used on the expression until the field be populated, just adding |defaultValue, like :my_field_name|0');
$form['element']['evaluation_fields'] = [
'#type' => 'textarea',
'#title' => $this->t('Math Expression'),
'#description' => $this->t('e.g.: :webform_element_key_1 + :webform_element_key_2 - (:webform_element_key_1 * :webform_element_key_3)'),
'#description' => $description,
'#weight' => 2,
];
return $form;
}
/**
* {@inheritDoc}
*/
public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
$expression = $form_state->getValue('evaluation_fields');
$fields = FormCalculationElement::evaluateFields($expression);
$currentWebform = $this->getWebform();
$invalidFields = [];
foreach ($fields as $field) {
[$fieldName, $defaultValue] = explode('|', $field);
$element = $currentWebform->getElement($fieldName);
if (!$element) {
$invalidFields[] = $fieldName;
}
elseif (!$element['#required'] && is_null($defaultValue)) {
$form_state
->setErrorByName(
'evaluation_fields',
$this->t('The field @field are not required and are present on the expression, you must provide a default value, eg: @field|0 or @field|1', [
'@field' => $fieldName,
])
);
}
}
if (!empty($invalidFields)) {
$form_state
->setErrorByName(
'evaluation_fields',
$this->t('The following field(s) (@fields) does not exists on the webform. Please check your expression!',
['@fields' => implode(', ', $invalidFields)]
)
);
}
return parent::validateConfigurationForm($form, $form_state);
}
}
......@@ -121,10 +121,14 @@ class FormCalculationElement extends Number {
$fields = static::evaluateFields($evaluation);
$collectedValues = [];
foreach ($fields as $field) {
$value = $form_state->getValue($field);
[$fieldName, $defaultValue] = explode('|', $field);
$value = $form_state->getValue($fieldName);
if (!empty($value)) {
$collectedValues[$field] = $value;
}
elseif (!is_null($defaultValue)) {
$collectedValues[$field] = $defaultValue;
}
}
if (count($collectedValues) !== count(array_unique($fields))) {
return NULL;
......@@ -152,7 +156,7 @@ class FormCalculationElement extends Number {
foreach ($expressionFields as $field) {
$items = explode(' ', $field);
$items = array_map(function ($item) {
return preg_replace("/[^a-zA-Z0-9_]/", "", $item);
return preg_replace("/[^a-zA-Z0-9_|]/", "", $item);
}, $items);
$filteredItems = array_filter($items, function ($item) {
return !is_numeric($item) && !empty($item);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment