diff --git a/assets/js/sliderfield_element_sliderfield.js b/assets/js/sliderfield_element_sliderfield.js index 9835cfc..dc4b98f 100644 --- a/assets/js/sliderfield_element_sliderfield.js +++ b/assets/js/sliderfield_element_sliderfield.js @@ -58,25 +58,25 @@ // See https://bugs.webkit.org/show_bug.cgi?id=23789 } }); - if (setting.display_ignore_button) { - $slider.parent().find('.sliderfield-ignore').change(function() { - var $slider = $(this).parent().parent().find('.sliderfield, .webform-sliderfield'); - var $slider_container = $slider.find('.sliderfield-container'); - $slider_id = $slider.attr('id'); - var setting = drupalSettings['sliderfield_' + $slider_id]; - if ($(this).is(':checked')) { - $(this).parent().parent().find('.sliderfield-value-field').val(''); - $(this).parent().parent().find('.sliderfield-value2-field').val(''); - if (setting.fields_to_sync_css_selector) { - $(setting.fields_to_sync_css_selector).val(''); - } - $slider_container.slider( "disable" ); - } else { - $slider_container.slider( "enable" ); - } - }); - } - if (setting.disabled || ($value == '' && setting.display_ignore_button)) { + // if (setting.display_ignore_button) { + // $slider.parent().find('.sliderfield-ignore').change(function() { + // var $slider = $(this).parent().parent().find('.sliderfield, .webform-sliderfield'); + // var $slider_container = $slider.find('.sliderfield-container'); + // $slider_id = $slider.attr('id'); + // var setting = drupalSettings['sliderfield_' + $slider_id]; + // if ($(this).is(':checked')) { + // $(this).parent().parent().find('.sliderfield-value-field').val(''); + // $(this).parent().parent().find('.sliderfield-value2-field').val(''); + // if (setting.fields_to_sync_css_selector) { + // $(setting.fields_to_sync_css_selector).val(''); + // } + // $slider_container.slider( "disable" ); + // } else { + // $slider_container.slider( "enable" ); + // } + // }); + // } + if (setting.disabled) { $(this).slider( "disable" ); } @@ -161,9 +161,9 @@ // Move slider without toggling events $SliderField.slider({value: $value}); - if (!setting.disabled && setting.display_ignore_button) { - $SliderField.slider( "enable" ); - } + // if (!setting.disabled && setting.display_ignore_button) { + // $SliderField.slider( "enable" ); + // } } }); @@ -202,9 +202,9 @@ // Move slider without toggling events $SliderField.slider('values', 1, $value); - if (!setting.disabled && setting.display_ignore_button) { - $SliderField.slider( "enable" ); - } + // if (!setting.disabled && setting.display_ignore_button) { + // $SliderField.slider( "enable" ); + // } } }); } @@ -249,9 +249,24 @@ } $('#' + $slider_id + ' .ui-slider-handle:eq(' + i + ') .sliderfield-bubble').html(bubble_value); } - $values[i] = setting.display_values_format.replace('%{value}%', $values[i]); + + // Update values text + if (setting.display_values) { + $values[i] = setting.display_values_format.replace('%{value}%', $values[i]); + } + } + + var $slider_label = $slider.find('.sliderfield-display-values-field'); + if ($values.length > 1) { + $slider_label.html($values.join(' - ')); + } else { + if(setting.min == $values[0]) { + $slider_label.html(setting.not_selected_text); + } else { + $slider_label.html($values.join(' - ')); + } } - $slider.find('.sliderfield-display-values-field').html($values.join(' - ')); + // $slider.find('.sliderfield-display-values-field').html($values.join(' - ')); } var sliderfieldsSlideChange = function(event, ui) { diff --git a/src/Element/Slider.php b/src/Element/Slider.php index fec8b26..eb91773 100644 --- a/src/Element/Slider.php +++ b/src/Element/Slider.php @@ -80,6 +80,7 @@ * '#display_inputs' => TRUE, * '#display_values' => FALSE, * '#display_values_format' => '%{value}%', + * '#not_selected_text' => 'Not selected' * '#display_bubble' => FALSE, * '#display_bubble_format' => '%{value}%', * '#slider_length' => NULL, @@ -89,7 +90,6 @@ * '#group_master' => FALSE, * '#validate_range' => TRUE, * '#fields_to_sync_css_selector' => NULL, - * '#display_ignore_button' => FALSE, * '#hide_slider_handle_when_no_value' => FALSE, * ); * @endcode @@ -123,6 +123,7 @@ public function getInfo() { '#display_inputs' => TRUE, '#display_values' => FALSE, '#display_values_format' => '%{value}%', + '#not_selected_text' => 'Not selected', '#display_bubble' => FALSE, '#display_bubble_format' => '%{value}%', '#slider_length' => NULL, @@ -132,7 +133,6 @@ public function getInfo() { '#group_master' => FALSE, '#validate_range' => TRUE, '#fields_to_sync_css_selector' => NULL, - '#display_ignore_button' => FALSE, '#hide_slider_handle_when_no_value' => FALSE, '#process' => [ [$class, 'processAjaxForm'], @@ -212,12 +212,12 @@ public static function preRenderSlider($element) { if ($element['#display_inside_fieldset']) { $element['slider'] = [ '#type' => 'fieldset', - '#title' => $element['#title'] + '#title' => $element['#title'], ]; } elseif ($element['#title']) { $element['slider'] = [ - '#type' => 'container' + '#type' => 'container', ]; } @@ -241,20 +241,6 @@ public static function preRenderSlider($element) { } } - if ($element['#display_ignore_button'] && !$element['#display_inputs']) { - $element['slider']['ignore'] = [ - '#type' => 'checkbox', - '#title' => t('Not Selected (Uncheck to select a value)'), - '#value' => (is_null($value) || $value === ''), - '#disabled' => $element['#disabled'], - '#attributes' => [ - 'class' => [ - 'slider-ignore' - ] - ] - ]; - } - $_attributes_new = [ 'class' => [ 'sliderfield-value-field', @@ -290,7 +276,7 @@ public static function preRenderSlider($element) { $value = NULL; $ajax['trigger_as'] = array( 'name' => $element['#name'], - 'value' => $value + 'value' => $value, ); } if (!isset($ajax['event'])) { @@ -310,7 +296,7 @@ public static function preRenderSlider($element) { $values[$key] = str_replace('%{value}%', $value ,$element['#display_values_format']); } $element['slider']['values_text'] = [ - '#markup' => '
' + '#markup' => '', ]; } @@ -326,7 +312,7 @@ public static function preRenderSlider($element) { if ($element['#hide_slider_handle_when_no_value']) { $element['slider']['note'] = array( '#type' => 'markup', - '#markup' => '' + '#markup' => '', ); } @@ -336,13 +322,13 @@ public static function preRenderSlider($element) { '#attributes' => [ 'class' => [ 'sliderfield-container', - $element['#slider_style'] + $element['#slider_style'], ], - 'style' => $style + 'style' => $style, ], '#attached' => [ 'library' => [ - 'sliderfield/element.slider' + 'sliderfield/element.slider', ], 'drupalSettings' => [ 'sliderfield_' . $element['#id'] => [ @@ -357,6 +343,7 @@ public static function preRenderSlider($element) { 'step' => $element['#step'] * 1, 'display_inputs' => $element['#display_inputs'], 'display_values_format' => $element['#display_values_format'], + 'not_selected_text' => $element['#not_selected_text'], 'display_bubble' => $element['#display_bubble'], 'display_bubble_format' => $element['#display_bubble_format'], 'display_values' => $element['#display_values'], @@ -364,13 +351,12 @@ public static function preRenderSlider($element) { 'group_type' => $element['#group_type'], 'group_master' => $element['#group_master'], 'fields_to_sync_css_selector' => $element['#fields_to_sync_css_selector'], - 'display_ignore_button' => $element['#display_ignore_button'], - 'hide_slider_handle_when_no_value' => $element['#hide_slider_handle_when_no_value'] + 'hide_slider_handle_when_no_value' => $element['#hide_slider_handle_when_no_value'], ] ] ], '#markup' => '', - '#suffix' => '' + '#suffix' => '', ]; $element['#process_called'] = TRUE; diff --git a/src/Plugin/Field/FieldWidget/SliderUIFieldWidget.php b/src/Plugin/Field/FieldWidget/SliderUIFieldWidget.php index 60d0cd9..90f9962 100644 --- a/src/Plugin/Field/FieldWidget/SliderUIFieldWidget.php +++ b/src/Plugin/Field/FieldWidget/SliderUIFieldWidget.php @@ -38,10 +38,10 @@ public static function defaultSettings() { 'display_values_format' => '%{value}%', 'display_bubble' => FALSE, 'display_bubble_format' => '%{value}%', + 'not_selected_text' => t('Not selected'), 'slider_length' => NULL, 'hide_inputs' => TRUE, 'multi_value' => FALSE, - 'display_ignore_button' => TRUE, 'hide_slider_handle_when_no_value' => FALSE, ] ] + parent::defaultSettings(); @@ -59,7 +59,7 @@ public function settingsForm(array $form, FormStateInterface $form_state) { '#title' => $this->t('Slider Settings'), '#collapsible' => TRUE, '#collapsed' => FALSE, - '#weight' => 0 + '#weight' => 0, ); $elements['sliderfield_settings']['animate'] = [ @@ -72,7 +72,7 @@ public function settingsForm(array $form, FormStateInterface $form_state) { 'slow' => $this->t('Slow'), 'custom' => $this->t('Custom') ], - '#default_value' => $settings['sliderfield_settings']['animate'] + '#default_value' => $settings['sliderfield_settings']['animate'], ]; $elements['sliderfield_settings']['orientation'] = [ '#type' => 'select', @@ -83,7 +83,7 @@ public function settingsForm(array $form, FormStateInterface $form_state) { ], '#require' => TRUE, '#description' => $this->t('Determines whether the slider handles move horizontally (min on left, max on right) or vertically (min on bottom, max on top).'), - '#default_value' => $settings['sliderfield_settings']['orientation'] + '#default_value' => $settings['sliderfield_settings']['orientation'], ]; $elements['sliderfield_settings']['range'] = [ '#type' => 'select', @@ -95,7 +95,7 @@ public function settingsForm(array $form, FormStateInterface $form_state) { 'max' => $this->t('Maximum') ], '#description' => $this->t('Whether the slider represents a range.'), - '#default_value' => $settings['sliderfield_settings']['range'] + '#default_value' => $settings['sliderfield_settings']['range'], ]; $elements['sliderfield_settings']['step'] = [ '#type' => 'textfield', @@ -104,20 +104,20 @@ public function settingsForm(array $form, FormStateInterface $form_state) { '#description' => $this->t('Determines the size or amount of each interval or step the slider takes between the min and max. The full specified value range of the slider (max - min) should be evenly divisible by the step.'), '#required' => TRUE, '#element_validate' => [$this, 'sliderfieldValidatePositiveNumber'], - '#default_value' => $settings['sliderfield_settings']['step'] + '#default_value' => $settings['sliderfield_settings']['step'], ]; $elements['sliderfield_settings']['slider_style'] = [ '#type' => 'select', '#title' => $this->t('Style'), '#options' => $this->sliderfieldStyles(), '#description' => $this->t('Some default color styles for ease of use'), - '#default_value' => $settings['sliderfield_settings']['slider_style'] + '#default_value' => $settings['sliderfield_settings']['slider_style'], ]; $elements['sliderfield_settings']['display_values'] = [ '#type' => 'checkbox', '#title' => $this->t('Display Values'), '#description' => $this->t('If enabled display the current values of slider as simple text.'), - '#default_value' => $settings['sliderfield_settings']['display_values'] + '#default_value' => $settings['sliderfield_settings']['display_values'], ]; $display_values_format = $settings['sliderfield_settings']['display_values_format']; $display_values_format = !isset($display_values_format) ? '%{value}%' : $display_values_format; @@ -126,7 +126,14 @@ public function settingsForm(array $form, FormStateInterface $form_state) { '#title' => $this->t('Display Values Format'), '#size' => 15, '#description' => $this->t('Format of the displaied values, The usage is mostly for showing $,% or other signs near the value. Use %{value}% as slider value'), - '#default_value' => $display_values_format + '#default_value' => $display_values_format, + ]; + $elements['sliderfield_settings']['not_selected_text'] = [ + '#type' => 'textfield', + '#title' => $this->t('Not selected text'), + '#size' => 25, + '#description' => $this->t('Displays this text when the field value is not set'), + '#default_value' => $settings['sliderfield_settings']['not_selected_text'], ]; $display_bubble = $settings['sliderfield_settings']['display_bubble']; $display_bubble = !isset($display_bubble) ? '%{value}%' : $display_bubble; @@ -134,7 +141,7 @@ public function settingsForm(array $form, FormStateInterface $form_state) { '#type' => 'checkbox', '#title' => $this->t('Display bubble/hint'), '#description' => $this->t('Display a hint/bubble near each slider handle showing the value of that handle.'), - '#default_value' => $display_bubble + '#default_value' => $display_bubble, ]; $display_bubble_format = $settings['sliderfield_settings']['display_bubble_format']; $display_bubble_format = !isset($display_bubble_format) ? '%{value}%' : $display_bubble_format; @@ -143,20 +150,20 @@ public function settingsForm(array $form, FormStateInterface $form_state) { '#size' => 15, '#title' => $this->t('Display bubble/hint format'), '#description' => $this->t('Format of the displaied values in bubble/hint, The usage is mostly for showing $,% or other signs near the value. Use %{value}% as slider value. For range slider it can have two values separated by || like "$%{value}%MIN||$%{value}%MAX"'), - '#default_value' => $display_bubble_format + '#default_value' => $display_bubble_format, ]; $elements['sliderfield_settings']['slider_length'] = [ '#type' => 'textfield', '#title' => $this->t('Slider Length'), '#size' => 5, '#description' => $this->t('Acceptable types are the same as css width and height (100px) and it will be used as width or height depending on #orientation'), - '#default_value' => $settings['sliderfield_settings']['slider_length'] + '#default_value' => $settings['sliderfield_settings']['slider_length'], ]; $elements['sliderfield_settings']['hide_inputs'] = [ '#type' => 'checkbox', '#title' => $this->t('Hide Input Textfields'), '#description' => $this->t('If enabled displays only the slider and hides input textfields.'), - '#default_value' => $settings['sliderfield_settings']['hide_inputs'] + '#default_value' => $settings['sliderfield_settings']['hide_inputs'], ]; $multi_value = $settings['sliderfield_settings']['multi_value']; $multi_value = !isset($multi_value) ? '' : $multi_value; @@ -168,19 +175,13 @@ public function settingsForm(array $form, FormStateInterface $form_state) { 'separate' => $this->t('Enable') ], '#description' => $this->t('Uses field\'s multi value feature to store the values, currently only 2 values are supported. A separate handle for each value will be shown on slider'), - '#default_value' => $multi_value - ]; - $elements['sliderfield_settings']['display_ignore_button'] = [ - '#type' => 'checkbox', - '#title' => $this->t('Display ignore button'), - '#description' => $this->t('When field is not required, and hide input fields option is active a checkbox will be shown allowing user to ignore the field allowing user to ignore the field and enter no value.'), - '#default_value' => $settings['sliderfield_settings']['display_ignore_button'], + '#default_value' => $multi_value, ]; $elements['sliderfield_settings']['hide_slider_handle_when_no_value'] = [ '#type' => 'checkbox', '#title' => $this->t('Hide slider handle when there is no value'), '#description' => $this->t('When the slider does not have any value by enabling this option it won\'t show the the slider handle unless user clicks on the slider to select a value.'), - '#default_value' => $settings['sliderfield_settings']['hide_slider_handle_when_no_value'] + '#default_value' => $settings['sliderfield_settings']['hide_slider_handle_when_no_value'], ]; return $elements; @@ -241,10 +242,11 @@ public function settingsSummary() { */ public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { $field_settings = $this->getFieldSettings(); + $settings = $this->getSettings()['sliderfield_settings']; // Set minimum and maximum. if (is_numeric($field_settings['min'])) { - $element['#min'] = $field_settings['min']; + $element['#min'] = $field_settings['min'] - $settings['step']; } if (is_numeric($field_settings['max'])) { $element['#max'] = $field_settings['max']; @@ -260,14 +262,12 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen $element['#field_suffix'] = FieldFilteredMarkup::create(array_pop($suffixes)); } - - $settings = $this->getSettings()['sliderfield_settings']; $value = NULL; if (!empty($items) && isset($items[$delta]) && isset($items[$delta]->value)) { $value = $items[$delta]->value; } else { - $value = $field_settings['min']; + $value = $field_settings['min'] - $settings['step']; } if (!isset($settings['display_values_format'])) { $settings['display_values_format'] = '%{value}%'; @@ -294,12 +294,12 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen '#display_inputs' => !$settings['hide_inputs'], '#display_values' => $settings['display_values'], '#display_values_format' => $settings['display_values_format'], + '#not_selected_text' => $this->t(Html::escape($settings['not_selected_text'])), '#slider_length' => $settings['slider_length'], '#display_inside_fieldset' => FALSE, '#validate_range' => FALSE, '#display_bubble' => $settings['display_bubble'], '#display_bubble_format' => $settings['display_bubble_format'], - '#display_ignore_button' => $settings['display_ignore_button'], '#hide_slider_handle_when_no_value' => $settings['hide_slider_handle_when_no_value'], '#fields_to_sync_css_selector' => @$settings['fields_to_sync_css_selector'], ); @@ -307,4 +307,21 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen return ['value' => $element]; } + /** + * {@inheritdoc} + */ + public function massageFormValues(array $values, array $form, FormStateInterface $form_state) { + $field_settings = $this->getFieldSettings(); + $settings = $this->getSettings()['sliderfield_settings']; + $min_value = $field_settings['min'] - $settings['step']; + + foreach ($values as &$value) { + if ($min_value == $value['value']) { + $value = NULL; + } + } + + return parent::massageFormValues($values, $form, $form_state); + } + }