Skip to content

Commit 4b91218

Browse files
committed
WIP with entity select field type
1 parent 8b4d4d8 commit 4b91218

4 files changed

Lines changed: 303 additions & 17 deletions

File tree

Component/Grid/GridViewModel.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,16 @@
22

33
namespace Loki\AdminComponents\Component\Grid;
44

5-
use Hyva\Admin\ViewModel\HyvaGrid\GridFilterInterface;
65
use Loki\AdminComponents\Grid\Column\Column;
7-
use Loki\AdminComponents\Grid\Filter\Filter;
86
use Loki\AdminComponents\Grid\Filter\FilterFactory;
97
use Loki\AdminComponents\Grid\Filter\StaticFilterInterface;
108
use Loki\AdminComponents\Grid\MassAction\MassActionFactory;
119
use Loki\AdminComponents\Grid\State\FilterState;
1210
use Loki\AdminComponents\Ui\ButtonInterface;
13-
use Magento\Framework\Data\OptionSourceInterface;
1411
use Magento\Framework\DataObject;
1512
use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
1613
use Magento\Framework\ObjectManagerInterface;
1714
use Magento\Framework\UrlFactory;
18-
use Loki\AdminComponents\Form\Field\Field;
1915
use Loki\AdminComponents\Form\Field\FieldFactory;
2016
use Loki\AdminComponents\Grid\Cell\CellAction;
2117
use Loki\AdminComponents\Grid\Cell\CellActionFactory;
@@ -25,11 +21,9 @@
2521
use Loki\AdminComponents\Grid\MassAction\MassActionInterface;
2622
use Loki\AdminComponents\Grid\State;
2723
use Loki\AdminComponents\Grid\StateManager;
28-
use Loki\AdminComponents\Ui\Button;
2924
use Loki\AdminComponents\Ui\ButtonFactory;
3025
use Loki\Components\Component\ComponentViewModel;
3126
use Loki\Components\Util\CamelCaseConvertor;
32-
use RuntimeException;
3327

3428
/**
3529
* @method GridRepository getRepository()
@@ -98,6 +92,12 @@ public function getItems(): array
9892
return $this->items[$this->getNamespace()];
9993
}
10094

95+
// @todo: Move this to child-class EntitySelectViewModel
96+
public function getCurrentItem(int|string $currentId)
97+
{
98+
return $this->getRepository()->getProviderHandler()->getItem($this->getBlock()->getProvider(), $currentId);
99+
}
100+
101101
public function applyStaticFilters(): void
102102
{
103103
$staticFilters = (array)$this->getBlock()->getStaticFilters();

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

Lines changed: 64 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
11
<?php
22
declare(strict_types=1);
33

4-
use Magento\Framework\Escaper;
5-
use Magento\Framework\View\Element\Template;
4+
use Loki\AdminComponents\Component\Grid\GridRepository;
5+
use Loki\AdminComponents\Component\Grid\GridViewModel;
66
use Loki\AdminComponents\Form\Field\Field;
77
use Loki\AdminComponents\Form\Field\FieldType\Input;
8+
use Loki\Components\Component\Component;
9+
use Loki\Components\Component\ComponentContext;
10+
use Loki\Components\Factory\ViewModelFactory;
811
use Loki\Components\Util\Block\TemplateRenderer;
12+
use Magento\Customer\Model\ResourceModel\Customer;
13+
use Magento\Customer\Model\ResourceModel\Customer\Collection;
14+
use Magento\Framework\App\ObjectManager;
15+
use Magento\Framework\Escaper;
16+
use Magento\Framework\View\Element\Template;
917

1018
/** @version 0.4.4 */
1119
/** @var Escaper $escaper */
1220
/** @var Template $block */
1321
/** @var Field $field */
1422
/** @var Input $fieldType */
1523
/** @var TemplateRenderer $templateRenderer */
24+
/** @var ViewModelFactory $viewModelFactory */
1625

1726
$field = $block->getField();
1827
$fieldAttributes = $field->getFieldAttributes();
@@ -23,10 +32,28 @@ if (isset($fieldAttributes['type'])) {
2332
unset($fieldAttributes['type']);
2433
}
2534

35+
/** @var Component $component */
36+
$block->setNamespace('customer_listing');
37+
$block->setResourceModel(Customer::class);
38+
$block->setProvider(ObjectManager::getInstance()->get(Collection::class));
39+
40+
$component = ObjectManager::getInstance()->create(Component::class, [
41+
'name' => $block->getNameInLayout(),
42+
'viewModelClass' => GridViewModel::class,
43+
'repositoryClass' => GridRepository::class,
44+
'context' => ObjectManager::getInstance()->create(ComponentContext::class),
45+
]);
46+
47+
/** @var GridViewModel $gridViewModel */
48+
$gridViewModel = $component->getViewModel();
49+
$columns = $gridViewModel->getColumns();
50+
51+
$currentId = 1;
52+
$currentItem = $gridViewModel->getCurrentItem($currentId);
53+
2654
// @todo: Escape key does not close popup
2755
// @todo: Modal effect with _show does not animate
28-
29-
$iframeUrl = $block->getUrl('loki_admin_components/index/entity');
56+
$valueCode = $field->getScope() . '.' . $field->getCode();
3057
?>
3158
<div x-data="LokiAdminFormEntitySelectComponent">
3259
<div class="input-with-button">
@@ -38,8 +65,7 @@ $iframeUrl = $block->getUrl('loki_admin_components/index/entity');
3865
<?php foreach ($fieldAttributes as $attributeName => $attributeValue) :?>
3966
<?= /* @noEscape */ $attributeName ?>="<?= /* @noEscape */ $attributeValue ?>"
4067
<?php endforeach; ?>
41-
:value="<?= $escaper->escapeHtml($field->getScope()) ?>
42-
.<?= $escaper->escapeHtml($field->getCode()) ?>"
68+
:value="<?= $escaper->escapeHtml($valueCode) ?>"
4369
@change="<?= $escaper->escapeHtml($field->getAlpineSetter()) ?>"
4470
>
4571

@@ -68,7 +94,38 @@ $iframeUrl = $block->getUrl('loki_admin_components/index/entity');
6894
</button>
6995
</header>
7096

71-
<iframe src="<?= $iframeUrl ?>" class="entity-select-iframe"></iframe>
97+
<template x-if="hasEntities">
98+
<div class="admin__data-grid-wrap" data-role="grid-wrapper">
99+
<table class="data-grid" data-role="grid">
100+
<thead>
101+
<tr>
102+
<?php foreach ($columns as $column) : ?>
103+
<th class="data-grid-th">
104+
<span class="data-grid-cell-content">
105+
<?= $column->getLabel() ?>
106+
</span>
107+
</th>
108+
<?php endforeach; ?>
109+
</tr>
110+
</thead>
111+
<tbody>
112+
<template x-for="entity in entities" :key="entity.entity_id">
113+
<tr class="data-row">
114+
<td class="data-grid-cell">
115+
<button @click="selectEntity(entity)">Select</button>
116+
</td>
117+
<?php foreach ($columns as $column) : ?>
118+
<td class="data-grid-cell">
119+
<div class="data-grid-cell-content" x-html="entity.<?= $column->getCode() ?>"></div>
120+
</td>
121+
<?php endforeach; ?>
122+
</tr>
123+
</template>
124+
</tbody>
125+
</table>
126+
</div>
127+
</template>
128+
72129
</div>
73130
</aside>
74131
<div class="modals-overlay"></div>
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
/** @version 0.4.4 */
5+
6+
use Magento\Framework\Escaper;
7+
use Magento\Framework\Data\Collection\AbstractDb;
8+
use Magento\Framework\View\Element\Template;
9+
use Loki\AdminComponents\Component\Grid\GridViewModel;
10+
use Loki\Components\Util\Block\TemplateRenderer;
11+
12+
/** @var Escaper $escaper */
13+
/** @var Template $block */
14+
/** @var GridViewModel $viewModel */
15+
/** @var TemplateRenderer $templateRenderer */
16+
17+
$viewModel = $block->getViewModel();
18+
$state = $viewModel->getState();
19+
?>
20+
<div class="admin__data-grid-wrap" data-role="grid-wrapper">
21+
<table class="data-grid" data-role="grid">
22+
<thead>
23+
<tr x-sort.ghost="repositionColumns">
24+
<th class="data-grid-multicheck-cell">
25+
<div class="action-multicheck-wrap">
26+
<input
27+
class="admin__control-checkbox"
28+
type="checkbox"
29+
disabled
30+
/>
31+
32+
<button
33+
class="action-multicheck-toggle"
34+
@click.prevent="toggleSelectedMenu"
35+
>
36+
<span>Options</span>
37+
</button>
38+
39+
<ul class="action-menu" x-cloak x-show="showSelectedMenu">
40+
<li @click.prevent="selectAll">
41+
<span class="action-menu-item">Select All</span>
42+
</li>
43+
44+
<li @click.prevent="deselectAll">
45+
<span class="action-menu-item">Deselect All</span>
46+
</li>
47+
48+
<li @click.prevent="selectAllOnPage">
49+
<span class="action-menu-item">Select All on This Page</span>
50+
</li>
51+
52+
<li @click.prevent="deselectAllOnPage">
53+
<span class="action-menu-item">Deselect All on This Page</span>
54+
</li>
55+
</ul>
56+
</div>
57+
</th>
58+
<?php
59+
$i = 1;
60+
foreach ($viewModel->getColumns() as $column): ?>
61+
<?php if ($column->getVisible() === false || $column->getCode() === 'ids') {
62+
continue;
63+
} ?>
64+
<?php
65+
$additionalCss = '';
66+
if ($column->getCode() === $state->getSortBy()) {
67+
$additionalCss .= $state->getSortDirection(
68+
) === AbstractDb::SORT_ORDER_ASC ? '_ascend' : '_descend';
69+
}
70+
?>
71+
<th
72+
class="data-grid-th _sortable <?= $escaper->escapeHtml($additionalCss) ?>"
73+
data-column="<?= $escaper->escapeHtml($column->getCode()) ?>"
74+
@click.prevent="sortColumn"
75+
x-sort:item="'<?= $escaper->escapeHtml($viewModel->getJsComponentId()) ?>.<?= $escaper->escapeHtml(
76+
$column->getCode()
77+
) ?>'">
78+
<span class="data-grid-cell-content"><?= $escaper->escapeHtml(__($column->getLabel())) ?></span>
79+
</th>
80+
<?php
81+
$i++;
82+
endforeach; ?>
83+
<?php if ($viewModel->allowActions()): ?>
84+
<th class="data-grid-th">
85+
<span class="pointer data-grid-cell-content"><?= $escaper->escapeHtml(__('Actions')) ?></span>
86+
</th>
87+
<?php endif; ?>
88+
</tr>
89+
</thead>
90+
<tbody>
91+
<?php $i = 0; ?>
92+
<?php foreach ($viewModel->getItems() as $item): ?>
93+
<?php $cellActions = $viewModel->getCellActions($item); ?>
94+
<?php $trClass = ($i % 2 === 1) ? '_odd-row' : '_even-row'; ?>
95+
<tr class="data-row <?= $escaper->escapeHtml($trClass) ?>">
96+
<td class="data-grid-checkbox-cell">
97+
<label class="data-grid-checkbox-cell-inner">
98+
<input
99+
class="admin__control-checkbox"
100+
type="checkbox"
101+
:checked="isSelected"
102+
@change="toggleSelectedId"
103+
data-row-id="<?= $escaper->escapeHtml($item->getId()) ?>">
104+
<label></label>
105+
</label>
106+
</td>
107+
<?php foreach ($viewModel->getColumns() as $column): ?>
108+
<?php if ($column->getVisible() === false || $column->getCode() === 'ids') {
109+
continue;
110+
} ?>
111+
<td class="data-grid-cell">
112+
<div class="data-grid-cell-content">
113+
<?php $cellTemplate = $viewModel->getCellTemplate($item, $column) ?>
114+
<?php $value = $viewModel->getValueFromItem($item, $column->getCode()); ?>
115+
<?= /* @noEscape */ $templateRenderer->html(
116+
$block,
117+
$cellTemplate,
118+
[
119+
'item' => $item,
120+
'value' => $value,
121+
'empty_value' => $column->getEmptyValue(),
122+
'column_name' => $column->getCode(),
123+
]
124+
) ?>
125+
</div>
126+
</td>
127+
<?php endforeach; ?>
128+
129+
<?php if ($viewModel->allowActions()): ?>
130+
<td class="data-grid-cell">
131+
<div class="data-grid-cell-content">
132+
<ul>
133+
<?php foreach ($cellActions as $cellAction): ?>
134+
<li>
135+
<?php if ($cellAction->hasUrl()): ?>
136+
<a href="<?= /* @noEscape */ $cellAction->getUrl() ?>">
137+
<?= $escaper->escapeHtml($cellAction->getLabel()) ?>
138+
</a>
139+
<?php endif; ?>
140+
141+
<?php if ($cellAction->hasJsMethod()): ?>
142+
<a
143+
data-id="<?= $item->getId() ?>"
144+
onClick="<?= /* @noEscape */ $cellAction->getJsMethod() ?>"><
145+
<?= $escaper->escapeHtml( $cellAction->getLabel()) ?>
146+
</a>
147+
<?php endif; ?>
148+
149+
<?php if ($cellAction->hasAlpineMethod()): ?>
150+
<a
151+
data-id="<?= $item->getId() ?>"
152+
@click="<?= /* @noEscape */ $cellAction->getAlpineMethod() ?>">
153+
<?= $escaper->escapeHtml($cellAction->getLabel()) ?>
154+
</a>
155+
<?php endif; ?>
156+
</li>
157+
<?php endforeach; ?>
158+
</ul>
159+
</div>
160+
</td>
161+
<?php endif; ?>
162+
</tr>
163+
<?php $i++; ?>
164+
<?php endforeach; ?>
165+
</tbody>
166+
</table>
167+
</div>
168+
169+
<style>
170+
.action-menu {
171+
display: block;
172+
}
173+
174+
.loki-grid .data-grid .data-grid-th._sortable {
175+
z-index: auto;
176+
}
177+
</style>

0 commit comments

Comments
 (0)