2021-04-27 19:24:50 +02:00
< ? php
namespace Drupal\farm_location\Form ;
2022-06-18 01:03:55 +02:00
use Drupal\asset\Entity\AssetInterface ;
2021-04-27 19:24:50 +02:00
use Drupal\Core\Datetime\DrupalDateTime ;
use Drupal\Core\Entity\EntityTypeManagerInterface ;
use Drupal\Core\Form\ConfirmFormBase ;
use Drupal\Core\Form\FormStateInterface ;
2023-08-09 21:12:11 +02:00
use Drupal\Core\Render\Markup ;
2021-04-27 19:24:50 +02:00
use Drupal\Core\Session\AccountInterface ;
use Drupal\Core\TempStore\PrivateTempStoreFactory ;
use Drupal\Core\Url ;
use Drupal\log\Entity\Log ;
use Symfony\Component\DependencyInjection\ContainerInterface ;
use Symfony\Component\HttpFoundation\RedirectResponse ;
2022-09-12 18:12:43 +02:00
use Symfony\Component\HttpFoundation\Request ;
2021-04-27 19:24:50 +02:00
/**
* Provides an asset move confirmation form .
*/
class AssetMoveActionForm extends ConfirmFormBase {
/**
* The tempstore factory .
*
* @ var \Drupal\Core\TempStore\SharedTempStore
*/
protected $tempStore ;
/**
* The entity type manager .
*
* @ var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager ;
/**
* The current user .
*
* @ var \Drupal\Core\Session\AccountInterface
*/
protected $user ;
/**
* The entity type .
*
* @ var \Drupal\Core\Entity\EntityTypeInterface
*/
protected $entityType ;
/**
2021-10-18 16:55:29 +02:00
* The assets to move .
2021-04-27 19:24:50 +02:00
*
* @ var \Drupal\Core\Entity\EntityInterface []
*/
protected $entities ;
2022-09-12 18:12:43 +02:00
/**
* The current Request object .
*
* @ var \Symfony\Component\HttpFoundation\Request
*/
protected $request ;
2021-04-27 19:24:50 +02:00
/**
* Constructs an AssetMoveActionForm form object .
*
* @ param \Drupal\Core\TempStore\PrivateTempStoreFactory $temp_store_factory
* The tempstore factory .
* @ param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager .
* @ param \Drupal\Core\Session\AccountInterface $user
* The current user .
2022-09-12 18:12:43 +02:00
* @ param \Symfony\Component\HttpFoundation\Request $request
* The current Request object .
2021-04-27 19:24:50 +02:00
*/
2022-09-12 18:12:43 +02:00
public function __construct ( PrivateTempStoreFactory $temp_store_factory , EntityTypeManagerInterface $entity_type_manager , AccountInterface $user , Request $request ) {
2021-04-27 19:24:50 +02:00
$this -> tempStore = $temp_store_factory -> get ( 'asset_move_confirm' );
$this -> entityTypeManager = $entity_type_manager ;
$this -> user = $user ;
2022-09-12 18:12:43 +02:00
$this -> request = $request ;
2021-04-27 19:24:50 +02:00
}
/**
* { @ inheritdoc }
*/
public static function create ( ContainerInterface $container ) {
return new static (
$container -> get ( 'tempstore.private' ),
$container -> get ( 'entity_type.manager' ),
2022-09-12 18:12:43 +02:00
$container -> get ( 'current_user' ),
$container -> get ( 'request_stack' ) -> getCurrentRequest (),
2021-04-27 19:24:50 +02:00
);
}
/**
* { @ inheritdoc }
*/
public function getFormId () {
return 'asset_move_action_confirm_form' ;
}
/**
* { @ inheritdoc }
*/
public function getQuestion () {
return $this -> formatPlural ( count ( $this -> entities ), 'Are you sure you want to move this @item?' , 'Are you sure you want to move these @items?' , [
'@item' => $this -> entityType -> getSingularLabel (),
'@items' => $this -> entityType -> getPluralLabel (),
]);
}
/**
* { @ inheritdoc }
*/
public function getCancelUrl () {
if ( $this -> entityType -> hasLinkTemplate ( 'collection' )) {
return new Url ( 'entity.' . $this -> entityType -> id () . '.collection' );
}
else {
return new Url ( '<front>' );
}
}
/**
* { @ inheritdoc }
*/
public function getDescription () {
return '' ;
}
/**
* { @ inheritdoc }
*/
public function getConfirmText () {
return $this -> t ( 'Move' );
}
/**
* { @ inheritdoc }
*/
public function buildForm ( array $form , FormStateInterface $form_state ) {
2022-06-18 01:03:55 +02:00
// Check if asset IDs were provided in the asset query param.
2022-09-12 18:12:43 +02:00
if ( $asset_ids = $this -> request -> get ( 'asset' )) {
2022-06-18 01:03:55 +02:00
// Wrap in an array, if necessary.
if ( ! is_array ( $asset_ids )) {
$asset_ids = [ $asset_ids ];
}
// Add each asset the user has view access to.
$this -> entities = array_filter ( $this -> entityTypeManager -> getStorage ( 'asset' ) -> loadMultiple ( $asset_ids ), function ( AssetInterface $asset ) {
return $asset -> access ( 'view' , $this -> user );
});
}
// Else load entities from the tempStore state.
else {
$this -> entities = $this -> tempStore -> get ( $this -> user -> id ());
}
2021-04-27 19:24:50 +02:00
$this -> entityType = $this -> entityTypeManager -> getDefinition ( 'asset' );
if ( empty ( $this -> entityType ) || empty ( $this -> entities )) {
return new RedirectResponse ( $this -> getCancelUrl ()
-> setAbsolute ()
-> toString ());
}
$form [ 'date' ] = [
2023-02-04 16:43:39 +01:00
'#type' => 'datetime' ,
2021-04-27 19:24:50 +02:00
'#title' => $this -> t ( 'Date' ),
2023-03-29 15:33:04 +02:00
'#default_value' => new DrupalDateTime ( 'midnight' , $this -> user -> getTimeZone ()),
2021-04-27 19:24:50 +02:00
'#required' => TRUE ,
];
$form [ 'location' ] = [
'#type' => 'entity_autocomplete' ,
'#title' => $this -> t ( 'Location' ),
'#target_type' => 'asset' ,
'#selection_handler' => 'views' ,
'#selection_settings' => [
'view' => [
'view_name' => 'farm_location_reference' ,
'display_name' => 'entity_reference' ,
],
'match_operator' => 'CONTAINS' ,
'match_limit' => 10 ,
],
'#tags' => TRUE ,
'#validate_reference' => FALSE ,
'#maxlength' => 1024 ,
];
$form [ 'done' ] = [
'#type' => 'checkbox' ,
'#title' => $this -> t ( 'This movement has taken place (mark the log as done)' ),
];
return parent :: buildForm ( $form , $form_state );
}
/**
* { @ inheritdoc }
*/
public function submitForm ( array & $form , FormStateInterface $form_state ) {
// Filter out entities the user doesn't have access to.
$inaccessible_entities = [];
$accessible_entities = [];
foreach ( $this -> entities as $entity ) {
if ( ! $entity -> access ( 'update' , $this -> currentUser ())) {
$inaccessible_entities [] = $entity ;
continue ;
}
$accessible_entities [] = $entity ;
}
// Create an activity log to move the assets.
if ( $form_state -> getValue ( 'confirm' ) && ! empty ( $accessible_entities )) {
// Load location assets.
$locations = [];
2022-06-13 22:35:15 +02:00
$location_ids = array_column ( $form_state -> getValue ( 'location' , []) ? ? [], 'target_id' );
2021-04-27 19:24:50 +02:00
if ( ! empty ( $location_ids )) {
$locations = $this -> entityTypeManager -> getStorage ( 'asset' ) -> loadMultiple ( $location_ids );
}
$done = ( bool ) $form_state -> getValue ( 'done' , FALSE );
2021-08-30 22:57:29 +02:00
// Generate a name for the log.
2023-05-10 22:53:53 +02:00
// @phpstan-ignore-next-line
2021-08-30 22:57:29 +02:00
$asset_names = farm_log_asset_names_summary ( $accessible_entities );
2023-05-10 22:53:53 +02:00
// @phpstan-ignore-next-line
2021-08-30 22:57:29 +02:00
$location_names = farm_log_asset_names_summary ( $locations );
2023-08-09 21:12:11 +02:00
$log_name = $this -> t ( 'Clear location of @assets' , [ '@assets' => Markup :: create ( $asset_names )]);
2023-04-13 23:03:45 +02:00
if ( ! empty ( $location_names )) {
2023-08-09 21:12:11 +02:00
$log_name = $this -> t ( 'Move @assets to @locations' , [ '@assets' => Markup :: create ( $asset_names ), '@locations' => Markup :: create ( $location_names )]);
2023-04-13 23:03:45 +02:00
}
2021-08-30 22:57:29 +02:00
2021-04-27 19:24:50 +02:00
// Create the log.
$log = Log :: create ([
2021-08-30 22:57:29 +02:00
'name' => $log_name ,
2021-04-27 19:24:50 +02:00
'type' => 'activity' ,
2023-02-04 16:43:39 +01:00
'timestamp' => $form_state -> getValue ( 'date' ) -> getTimestamp (),
2021-04-27 19:24:50 +02:00
'asset' => $accessible_entities ,
'is_movement' => TRUE ,
'location' => $locations ,
]);
// Mark as done.
if ( $done !== FALSE ) {
$log -> get ( 'status' ) -> first () -> applyTransitionById ( 'done' );
}
2021-12-08 00:26:15 +01:00
// Validate the log before saving.
$violations = $log -> validate ();
if ( $violations -> count () > 0 ) {
$this -> messenger () -> addWarning (
$this -> t ( 'Could not move assets: @bundle @entity_type validation failed.' ,
[
'@bundle' => $log -> getBundleLabel (),
'@entity_type' => $log -> getEntityType () -> getSingularLabel (),
],
),
);
$this -> tempStore -> delete ( $this -> currentUser () -> id ());
$form_state -> setRedirectUrl ( $this -> getCancelUrl ());
return ;
}
2021-04-27 19:24:50 +02:00
$log -> save ();
$this -> messenger () -> addMessage ( $this -> t ( 'Log created: <a href=":uri">%log_label</a>' , [ ':uri' => $log -> toUrl () -> toString (), '%log_label' => $log -> label ()]));
}
// Add warning message for inaccessible entities.
if ( ! empty ( $inaccessible_entities )) {
$inaccessible_count = count ( $inaccessible_entities );
$this -> messenger () -> addWarning ( $this -> formatPlural ( $inaccessible_count , 'Could not move @count @item because you do not have the necessary permissions.' , 'Could not move @count @items because you do not have the necessary permissions.' , [
'@item' => $this -> entityType -> getSingularLabel (),
'@items' => $this -> entityType -> getPluralLabel (),
]));
}
$this -> tempStore -> delete ( $this -> currentUser () -> id ());
$form_state -> setRedirectUrl ( $this -> getCancelUrl ());
}
}