/**
* {@inheritdoc}
*/
public function form(array $form, FormStateInterface $form_state)
{
/** @var \Drupal\address\Entity\ZoneInterface $zone */
$zone = $this->entity;
$user_input = $form_state->getUserInput();
$form['#tree'] = TRUE;
$form['name'] = ['#type' => 'textfield', '#title' => $this->t('Name'), '#default_value' => $zone->getName(), '#maxlength' => 255, '#required' => TRUE];
$form['id'] = ['#type' => 'machine_name', '#title' => $this->t('Machine name'), '#default_value' => $zone->getId(), '#machine_name' => ['exists' => '\\Drupal\\address\\Entity\\Zone::load', 'source' => ['name']], '#maxlength' => 255, '#required' => TRUE];
$form['scope'] = ['#type' => 'textfield', '#title' => $this->t('Scope'), '#description' => $this->t('Used to group zones by purpose. Examples: tax, shipping.'), '#default_value' => $zone->getScope(), '#maxlength' => 255];
$form['priority'] = ['#type' => 'weight', '#title' => $this->t('Priority'), '#description' => $this->t('Zones with a higher priority will be matched first.'), '#default_value' => (int) $zone->getPriority(), '#delta' => 10];
$wrapper_id = Html::getUniqueId('zone-members-ajax-wrapper');
$form['members'] = ['#type' => 'table', '#header' => [$this->t('Type'), $this->t('Zone member'), $this->t('Weight'), $this->t('Operations')], '#tabledrag' => [['action' => 'order', 'relationship' => 'sibling', 'group' => 'zone-member-order-weight']], '#weight' => 5, '#prefix' => '<div id="' . $wrapper_id . '">', '#suffix' => '</div>'];
$index = 0;
/** @var \Drupal\address\Plugin\ZoneMember\ZoneMemberInterface $member */
foreach ($zone->getMembers() as $key => $member) {
$member_form =& $form['members'][$index];
$member_form['#attributes']['class'][] = 'draggable';
$member_form['#weight'] = isset($user_input['members'][$index]) ? $user_input['members'][$index]['weight'] : $member->getWeight();
$member_form['type'] = ['#type' => 'markup', '#markup' => $member->getPluginDefinition()['name']];
$member_parents = ['members', $index, 'form'];
$member_form_state = $this->buildMemberFormState($member_parents, $form_state);
$member_form['form'] = $member->buildConfigurationForm([], $member_form_state);
$member_form['form']['#element_validate'] = ['::memberFormValidate'];
$member_form['weight'] = ['#type' => 'weight', '#title' => $this->t('Weight for @title', ['@title' => $member->getName()]), '#title_display' => 'invisible', '#default_value' => $member->getWeight(), '#attributes' => ['class' => ['zone-member-order-weight']]];
$member_form['remove'] = ['#type' => 'submit', '#name' => 'remove_member' . $index, '#value' => $this->t('Remove'), '#limit_validation_errors' => [], '#submit' => ['::removeMemberSubmit'], '#member_index' => $index, '#ajax' => ['callback' => '::membersAjax', 'wrapper' => $wrapper_id]];
$index++;
}
// Sort the members by weight. Ensures weight is preserved on ajax refresh.
uasort($form['members'], ['\\Drupal\\Component\\Utility\\SortArray', 'sortByWeightProperty']);
$plugins = [];
foreach ($this->memberManager->getDefinitions() as $plugin => $definition) {
$plugins[$plugin] = $definition['name'];
}
$form['members']['_new'] = ['#tree' => FALSE];
$form['members']['_new']['type'] = ['#prefix' => '<div class="zone-member-new">', '#suffix' => '</div>'];
$form['members']['_new']['type']['plugin'] = ['#type' => 'select', '#title' => $this->t('Zone member type'), '#title_display' => 'invisible', '#options' => $plugins, '#empty_value' => ''];
$form['members']['_new']['type']['add_member'] = ['#type' => 'submit', '#value' => $this->t('Add'), '#validate' => ['::addMemberValidate'], '#submit' => ['::addMemberSubmit'], '#limit_validation_errors' => [['plugin']], '#ajax' => ['callback' => '::membersAjax', 'wrapper' => $wrapper_id]];
$form['members']['_new']['member'] = ['data' => []];
$form['members']['_new']['operations'] = ['data' => []];
return parent::form($form, $form_state);
}