+ /**
+ * Ajax callback for 'crop_list' select element.
+ *
+ * This ajax callback takes care of the following things:
+ * - Fetching selected options on the 'crop_list' element.
+ *
+ * @param array $form
+ * An associative array containing the structure of the form.
+ * @param \Drupal\Core\Form\FormStateInterface $form_state
+ * The current state of the form.
+ *
+ * @return \Drupal\Core\Ajax\AjaxResponse
+ * The Ajax response.
+ */
+ public static function updateCropTypeRequiredOptions(array $form, FormStateInterface $form_state) {
+ $response = new AjaxResponse();
+ $triggering_element = $form_state->getTriggeringElement();
+ if (isset($triggering_element['#value'])) {
+ $crop_type_required_form = self::getImageCropWidgetElement($form_state, 'crop_types_required');
+ $crop_type_required_form['#options'] = array_intersect_key($triggering_element['#options'], $triggering_element['#value']);
+
+ /** @var \Drupal\Core\Render\RendererInterface $renderer */
+ $renderer = \Drupal::service('renderer');
+ $output = $renderer->renderRoot($crop_type_required_form);
+
+ // Transform field name onto field name class.
+ $field_name_class = str_replace('_', '-', $triggering_element['#parents'][1]);
+
+ // Re-construct triggered crop required form element class.
+ $element_fragments = [
+ 'form-item-',
+ 'fields-',
+ $field_name_class,
+ '-settings-edit-form-settings-',
+ 'crop-types-required',
+ ];
+
+ // Replace existing element with selected `crop_list` options.
+ $response->addCommand(new ReplaceCommand('.' . implode($element_fragments), $output));
+ }
+
+ return $response;
+ }
+
+ /**
+ * Return a specific of ImageCropWidget form element.
+ *
+ * @param \Drupal\Core\Form\FormStateInterface $form_state
+ * The current state of the form.
+ * @param string $key
+ * Name of element needed.
+ *
+ * @return array
+ * The form element needed by $key parameter.
+ */
+ public static function getImageCropWidgetElement(FormStateInterface $form_state, $key) {
+ $triggering_element = $form_state->getTriggeringElement();
+ $children = $triggering_element['#parents'][0];
+ $field_name = $triggering_element['#parents'][1];
+ $field_element_form = $form_state->getCompleteForm()[$children][$field_name];
+
+ return $field_element_form['plugin']['settings_edit_form']['settings'][$key] ?: [];
+ }
+