diff --git a/core/modules/workflows/src/Entity/Workflow.php b/core/modules/workflows/src/Entity/Workflow.php index 51bdda2..ca02d86 100644 --- a/core/modules/workflows/src/Entity/Workflow.php +++ b/core/modules/workflows/src/Entity/Workflow.php @@ -3,6 +3,7 @@ namespace Drupal\workflows\Entity; use Drupal\Core\Config\Entity\ConfigEntityBase; +use Drupal\Core\Entity\EntityStorageException; use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Entity\EntityWithPluginCollectionInterface; use Drupal\Core\Plugin\DefaultSingleLazyPluginCollection; diff --git a/core/modules/workflows/src/Form/WorkflowDeleteForm.php b/core/modules/workflows/src/Form/WorkflowDeleteForm.php index b9b8331..1b4cd7d 100644 --- a/core/modules/workflows/src/Form/WorkflowDeleteForm.php +++ b/core/modules/workflows/src/Form/WorkflowDeleteForm.php @@ -14,6 +14,19 @@ class WorkflowDeleteForm extends EntityConfirmFormBase { /** * {@inheritdoc} */ + public function buildForm(array $form, FormStateInterface $form_state) { + if ($this->entity->access('delete', $this->entity)) { + $form['#title'] = $this->getQuestion(); + $form['description'] = ['#markup' => $this->t('This workflow is in use. You cannot remove this workflow until you have removed all content using it.')]; + return $form; + } + + return parent::buildForm($form, $form_state); + } + + /** + * {@inheritdoc} + */ public function getQuestion() { return $this->t('Are you sure you want to delete %name?', ['%name' => $this->entity->label()]); } diff --git a/core/modules/workflows/src/Form/WorkflowEditForm.php b/core/modules/workflows/src/Form/WorkflowEditForm.php index 764c0c9..c8e8987 100644 --- a/core/modules/workflows/src/Form/WorkflowEditForm.php +++ b/core/modules/workflows/src/Form/WorkflowEditForm.php @@ -80,6 +80,7 @@ public function form(array $form, FormStateInterface $form_state) { ); } + $required_states = $workflow->getTypePlugin()->getRequiredStates(); foreach ($states as $state) { $links = [ 'edit' => [ @@ -88,7 +89,7 @@ public function form(array $form, FormStateInterface $form_state) { 'attributes' => ['aria-label' => $this->t('Edit @state state', ['@state' => $state->label()])], ] ]; - if ($this->entity->access('delete-state:' . $state->id())) { + if (!in_array($state->id(), $required_states)) { $links['delete'] = [ 'title' => t('Delete'), 'url' => Url::fromRoute('entity.workflow.delete_state_form', [ diff --git a/core/modules/workflows/src/Form/WorkflowStateDeleteForm.php b/core/modules/workflows/src/Form/WorkflowStateDeleteForm.php index c60045c..8c018c6 100644 --- a/core/modules/workflows/src/Form/WorkflowStateDeleteForm.php +++ b/core/modules/workflows/src/Form/WorkflowStateDeleteForm.php @@ -75,6 +75,14 @@ public function buildForm(array $form, FormStateInterface $form_state, WorkflowI } $this->workflow = $workflow; $this->stateId = $workflow_state; + + $state_delete_access = $this->workflow->access('delete-state:' . $this->stateId, NULL, TRUE); + if ($state_delete_access->isForbidden()) { + $form['#title'] = $this->getQuestion(); + $form['description'] = ['#markup' => $state_delete_access->getReason()]; + return $form; + } + return parent::buildForm($form, $form_state); } diff --git a/core/modules/workflows/src/WorkflowDeleteAccessCheck.php b/core/modules/workflows/src/WorkflowDeleteAccessCheck.php deleted file mode 100644 index df3b7dd..0000000 --- a/core/modules/workflows/src/WorkflowDeleteAccessCheck.php +++ /dev/null @@ -1,53 +0,0 @@ -getParameters(); - if ($parameters->has('workflow') && $parameters->has('workflow_state')) { - $entity = $parameters->get('workflow'); - if ($entity instanceof EntityInterface) { - return $entity->access('delete-state:' . $parameters->get('workflow_state'), $account, TRUE); - } - } - // No opinion, so other access checks should decide if access should be - // allowed or not. - return AccessResult::neutral(); - } - -} diff --git a/core/modules/workflows/workflows.routing.yml b/core/modules/workflows/workflows.routing.yml index 329ed10..6f8202b 100644 --- a/core/modules/workflows/workflows.routing.yml +++ b/core/modules/workflows/workflows.routing.yml @@ -20,7 +20,7 @@ entity.workflow.delete_state_form: _form: '\Drupal\workflows\Form\WorkflowStateDeleteForm' _title: 'Delete state' requirements: - _workflow_state_delete_access: 'true' + _entity_access: 'workflow.edit' entity.workflow.add_transition_form: path: '/admin/config/workflow/workflows/manage/{workflow}/add_transition' diff --git a/core/modules/workflows/workflows.services.yml b/core/modules/workflows/workflows.services.yml index 7d32420..cd8176c 100644 --- a/core/modules/workflows/workflows.services.yml +++ b/core/modules/workflows/workflows.services.yml @@ -4,7 +4,3 @@ services: parent: default_plugin_manager tags: - { name: plugin_manager_cache_clear } - workflows.access_check.delete_state: - class: \Drupal\workflows\WorkflowDeleteAccessCheck - tags: - - { name: access_check, applies_to: _workflow_state_delete_access }