Skip to content

Commit 55e75ae

Browse files
committed
Finalize entity selection
1 parent 0938050 commit 55e75ae

11 files changed

Lines changed: 134 additions & 15 deletions

File tree

Component/Grid/GridViewModel.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public function getItems(): array
9191
}
9292

9393
// @todo: Move this to child-class EntitySelectViewModel
94-
public function getCurrentItem(int|string $currentId)
94+
public function getCurrentItem(int|string $currentId): ?DataObject
9595
{
9696
try {
9797
return $this->getRepository()->getProviderHandler()->getItem($this->getRepository()->getProvider(), $currentId);

Form/Field/FieldType/CustomerSelect.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
namespace Loki\AdminComponents\Form\Field\FieldType;
55

66
use Loki\AdminComponents\Form\Field\Field;
7+
use Magento\Customer\Model\Data\Customer;
78
use Magento\Customer\Model\ResourceModel\Customer\Collection;
89

9-
class CustomerSelect extends FieldTypeAbstract
10+
class CustomerSelect extends FieldTypeAbstract implements EntitySelectInterface
1011
{
1112
public function getInputType(): string
1213
{
@@ -21,6 +22,22 @@ public function prepareField(Field $field): Field
2122
return $field;
2223
}
2324

25+
public function getIdField(): string
26+
{
27+
return 'entity_id';
28+
}
29+
30+
public function getPreviewValue($item): string
31+
{
32+
/** @var Customer $item */
33+
return $item->getFirstname().' '.$item->getLastname().' ('.$item->getEmail().')';
34+
}
35+
36+
public function getPreviewTemplate(): string
37+
{
38+
return '%name% (%email%)';
39+
}
40+
2441
public function getTemplate(): string
2542
{
2643
return 'Loki_AdminComponents::form/field_type/entity_select.phtml';

Form/Field/FieldType/EntitySelect.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44
namespace Loki\AdminComponents\Form\Field\FieldType;
55

6-
class EntitySelect extends FieldTypeAbstract
6+
use Magento\Framework\DataObject;
7+
8+
class EntitySelect extends FieldTypeAbstract implements EntitySelectInterface
79
{
810
public function getInputType(): string
911
{
@@ -14,4 +16,20 @@ public function getTemplate(): string
1416
{
1517
return 'Loki_AdminComponents::form/field_type/entity_select.phtml';
1618
}
19+
20+
public function getIdField(): string
21+
{
22+
return 'id';
23+
}
24+
25+
public function getPreviewValue($item): string
26+
{
27+
/** @var DataObject $item */
28+
return (string)$item->getName();
29+
}
30+
31+
public function getPreviewTemplate(): string
32+
{
33+
return '%name%';
34+
}
1735
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace Loki\AdminComponents\Form\Field\FieldType;
4+
5+
use Magento\Customer\Model\Data\Customer;
6+
7+
interface EntitySelectInterface
8+
{
9+
public function getIdField(): string;
10+
public function getPreviewValue($item): string;
11+
public function getPreviewTemplate(): string;
12+
}

Form/Field/FieldType/OrderSelect.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
namespace Loki\AdminComponents\Form\Field\FieldType;
55

66
use Loki\AdminComponents\Form\Field\Field;
7+
use Magento\Sales\Api\Data\OrderInterface;
78
use Magento\Sales\Api\OrderRepositoryInterface;
89

9-
class OrderSelect extends FieldTypeAbstract
10+
class OrderSelect extends FieldTypeAbstract implements EntitySelectInterface
1011
{
1112
public function __construct(
1213
private OrderRepositoryInterface $orderRepository,
@@ -26,6 +27,22 @@ public function prepareField(Field $field): Field
2627
return $field;
2728
}
2829

30+
public function getIdField(): string
31+
{
32+
return 'entity_id';
33+
}
34+
35+
public function getPreviewValue($item): string
36+
{
37+
/** @var OrderInterface $item */
38+
return '#'.$item->getIncrementId();
39+
}
40+
41+
public function getPreviewTemplate(): string
42+
{
43+
return '#%increment_id%';
44+
}
45+
2946
public function getTemplate(): string
3047
{
3148
return 'Loki_AdminComponents::form/field_type/entity_select.phtml';

Form/Field/FieldType/ProductSelect.php

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
namespace Loki\AdminComponents\Form\Field\FieldType;
55

66
use Loki\AdminComponents\Form\Field\Field;
7+
use Magento\Catalog\Api\Data\ProductInterface;
8+
use Magento\Catalog\Api\ProductRepositoryInterface;
79
use Magento\Catalog\Model\ResourceModel\Product\Collection;
810

9-
class ProductSelect extends FieldTypeAbstract
11+
class ProductSelect extends FieldTypeAbstract implements EntitySelectInterface
1012
{
1113
public function getInputType(): string
1214
{
@@ -15,12 +17,28 @@ public function getInputType(): string
1517

1618
public function prepareField(Field $field): Field
1719
{
18-
$field->setProvider(Collection::class);
20+
$field->setProvider(ProductRepositoryInterface::class);
1921
$field->setButtonLabel('Select product');
2022
$field->setNamespace('product_listing');
2123
return $field;
2224
}
2325

26+
public function getIdField(): string
27+
{
28+
return 'entity_id';
29+
}
30+
31+
public function getPreviewValue($item): string
32+
{
33+
/** @var ProductInterface $item */
34+
return $item->getName().' ('.$item->getSku().')';
35+
}
36+
37+
public function getPreviewTemplate(): string
38+
{
39+
return '%name% (%sku%)';
40+
}
41+
2442
public function getTemplate(): string
2543
{
2644
return 'Loki_AdminComponents::form/field_type/entity_select.phtml';

ViewModel/Form/Field/EntitySelect.php

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
use Loki\AdminComponents\Component\Grid\GridRepository;
77
use Loki\AdminComponents\Component\Grid\GridViewModel;
88
use Loki\AdminComponents\Form\Field\Field;
9+
use Loki\AdminComponents\Form\Field\FieldType\EntitySelectInterface;
10+
use Loki\AdminComponents\Form\Field\FieldTypeInterface;
911
use Loki\AdminComponents\Grid\Column\Column;
1012
use Loki\Components\Component\Component;
11-
use Loki\Components\Component\ComponentContext;
1213
use Magento\Framework\App\ObjectManager;
14+
use Magento\Framework\DataObject;
1315
use Magento\Framework\View\Element\AbstractBlock;
1416
use Magento\Framework\View\Element\Block\ArgumentInterface;
1517
use Magento\Framework\View\Element\Template;
@@ -54,18 +56,36 @@ public function getColumns(): array
5456
});
5557
}
5658

57-
public function getCurrentItem()
59+
public function getCurrentItem(): ?DataObject
5860
{
59-
$currentId = 1;
60-
$currentItem = $this->getGridViewModel()->getCurrentItem($currentId);
61-
return $currentItem;
61+
$items = $this->getGridViewModel()->getValue();
62+
if (empty($items)) {
63+
return null;
64+
}
65+
66+
$item = array_shift($items);
67+
if (false === $item instanceof DataObject) {
68+
return null;
69+
}
70+
71+
return $item;
72+
}
73+
74+
public function getFieldType(): FieldTypeInterface|EntitySelectInterface
75+
{
76+
return $this->getField()->getFieldType();
6277
}
6378

6479
public function getJsData(): array
6580
{
81+
$item = $this->getCurrentItem();
82+
6683
return [
6784
'ajaxUrl' => $this->getAjaxUrl(),
6885
'valueCode' => $this->getValueCode(),
86+
'idField' => $this->getFieldType()->getIdField(),
87+
'previewValue' => $this->getFieldType()->getPreviewValue($item),
88+
'previewTemplate' => $this->getFieldType()->getPreviewTemplate(),
6989
];
7090
}
7191

view/adminhtml/templates/form/field_type/entity_select.phtml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,13 @@ $fieldId = $field->getDomId();
4848
<data hidden x-ref="initialData" type="text/x-loki-init"><?= /* @noEscape */ $entitySelect->getJsonData() ?></data>
4949

5050
<div class="input-with-button">
51+
<span
52+
class="admin__control-text"
53+
>
5154
<input
5255
id="<?= $escaper->escapeHtml($fieldId) ?>"
53-
class="admin__control-text"
5456
type="<?= $escaper->escapeHtml($inputType) ?>"
57+
style="padding:0; border:none;"
5558
name="<?= $escaper->escapeHtml($field->getCode()) ?>"
5659
data-name="<?= $escaper->escapeHtml($field->getCode()) ?>"
5760
<?php foreach ($fieldAttributes as $attributeName => $attributeValue) :?>
@@ -60,6 +63,8 @@ $fieldId = $field->getDomId();
6063
:value="<?= $escaper->escapeHtml($valueCode) ?>"
6164
@change="<?= $escaper->escapeHtml($field->getAlpineSetter()) ?>"
6265
>
66+
<span style="float: right; color: #777; font-size: 80%;" x-html="previewValue"></span>
67+
</span>
6368

6469
<button @click="showModalWrapper"><?= $escaper->escapeHtml(__($buttonLabel)) ?></button>
6570
</div>

view/adminhtml/templates/form/field_type/entity_select/table.phtml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ use Loki\Components\Util\Block\TemplateRenderer;
1414
/** @var GridViewModel $viewModel */
1515
/** @var TemplateRenderer $templateRenderer */
1616

17+
// @todo: Is this still being used?
18+
1719
$viewModel = $block->getViewModel();
1820
$state = $viewModel->getState();
1921
?>

view/adminhtml/templates/script/component/entity-select-component.phtml

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,15 @@ use Magento\Framework\View\Element\Template;
1313
Alpine.data('LokiAdminFormEntitySelectComponent', () => ({
1414
...LokiLoadDataComponentPartial,
1515
isModalWrapperVisible: false,
16+
idField: 'entity_id',
1617
currentEntityCode: '',
17-
currentEntityLabel: '',
18+
previewValue: '',
19+
previewTemplate: '',
1820
totalEntities: 0,
1921
ajaxUrl: '',
2022
valueCode: 'value',
2123
search: '',
24+
currentEntity: null,
2225
entities: [],
2326
init() {
2427
this.loadData();
@@ -96,10 +99,14 @@ use Magento\Framework\View\Element\Template;
9699

97100
current[parts[parts.length - 1]] = value;
98101
},
102+
setPreviewValueFromTemplate() {
103+
this.previewValue = this.previewTemplate.replace(/%([^%]+)%/g, (_, key) => this.currentEntity?.[key] ?? '');
104+
},
99105
selectEntity(entity) {
100-
const value = entity[entity.id_field_name];
106+
this.currentEntity = entity;
107+
this.setPreviewValueFromTemplate();
108+
const value = entity[this.idField];
101109
this.setNested(this, this.valueCode, value);
102-
this.currentEntityLabel = entity[entity.name];
103110
this.closeWrapper();
104111
}
105112
}));

0 commit comments

Comments
 (0)