Skip to content
Snippets Groups Projects
Commit 9e6eef37 authored by xiaohua guan's avatar xiaohua guan Committed by Yas Naoi
Browse files

Issue #3043358 by Xiaohua Guan, yas, Masami: Check both Public/Private IP...

Issue #3043358 by Xiaohua Guan, yas, Masami: Check both Public/Private IP address of my instance in both detailed/Edit View
parent ba5e234c
No related branches found
No related tags found
No related merge requests found
Showing
with 229 additions and 32 deletions
......@@ -11,4 +11,4 @@ services:
entity.link_renderer:
class: Drupal\cloud\Service\EntityLinkRenderer
arguments: ['@current_route_match', '@link_generator', '@entity_type.manager']
arguments: ['@current_route_match', '@class_resolver', '@entity_type.manager']
......@@ -11,6 +11,9 @@ field.formatter.settings.entity_link:
comma_separated:
type: boolean
label: 'Separated with comma'
html_generator_class:
type: string
label: 'Html generator class'
field.storage_settings.tag:
type: mapping
label: 'Aws Tag'
......
......@@ -732,6 +732,7 @@ class Instance extends CloudContentEntityBase implements InstanceInterface {
'settings' => [
'target_type' => 'aws_cloud_elastic_ip',
'field_name' => 'public_ip',
'html_generator_class' => PublicIpEntityLinkHtmlGenerator::class,
],
'weight' => -5,
])
......
<?php
namespace Drupal\aws_cloud\Entity\Ec2;
use Drupal\Core\Url;
use Drupal\cloud\Service\Util\EntityLinkHtmlGenerator;
/**
* Html generator for public_ip field.
*/
class PublicIpEntityLinkHtmlGenerator extends EntityLinkHtmlGenerator {
/**
* {@inheritdoc}
*/
public function generate(Url $url, $id, $name = '', $alt_text = '') {
if (!empty($name) && $name != $id) {
$html = $this->linkGenerator->generate($name, $url);
$html = "$id ($html)";
}
else {
$html = $this->linkGenerator->generate($id, $url);
}
return $html;
}
}
......@@ -7,6 +7,7 @@ use Drupal\Core\Datetime\Entity\DateFormat;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Link;
use Drupal\aws_cloud\Entity\Ec2\ElasticIp;
use Drupal\aws_cloud\Entity\Ec2\PublicIpEntityLinkHtmlGenerator;
/**
* Form controller for the CloudScripting entity edit forms.
......@@ -107,16 +108,6 @@ class InstanceEditForm extends AwsCloudContentForm {
'#weight' => $weight++,
];
$form['network']['security_groups'] = [
'#type' => 'select',
'#title' => $this->t('Security Groups'),
'#default_value' => explode(self::SECURITY_GROUP_DELIMITER,
$entity->getSecurityGroups()),
'#required' => TRUE,
'#multiple' => TRUE,
'#options' => $this->getSecurityGroupsOptions(),
];
$public_ip = $entity->getPublicIp();
$current_elastic_ip = isset($public_ip) ? $this->getElasticIpByIpLookup($public_ip) : FALSE;
......@@ -139,7 +130,9 @@ class InstanceEditForm extends AwsCloudContentForm {
'cloud_context' => $entity->getCloudContext(),
])->toString();
$form['network']['elastic_ip_link'] = [
'#markup' => '<div class="js-form-item form-item js-form-type-item form-type-item"><strong>Elastic IP: </strong><br>' . $link . '</div>',
'#type' => 'item',
'#title' => $this->getItemTitle($this->t('Elastic IP')),
'#markup' => $link,
];
}
elseif (count($this->getNetworkInterfaceCount()) > 1) {
......@@ -150,7 +143,9 @@ class InstanceEditForm extends AwsCloudContentForm {
])->toString();
$form['network']['elastic_ip_link'] = [
'#markup' => '<div class="js-form-item form-item js-form-type-item form-type-item"><strong>Elastic IP: </strong><br>' . $link . '</div>',
'#type' => 'item',
'#title' => $this->getItemTitle($this->t('Elastic IP')),
'#markup' => $link,
];
}
else {
......@@ -190,12 +185,29 @@ class InstanceEditForm extends AwsCloudContentForm {
[
'#title' => $this->getItemTitle($this->t('Elastic IP')),
],
$current_elastic_ip->getName()
'',
PublicIpEntityLinkHtmlGenerator::class
);
}
}
}
$form['network']['private_ips'] = [
'#type' => 'item',
'#title' => $this->getItemTitle($this->t('Private IPs')),
'#markup' => $entity->getPrivateIps(),
];
$form['network']['security_groups'] = [
'#type' => 'select',
'#title' => $this->t('Security Groups'),
'#default_value' => explode(self::SECURITY_GROUP_DELIMITER,
$entity->getSecurityGroups()),
'#required' => TRUE,
'#multiple' => TRUE,
'#options' => $this->getSecurityGroupsOptions(),
];
$form['network']['key_pair_name'] = $this->entityLinkRenderer->renderFormElements(
$entity->getKeyPairName(),
'aws_cloud_key_pair',
......
......@@ -106,6 +106,7 @@ class EntityLinkFormatter extends FormatterBase implements ContainerFactoryPlugi
'target_type' => '',
'field_name' => '',
'comma_separated' => FALSE,
'html_generator_class' => '',
] + parent::defaultSettings();
}
......@@ -135,6 +136,12 @@ class EntityLinkFormatter extends FormatterBase implements ContainerFactoryPlugi
'#default_value' => $this->getSetting('comma_separated'),
];
$element['html_generator_class'] = [
'#title' => $this->t('Display name'),
'#type' => 'textfield',
'#default_value' => $this->getSetting('html_generator_class'),
];
return $element;
}
......@@ -147,6 +154,7 @@ class EntityLinkFormatter extends FormatterBase implements ContainerFactoryPlugi
$target_type = $this->getSetting('target_type');
$field_name = $this->getSetting('field_name');
$comma_separated = $this->getSetting('comma_separated');
$html_generator_class = $this->getSetting('html_generator_class');
foreach ($items as $delta => $item) {
$value = $item->value;
......@@ -157,7 +165,7 @@ class EntityLinkFormatter extends FormatterBase implements ContainerFactoryPlugi
}
$element[$delta] = $this->entityLinkRenderer
->renderViewElement($value, $target_type, $field_name);
->renderViewElement($value, $target_type, $field_name, [], '', $html_generator_class);
}
return $element;
......
......@@ -4,8 +4,9 @@ namespace Drupal\cloud\Service;
use Drupal\Core\Url;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Utility\LinkGenerator;
use Drupal\Core\DependencyInjection\ClassResolver;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\cloud\Service\Util\EntityLinkHtmlGenerator;
/**
* Entity link element renderer service.
......@@ -20,11 +21,11 @@ class EntityLinkRenderer implements EntityLinkRendererInterface {
private $routeMatch;
/**
* The link generator service.
* The class resolver service.
*
* @var \Drupal\Core\Utility\LinkGenerator
* @var \Drupal\Core\DependencyInjection\ClassResolver
*/
private $linkGenerator;
private $classResolver;
/**
* An entity type manager instance.
......@@ -38,18 +39,18 @@ class EntityLinkRenderer implements EntityLinkRendererInterface {
*
* @param \Drupal\Core\Routing\RouteMatchInterface $route_match
* The current route match.
* @param \Drupal\Core\Utility\LinkGenerator $link_generator
* The link generator service.
* @param \Drupal\Core\DependencyInjection\ClassResolver $class_resolver
* The class resolver service.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* An entity type manager instance.
*/
public function __construct(
RouteMatchInterface $route_match,
LinkGenerator $link_generator,
ClassResolver $class_resolver,
EntityTypeManagerInterface $entity_type_manager) {
$this->routeMatch = $route_match;
$this->linkGenerator = $link_generator;
$this->classResolver = $class_resolver;
$this->entityTypeManager = $entity_type_manager;
}
......@@ -61,7 +62,9 @@ class EntityLinkRenderer implements EntityLinkRendererInterface {
$target_type,
$field_name,
array $query = [],
$alt_text = '') {
$alt_text = '',
$html_generator_class = ''
) {
$cloud_context = $this->routeMatch->getParameter('cloud_context');
......@@ -84,8 +87,20 @@ class EntityLinkRenderer implements EntityLinkRendererInterface {
$htmls[] = $value;
}
else {
$htmls[] = $this->linkGenerator->generate(
!empty($alt_text) ? $alt_text : $value,
$entity = $this->entityTypeManager
->getStorage($target_type)->load(reset($entity_ids));
$name = '';
if ($entity->hasField('name') && $entity->getName() != $value) {
$name = $entity->getName();
}
if (empty($html_generator_class)) {
$html_generator_class = EntityLinkHtmlGenerator::class;
}
$generator = $this->classResolver->getInstanceFromDefinition($html_generator_class);
$html = $generator->generate(
Url::fromRoute(
"entity.$target_type.canonical",
[
......@@ -93,8 +108,13 @@ class EntityLinkRenderer implements EntityLinkRendererInterface {
$target_type => array_values($entity_ids)[0],
],
['query' => $query]
)
),
$value,
$name,
$alt_text
);
$htmls[] = $html;
}
}
......@@ -111,9 +131,16 @@ class EntityLinkRenderer implements EntityLinkRendererInterface {
$target_type,
$field_name,
array $options,
$alt_text = '') {
return $this->renderViewElement($value, $target_type, $field_name, $options, $alt_text)
$alt_text = '',
$html_generator_class = '') {
return $this->renderViewElement(
$value,
$target_type,
$field_name,
$options,
$alt_text,
$html_generator_class)
+ $options
+ ['#type' => 'item'];
}
......
......@@ -20,11 +20,20 @@ interface EntityLinkRendererInterface {
* The query parameters.
* @param string $alt_text
* Optional alternative text to display.
* @param string $html_generator_class
* Html generator class.
*
* @return array
* The build array of entity link element for viewZ.
*/
public function renderViewElement($value, $target_type, $field_name, array $query, $alt_text = '');
public function renderViewElement(
$value,
$target_type,
$field_name,
array $query,
$alt_text = '',
$html_generator_class = ''
);
/**
* Render entity link for form.
......@@ -39,6 +48,8 @@ interface EntityLinkRendererInterface {
* The form element options.
* @param string $alt_text
* Alternative text to display.
* @param string $html_generator_class
* Html generator class.
*
* @return array
* The build array of entity link element for form.
......@@ -48,7 +59,8 @@ interface EntityLinkRendererInterface {
$target_type,
$field_name,
array $options,
$alt_text = ''
$alt_text = '',
$html_generator_class = ''
);
}
<?php
namespace Drupal\cloud\Service\Util;
use Drupal\Core\Url;
use Drupal\Core\Utility\LinkGenerator;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Html generator utility for Entity link.
*/
class EntityLinkHtmlGenerator implements EntityLinkHtmlGeneratorInterface {
/**
* The link generator service.
*
* @var \Drupal\Core\Utility\LinkGenerator
*/
protected $linkGenerator;
/**
* Constructor.
*
* @param \Drupal\Core\Utility\LinkGenerator $link_generator
* The link generator service.
*/
public function __construct(LinkGenerator $link_generator) {
$this->linkGenerator = $link_generator;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('link_generator')
);
}
/**
* {@inheritdoc}
*/
public function generate(Url $url, $id, $name = NULL, $alt_text = NULL) {
$text = $id;
if ($alt_text != NULL) {
$text = $alt_text;
}
return $this->linkGenerator->generate($text, $url);
}
}
<?php
namespace Drupal\cloud\Service\Util;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Drupal\Core\Url;
/**
* Html generator utility interface for Entity link.
*/
interface EntityLinkHtmlGeneratorInterface extends ContainerInjectionInterface {
/**
* Generate html.
*
* @param \Drupal\Core\Url $url
* The url of link.
* @param string $id
* The ID.
* @param string $name
* The name.
* @param string $alt_text
* The text of link.
*
* @return string
* The html of link.
*/
public function generate(Url $url, $id, $name = '', $alt_text = '');
}
<?php
namespace Drupal\cloud\Service\Util;
use Drupal\Core\Url;
/**
* Html generator utility using name for Entity link.
*/
class EntityLinkWithNameHtmlGenerator extends EntityLinkHtmlGenerator {
/**
* {@inheritdoc}
*/
public function generate(Url $url, $id, $name = '', $alt_text = '') {
$text = $id;
if (!empty($name) && $name != $id) {
$text = "$name ($id)";
}
return $this->linkGenerator->generate($text, $url);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment