You are here

class AssetReorderController in farmOS 2.x

Returns responses for asset drag and drop routes.

Hierarchy

Expanded class hierarchy of AssetReorderController

File

modules/core/ui/location/src/Controller/AssetReorderController.php, line 16

Namespace

Drupal\farm_ui_location\Controller
View source
class AssetReorderController extends ControllerBase implements AssetReorderControllerInterface {

  /**
   * The asset location service.
   *
   * @var \Drupal\farm_location\AssetLocationInterface
   */
  protected $assetLocation;

  /**
   * The controller constructor.
   *
   * @param \Drupal\farm_location\AssetLocationInterface $asset_location
   *   The asset location service.
   */
  public function __construct(AssetLocationInterface $asset_location) {
    $this->assetLocation = $asset_location;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static($container
      ->get('asset.location'));
  }

  /**
   * Check access.
   */
  public function access(AccountInterface $account, AssetInterface $asset = NULL) {

    // If the asset is not a location, forbid access.
    if (!$this->assetLocation
      ->isLocation($asset)) {
      return AccessResult::forbidden();
    }

    // Allow access if the asset has child locations.
    return AccessResult::allowedIf(!empty($this
      ->getLocations($asset)));
  }

  /**
   * Generate the page title.
   *
   * @param \Drupal\asset\Entity\AssetInterface|null $asset
   *   Optionally specify the parent asset that this page is being built for.
   *
   * @return string
   *   Returns the translated page title.
   */
  public function getTitle(AssetInterface $asset = NULL) {
    if (!empty($asset)) {
      return $this
        ->t('Locations in %location', [
        '%location' => $asset
          ->label(),
      ]);
    }
    return $this
      ->t('Locations');
  }

  /**
   * Builds the response.
   *
   * @param \Drupal\asset\Entity\AssetInterface|null $asset
   *   Optionally specify the parent asset, to only build a sub-tree. If
   *   omitted, all assets will be included.
   *
   * @return array
   *   Returns a build array.
   *
   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
   * @throws \Drupal\Core\Entity\EntityMalformedException
   */
  public function build(AssetInterface $asset = NULL) {
    $build['content'] = [
      '#type' => 'html_tag',
      '#tag' => 'div',
      '#attributes' => [
        'class' => [
          'locations-tree',
        ],
      ],
    ];
    $build['toggle_drag_and_drop'] = [
      '#type' => 'link',
      '#title' => $this
        ->t('Toggle drag and drop'),
      '#url' => Url::fromUserInput('#'),
      '#attributes' => [
        'class' => [
          'locations-tree-toggle',
          'button',
          'button--secondary',
        ],
      ],
    ];
    $build['save'] = [
      '#type' => 'link',
      '#title' => $this
        ->t('Save'),
      '#url' => Url::fromRoute('<none>'),
      '#attributes' => [
        'class' => [
          'locations-tree-save',
          'button',
          'button--primary',
        ],
      ],
    ];
    $build['reset'] = [
      '#type' => 'link',
      '#title' => $this
        ->t('Reset'),
      '#url' => Url::fromRoute('<none>'),
      '#attributes' => [
        'class' => [
          'locations-tree-reset',
          'button',
          'button--danger',
        ],
      ],
    ];
    $build['#attached']['library'][] = 'farm_ui_location/locations-drag-and-drop';
    $tree = [
      [
        'uuid' => !empty($asset) ? $asset
          ->uuid() : '',
        'text' => !empty($asset) ? $asset
          ->label() : $this
          ->t('All locations'),
        'children' => !empty($asset) ? $this
          ->buildTree($asset) : $this
          ->buildTree(),
        'type' => !empty($asset) ? $asset
          ->bundle() : '',
        'url' => !empty($asset) ? $asset
          ->toUrl('canonical', [
          'absolute' => TRUE,
        ])
          ->toString() : '/locations',
      ],
    ];
    $build['#attached']['drupalSettings']['asset_tree'] = $tree;
    $build['#attached']['drupalSettings']['asset_parent'] = !empty($asset) ? $asset
      ->uuid() : '';
    $build['#attached']['drupalSettings']['asset_parent_type'] = !empty($asset) ? $asset
      ->bundle() : '';
    return $build;
  }

  /**
   * Build the asset tree.
   *
   * @param \Drupal\asset\Entity\AssetInterface|null $asset
   *   Optionally specify the parent asset, to only build a sub-tree. If
   *   omitted, all assets will be included.
   *
   * @return array
   *   Returns the asset tree for use in Drupal JS settings.
   *
   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
   */
  protected function buildTree(AssetInterface $asset = NULL) {
    $locations = $this
      ->getLocations($asset);
    $tree = [];
    if ($locations) {
      foreach ($locations as $location) {
        $element = [
          'uuid' => $location
            ->uuid(),
          'text' => $location
            ->label(),
          'children' => $this
            ->buildTree($location),
          'type' => $location
            ->bundle(),
          'url' => $location
            ->toUrl('canonical', [
            'absolute' => TRUE,
          ])
            ->toString(),
        ];
        $element['original_parent'] = $asset ? $asset
          ->uuid() : '';
        $element['original_type'] = $asset ? $asset
          ->bundle() : '';
        $tree[] = $element;
      }
    }
    return $tree;
  }

  /**
   * Gets location assets.
   *
   * @param \Drupal\asset\Entity\AssetInterface|null $asset
   *   Optionally provide a parent asset to only retrieve its direct children.
   *
   * @return \Drupal\asset\Entity\AssetInterface[]
   *   An array of location assets.
   *
   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
   */
  protected function getLocations(AssetInterface $asset = NULL) {

    // Query unarchived location assets.
    $storage = $this
      ->entityTypeManager()
      ->getStorage('asset');
    $query = $storage
      ->getQuery()
      ->accessCheck(TRUE)
      ->condition('is_location', TRUE)
      ->condition('status', 'archived', '!=')
      ->sort('name');

    // Limit to a specific parent or no parent.
    if ($asset) {
      $query
        ->condition('parent', $asset
        ->id());
    }
    else {
      $query
        ->condition('parent', NULL, 'IS NULL');
    }

    // Query and return assets.
    $asset_ids = $query
      ->execute();
    if (empty($asset_ids)) {
      return [];
    }

    /** @var \Drupal\asset\Entity\AssetInterface[] $assets */
    $assets = $storage
      ->loadMultiple($asset_ids);
    return $assets;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
AssetReorderController::$assetLocation protected property The asset location service.
AssetReorderController::access public function Check access. Overrides AssetReorderControllerInterface::access
AssetReorderController::build public function Builds the response. Overrides AssetReorderControllerInterface::build
AssetReorderController::buildTree protected function Build the asset tree.
AssetReorderController::create public static function Instantiates a new instance of this class. Overrides ControllerBase::create
AssetReorderController::getLocations protected function Gets location assets.
AssetReorderController::getTitle public function Generate the page title.
AssetReorderController::__construct public function The controller constructor.
ControllerBase::$configFactory protected property The configuration factory.
ControllerBase::$currentUser protected property The current user service. 1
ControllerBase::$entityFormBuilder protected property The entity form builder.
ControllerBase::$entityTypeManager protected property The entity type manager.
ControllerBase::$formBuilder protected property The form builder. 2
ControllerBase::$keyValue protected property The key-value storage. 1
ControllerBase::$languageManager protected property The language manager. 1
ControllerBase::$moduleHandler protected property The module handler. 2
ControllerBase::$stateService protected property The state service.
ControllerBase::cache protected function Returns the requested cache bin.
ControllerBase::config protected function Retrieves a configuration object.
ControllerBase::container private function Returns the service container.
ControllerBase::currentUser protected function Returns the current user. 1
ControllerBase::entityFormBuilder protected function Retrieves the entity form builder.
ControllerBase::entityTypeManager protected function Retrieves the entity type manager.
ControllerBase::formBuilder protected function Returns the form builder service. 2
ControllerBase::keyValue protected function Returns a key/value storage collection. 1
ControllerBase::languageManager protected function Returns the language manager service. 1
ControllerBase::moduleHandler protected function Returns the module handler. 2
ControllerBase::redirect protected function Returns a redirect response object for the specified route.
ControllerBase::state protected function Returns the state storage service.
LoggerChannelTrait::$loggerFactory protected property The logger channel factory service.
LoggerChannelTrait::getLogger protected function Gets the logger for a specific channel.
LoggerChannelTrait::setLoggerFactory public function Injects the logger channel factory.
MessengerTrait::$messenger protected property The messenger. 27
MessengerTrait::messenger public function Gets the messenger. 27
MessengerTrait::setMessenger public function Sets the messenger.
RedirectDestinationTrait::$redirectDestination protected property The redirect destination service. 1
RedirectDestinationTrait::getDestinationArray protected function Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url.
RedirectDestinationTrait::getRedirectDestination protected function Returns the redirect destination service.
RedirectDestinationTrait::setRedirectDestination public function Sets the redirect destination service.
StringTranslationTrait::$stringTranslation protected property The string translation service. 4
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.