MOD EV3-421 Verzióváltott teszt - Beszállító nézet
This commit is contained in:
parent
e0037f77d1
commit
c088dcdcaa
@ -3,9 +3,65 @@
|
||||
namespace App\Filament\SupplierPortal\Resources\ProductStocks\Pages;
|
||||
|
||||
use App\Filament\SupplierPortal\Resources\ProductStocks\ProductStockResource;
|
||||
use App\Livewire\SupplierPortal\ProductGroupTree;
|
||||
use Filament\Resources\Pages\ListRecords;
|
||||
use Filament\Schemas\Components\EmbeddedTable;
|
||||
use Filament\Schemas\Components\Flex;
|
||||
use Filament\Schemas\Components\Group;
|
||||
use Filament\Schemas\Components\Livewire;
|
||||
use Filament\Schemas\Schema;
|
||||
use Filament\Support\Enums\Width;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Livewire\Attributes\On;
|
||||
|
||||
class ListProductStocks extends ListRecords
|
||||
{
|
||||
protected static string $resource = ProductStockResource::class;
|
||||
|
||||
public ?int $productGroupId = null;
|
||||
|
||||
#[On('product-group-selected')]
|
||||
public function onProductGroupSelected(?int $groupId): void
|
||||
{
|
||||
$this->productGroupId = $groupId;
|
||||
$this->resetTable();
|
||||
}
|
||||
|
||||
public function getMaxContentWidth(): Width | string | null
|
||||
{
|
||||
return Width::Screen;
|
||||
}
|
||||
|
||||
public function content(Schema $schema): Schema
|
||||
{
|
||||
return $schema
|
||||
->components([
|
||||
Flex::make([
|
||||
Livewire::make(ProductGroupTree::class)
|
||||
->id('product-group-tree')
|
||||
->grow(false)
|
||||
->extraAttributes(['style' => 'width: 300px; flex-shrink: 0; position: sticky; top: 1rem;']),
|
||||
|
||||
Group::make([
|
||||
EmbeddedTable::make(),
|
||||
])
|
||||
->grow()
|
||||
->extraAttributes(['style' => 'min-width: 0;']),
|
||||
])
|
||||
->verticallyAlignStart()
|
||||
->from('md')
|
||||
->extraAttributes(['style' => 'width: 100%; gap: 1rem;']),
|
||||
]);
|
||||
}
|
||||
|
||||
protected function applyFiltersToTableQuery(Builder $query): Builder
|
||||
{
|
||||
$query = parent::applyFiltersToTableQuery($query);
|
||||
|
||||
if ($this->productGroupId !== null) {
|
||||
$query->where('product_group_id', $this->productGroupId);
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
}
|
||||
|
||||
131
app/Livewire/SupplierPortal/ProductGroupTree.php
Normal file
131
app/Livewire/SupplierPortal/ProductGroupTree.php
Normal file
@ -0,0 +1,131 @@
|
||||
<?php
|
||||
|
||||
namespace App\Livewire\SupplierPortal;
|
||||
|
||||
use App\Models\Product;
|
||||
use App\Models\ProductGroup;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Livewire\Component;
|
||||
|
||||
class ProductGroupTree extends Component
|
||||
{
|
||||
public ?int $selectedGroupId = null;
|
||||
|
||||
public function mount(): void
|
||||
{
|
||||
$this->selectedGroupId = null;
|
||||
}
|
||||
|
||||
public function selectGroup(?int $groupId): void
|
||||
{
|
||||
$this->selectedGroupId = $groupId;
|
||||
$this->dispatch('product-group-selected', groupId: $groupId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Visszaadja a supplier termékeinek csoportjait fa struktúrában.
|
||||
*
|
||||
* @return array<int, array<string, mixed>>
|
||||
*/
|
||||
protected function buildTree(): array
|
||||
{
|
||||
$supplierId = auth()->user()->supplier_id;
|
||||
|
||||
// A supplier összes termékének product_group_id értékei
|
||||
$groupIds = Product::query()
|
||||
->where('supplier_id', $supplierId)
|
||||
->whereNotNull('product_group_id')
|
||||
->pluck('product_group_id')
|
||||
->unique()
|
||||
->values()
|
||||
->toArray();
|
||||
|
||||
if (empty($groupIds)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Termékszámok csoportonként
|
||||
$productCountsByGroup = Product::query()
|
||||
->where('supplier_id', $supplierId)
|
||||
->whereNotNull('product_group_id')
|
||||
->groupBy('product_group_id')
|
||||
->selectRaw('product_group_id, COUNT(*) as products_count')
|
||||
->pluck('products_count', 'product_group_id')
|
||||
->toArray();
|
||||
|
||||
// Minden érintett csoport + felmenői szükségesek a fa felépítéséhez
|
||||
$allRequiredIds = [];
|
||||
foreach ($groupIds as $groupId) {
|
||||
$ancestors = ProductGroup::ancestorsOf($groupId)->pluck('id')->toArray();
|
||||
$allRequiredIds = array_unique(array_merge($allRequiredIds, $ancestors, [$groupId]));
|
||||
}
|
||||
|
||||
// Csoportok lekérdezése mélységgel, gyökértől
|
||||
$groups = ProductGroup::withDepth()
|
||||
->whereIn('id', $allRequiredIds)
|
||||
->orderBy('_lft')
|
||||
->get();
|
||||
|
||||
// Termékszám hozzárendelése (beleértve a gyerek csoportok összesítését)
|
||||
foreach ($groups as $group) {
|
||||
$group->products_count = $productCountsByGroup[$group->id] ?? 0;
|
||||
}
|
||||
|
||||
// Fa struktúra felépítése
|
||||
return $this->buildTreeFromCollection($groups);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \Illuminate\Support\Collection $groups
|
||||
* @return array<int, array<string, mixed>>
|
||||
*/
|
||||
protected function buildTreeFromCollection($groups): array
|
||||
{
|
||||
$tree = [];
|
||||
$indexed = [];
|
||||
|
||||
foreach ($groups as $group) {
|
||||
// A depth=0 gyökércsomópontot (pl. "Termékek" placeholder) csak referenciaként
|
||||
// tartjuk nyilván, de nem jelenítjük meg közvetlenül a fában.
|
||||
if ($group->depth === 0) {
|
||||
$indexed[$group->id] = [
|
||||
'id' => $group->id,
|
||||
'name' => $group->name,
|
||||
'depth' => $group->depth,
|
||||
'products_count' => 0,
|
||||
'children' => [],
|
||||
];
|
||||
continue;
|
||||
}
|
||||
|
||||
$item = [
|
||||
'id' => $group->id,
|
||||
'name' => $group->name,
|
||||
'depth' => $group->depth,
|
||||
'products_count' => $group->products_count,
|
||||
'children' => [],
|
||||
];
|
||||
$indexed[$group->id] = &$item;
|
||||
|
||||
if (! isset($indexed[$group->parent_id]) || $indexed[$group->parent_id]['depth'] < 0) {
|
||||
$tree[] = &$item;
|
||||
} elseif ($indexed[$group->parent_id]['depth'] === 0) {
|
||||
// Közvetlen gyerek a root placeholder-nek → top-level elem a fában
|
||||
$tree[] = &$item;
|
||||
} else {
|
||||
$indexed[$group->parent_id]['children'][] = &$item;
|
||||
}
|
||||
|
||||
unset($item);
|
||||
}
|
||||
|
||||
return $tree;
|
||||
}
|
||||
|
||||
public function render(): View
|
||||
{
|
||||
return view('livewire.supplier-portal.product-group-tree', [
|
||||
'tree' => $this->buildTree(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
27168
public/css/app.css
27168
public/css/app.css
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
313
public/js/app.js
313
public/js/app.js
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
124064
public/js/customize.js
124064
public/js/customize.js
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,29 +1,11 @@
|
||||
{
|
||||
"/js/app.js": "/js/app.js?id=9656e746371b15d28c4e4f8f816f8fc1",
|
||||
"/js/app.js.map": "/js/app.js.map?id=5e840a79ad0112917eec1908319f0c8e",
|
||||
"/js/admin.js": "/js/admin.js?id=bd6593533b16470ea30529cfd0ed9d65",
|
||||
"/js/admin.js.map": "/js/admin.js.map?id=5860e294f841b5ee0ae0cf94e7739f14",
|
||||
"/js/module.js": "/js/module.js?id=bc41502fc9565c6111a41ead4cd8d77d",
|
||||
"/js/module.js.map": "/js/module.js.map?id=3cb4c393f14121a9625482aa6dcef490",
|
||||
"/js/components.js": "/js/components.js?id=aac1b5221c918d1afb98a34e79620cde",
|
||||
"/js/components.js.map": "/js/components.js.map?id=03868ef122820440c621f29c51b3c467",
|
||||
"/css/app.css": "/css/app.css?id=56d48ae2ee54edb4fc49a67b8f0115c5",
|
||||
"/js/app.js": "/js/app.js?id=788435874adbbf8e5ddc27cc9d18e00e",
|
||||
"/js/admin.js": "/js/admin.js?id=63aa33642e8f8f48a97c8a7bb91ce5d8",
|
||||
"/js/module.js": "/js/module.js?id=29a456e6546fb80088a21e164cdfca82",
|
||||
"/js/components.js": "/js/components.js?id=34668cee8ac371c98657beffcff579b8",
|
||||
"/css/app.css": "/css/app.css?id=05445eb8fb6f79c539507896e268aa91",
|
||||
"/fonts/vendor/bootstrap-icons/bootstrap-icons.woff2?92ea18a81d737146ff044ddb52010366": "/fonts/vendor/bootstrap-icons/bootstrap-icons.woff2?92ea18a81d737146ff044ddb52010366?id=9ad5aa740d7d5e6a0191b309b9b1986c",
|
||||
"/fonts/vendor/bootstrap-icons/bootstrap-icons.woff?1295669cd4e305c97f2cfc16d56614b8": "/fonts/vendor/bootstrap-icons/bootstrap-icons.woff?1295669cd4e305c97f2cfc16d56614b8?id=d1af9af6052c51b169be6c628ae99bb5",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_10_eceadf_60x60.png?fcf8539b586ee18bcdea1755486148fb": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_10_eceadf_60x60.png?fcf8539b586ee18bcdea1755486148fb?id=7296ac90a70836a72af140e0346fc932",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_15_ffffff_60x60.png?c514e7ba7589d0f49ac63c298fcdae5e": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_15_ffffff_60x60.png?c514e7ba7589d0f49ac63c298fcdae5e?id=3c8a4c2c86890f38eb35a7a4f17108ac",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_10_f8f7f6_60x60.png?2999b2509cfc0da9d2638ce9f892d541": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_10_f8f7f6_60x60.png?2999b2509cfc0da9d2638ce9f892d541?id=42fbd9c28ff43250024032714111e992",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_65_654b24_60x60.png?6a53536235d962916651e5ade810be9c": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_65_654b24_60x60.png?6a53536235d962916651e5ade810be9c?id=0351aa2b5ee6d5c4a7e2eea67afd9a94",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_15_eceadf_60x60.png?bb99362eb46ac5b5824fabbfe6271e29": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_15_eceadf_60x60.png?bb99362eb46ac5b5824fabbfe6271e29?id=396642d988742f9ee3b73d239a417f59",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_15_f7f3de_60x60.png?9d1facfcb89e21b78242e2eb8cbd491c": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_15_f7f3de_60x60.png?9d1facfcb89e21b78242e2eb8cbd491c?id=425506cc6819db6ad5b01352df235653",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_68_b83400_60x60.png?f786ff5070a9c8cde4f9b567fc84e004": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_68_b83400_60x60.png?f786ff5070a9c8cde4f9b567fc84e004?id=98eb208ad7450212818f3a70f09729d6",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_222222_256x240.png?bcf1cdc9c7d1486173cc9aaa8b1fc77b": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_222222_256x240.png?bcf1cdc9c7d1486173cc9aaa8b1fc77b?id=5eb1d32635db28ba94d9d35ab363c70e",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_b83400_256x240.png?f481d1b47a462e74eed1e20ae7ac7824": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_b83400_256x240.png?f481d1b47a462e74eed1e20ae7ac7824?id=9ac73e8431d4dda3af9e6eb6d29f88ea",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_ffffff_256x240.png?fc616163e14c52dba5af7fdb573d2e64": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_ffffff_256x240.png?fc616163e14c52dba5af7fdb573d2e64?id=c0ac47f58e9e9e4b679101073a3f010a",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_8c291d_256x240.png?faf8dac1c3a19fa71b3349936071548b": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_8c291d_256x240.png?faf8dac1c3a19fa71b3349936071548b?id=732d736a3d70c5279a5ce1b837da69d1",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_3572ac_256x240.png?6b15e6e5507d972be2e15634d0f7bc82": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_3572ac_256x240.png?6b15e6e5507d972be2e15634d0f7bc82?id=beeb872e16251574c55cf3627f9978e1",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_fbdb93_256x240.png?aca518e5efefaf76c067ffb0e2438334": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_fbdb93_256x240.png?aca518e5efefaf76c067ffb0e2438334?id=f5de1bb077a39c0d29d38e6dccaecf4b",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_diagonal-maze_20_6e4f1c_10x10.png?bde4cdb5c33f6a9c1c25419a4732ad98": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_diagonal-maze_20_6e4f1c_10x10.png?bde4cdb5c33f6a9c1c25419a4732ad98?id=bff005db4cfc39e962fdd98eb8a0ef33",
|
||||
"/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.eot?23f19bb08961f37aaf692ff943823453": "/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.eot?23f19bb08961f37aaf692ff943823453?id=0868992b7c56298026b76b22c534eab9",
|
||||
"/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.woff2?d878b0a6a1144760244ff0665888404c": "/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.woff2?d878b0a6a1144760244ff0665888404c?id=4ec8652aef2ce3e636bf32c24dd5ce86",
|
||||
"/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.woff?2285773e6b4b172f07d9b777c81b0775": "/fonts/vendor/@fortawesome/fontawesome-free/webfa-brands-400.woff?2285773e6b4b172f07d9b777c81b0775?id=66ea863732752673548b3b6537b6465b",
|
||||
@ -39,13 +21,26 @@
|
||||
"/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.woff?eeccf4f66002c6f2ba24d3d22f2434c2": "/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.woff?eeccf4f66002c6f2ba24d3d22f2434c2?id=26f963f67e793d91cc76426d43836849",
|
||||
"/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.ttf?be9ee23c0c6390141475d519c2c5fb8f": "/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.ttf?be9ee23c0c6390141475d519c2c5fb8f?id=d44877cb1fa07af67d56e4d86d39dd96",
|
||||
"/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.svg?7a8b4f130182d19a2d7c67d80c090397": "/fonts/vendor/@fortawesome/fontawesome-free/webfa-solid-900.svg?7a8b4f130182d19a2d7c67d80c090397?id=37bc7099f6f1ba80236164f22e905837",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_10_eceadf_60x60.png?fcf8539b586ee18bcdea1755486148fb": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_10_eceadf_60x60.png?fcf8539b586ee18bcdea1755486148fb?id=7296ac90a70836a72af140e0346fc932",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_15_ffffff_60x60.png?c514e7ba7589d0f49ac63c298fcdae5e": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_15_ffffff_60x60.png?c514e7ba7589d0f49ac63c298fcdae5e?id=3c8a4c2c86890f38eb35a7a4f17108ac",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_10_f8f7f6_60x60.png?2999b2509cfc0da9d2638ce9f892d541": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_10_f8f7f6_60x60.png?2999b2509cfc0da9d2638ce9f892d541?id=42fbd9c28ff43250024032714111e992",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_65_654b24_60x60.png?6a53536235d962916651e5ade810be9c": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_65_654b24_60x60.png?6a53536235d962916651e5ade810be9c?id=0351aa2b5ee6d5c4a7e2eea67afd9a94",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_15_eceadf_60x60.png?bb99362eb46ac5b5824fabbfe6271e29": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_15_eceadf_60x60.png?bb99362eb46ac5b5824fabbfe6271e29?id=396642d988742f9ee3b73d239a417f59",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_15_f7f3de_60x60.png?9d1facfcb89e21b78242e2eb8cbd491c": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_15_f7f3de_60x60.png?9d1facfcb89e21b78242e2eb8cbd491c?id=425506cc6819db6ad5b01352df235653",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_68_b83400_60x60.png?f786ff5070a9c8cde4f9b567fc84e004": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_fine-grain_68_b83400_60x60.png?f786ff5070a9c8cde4f9b567fc84e004?id=98eb208ad7450212818f3a70f09729d6",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_222222_256x240.png?bcf1cdc9c7d1486173cc9aaa8b1fc77b": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_222222_256x240.png?bcf1cdc9c7d1486173cc9aaa8b1fc77b?id=5eb1d32635db28ba94d9d35ab363c70e",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_b83400_256x240.png?f481d1b47a462e74eed1e20ae7ac7824": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_b83400_256x240.png?f481d1b47a462e74eed1e20ae7ac7824?id=9ac73e8431d4dda3af9e6eb6d29f88ea",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_ffffff_256x240.png?fc616163e14c52dba5af7fdb573d2e64": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_ffffff_256x240.png?fc616163e14c52dba5af7fdb573d2e64?id=c0ac47f58e9e9e4b679101073a3f010a",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_8c291d_256x240.png?faf8dac1c3a19fa71b3349936071548b": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_8c291d_256x240.png?faf8dac1c3a19fa71b3349936071548b?id=732d736a3d70c5279a5ce1b837da69d1",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_3572ac_256x240.png?6b15e6e5507d972be2e15634d0f7bc82": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_3572ac_256x240.png?6b15e6e5507d972be2e15634d0f7bc82?id=beeb872e16251574c55cf3627f9978e1",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_fbdb93_256x240.png?aca518e5efefaf76c067ffb0e2438334": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-icons_fbdb93_256x240.png?aca518e5efefaf76c067ffb0e2438334?id=f5de1bb077a39c0d29d38e6dccaecf4b",
|
||||
"/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_diagonal-maze_20_6e4f1c_10x10.png?bde4cdb5c33f6a9c1c25419a4732ad98": "/images/vendor/jquery-ui-themes/themes/pepper-grinder/ui-bg_diagonal-maze_20_6e4f1c_10x10.png?bde4cdb5c33f6a9c1c25419a4732ad98?id=bff005db4cfc39e962fdd98eb8a0ef33",
|
||||
"/images/vendor/jquery-ui/themes/base/ui-icons_444444_256x240.png?d1b818587c3bc65058fe43800e4a191c": "/images/vendor/jquery-ui/themes/base/ui-icons_444444_256x240.png?d1b818587c3bc65058fe43800e4a191c?id=bed10eb948aa66a924e32f2022f0b7c1",
|
||||
"/images/vendor/jquery-ui/themes/base/ui-icons_555555_256x240.png?35d57320d9df28ec0d0d8bd1b5c75983": "/images/vendor/jquery-ui/themes/base/ui-icons_555555_256x240.png?35d57320d9df28ec0d0d8bd1b5c75983?id=d927e3a7feaea813b9bd0fd242e90de2",
|
||||
"/images/vendor/jquery-ui/themes/base/ui-icons_ffffff_256x240.png?92bef7e45fed3caba8dc9348edef4df2": "/images/vendor/jquery-ui/themes/base/ui-icons_ffffff_256x240.png?92bef7e45fed3caba8dc9348edef4df2?id=1e1f6219e7b6c134d1955b8db1907af5",
|
||||
"/images/vendor/jquery-ui/themes/base/ui-icons_777620_256x240.png?f423048bf942a7a33b33b1b982ecdb51": "/images/vendor/jquery-ui/themes/base/ui-icons_777620_256x240.png?f423048bf942a7a33b33b1b982ecdb51?id=7c2eb0d985914d94938ebc386ad09e37",
|
||||
"/images/vendor/jquery-ui/themes/base/ui-icons_cc0000_256x240.png?5cbbd560bcf30acb95dd3b0b0d61645a": "/images/vendor/jquery-ui/themes/base/ui-icons_cc0000_256x240.png?5cbbd560bcf30acb95dd3b0b0d61645a?id=e5fe3b8d656a0dcf8c574ec8eb4cb6fe",
|
||||
"/images/vendor/jquery-ui/themes/base/ui-icons_777777_256x240.png?f5d5fce2f36b5776eab8b314efc2dfd8": "/images/vendor/jquery-ui/themes/base/ui-icons_777777_256x240.png?f5d5fce2f36b5776eab8b314efc2dfd8?id=0c3579368edda27d14bb4910e27002b6",
|
||||
"/css/app.css.map": "/css/app.css.map?id=f2c21c32fbebc737566a180cea6cd164",
|
||||
"/js/customize.js": "/js/customize.js?id=31b57208bc19a039066296cd7322567f",
|
||||
"/css/invoice.css": "/css/invoice.css?id=14b5784b76704d02969da9561631ed3f"
|
||||
}
|
||||
|
||||
@ -0,0 +1,70 @@
|
||||
@php
|
||||
$hasChildren = ! empty($node['children']);
|
||||
$isSelected = $selectedGroupId === $node['id'];
|
||||
// A behúzás a mélységtől függ (a depth=0 gyökér rejtett, így az 1. szint kap 0 behúzást).
|
||||
$indent = max(0, ($node['depth'] - 1)) * 16;
|
||||
@endphp
|
||||
|
||||
<div wire:key="group-node-{{ $node['id'] }}" x-data="{ open: true }">
|
||||
<div style="display:flex;align-items:center;gap:2px;padding-left:{{ $indent }}px;">
|
||||
{{-- Chevron expand/collapse toggle (Preline-stílus) --}}
|
||||
@if ($hasChildren)
|
||||
<button
|
||||
@click="open = !open"
|
||||
style="display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;background:none;border:none;cursor:pointer;padding:0;color:#6b7280;transition:transform 0.15s;"
|
||||
:style="open ? '' : 'transform:rotate(-90deg)'"
|
||||
aria-label="Kinyit/becsuk"
|
||||
>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="m6 9 6 6 6-6" />
|
||||
</svg>
|
||||
</button>
|
||||
@else
|
||||
<span style="width:18px;flex-shrink:0;"></span>
|
||||
@endif
|
||||
|
||||
{{-- Csoport sora: ikon + név + badge --}}
|
||||
<button
|
||||
wire:click="selectGroup({{ $node['id'] }})"
|
||||
style="display:flex;align-items:center;gap:8px;flex:1;padding:5px 8px;border-radius:6px;border:none;cursor:pointer;text-align:left;font-size:13px;min-width:0;
|
||||
{{ $isSelected
|
||||
? 'background:#f0e8e0;color:#b83400;font-weight:700;'
|
||||
: 'background:transparent;color:#374151;' }}"
|
||||
onmouseover="{{ ! $isSelected ? "this.style.background='#f3f4f6'" : '' }}"
|
||||
onmouseout="{{ ! $isSelected ? "this.style.background='transparent'" : '' }}"
|
||||
>
|
||||
{{-- Ikon: mappa (csoport gyerekekkel) vagy fájl (levél) --}}
|
||||
<span style="display:flex;align-items:center;flex-shrink:0;color:{{ $isSelected ? '#b83400' : '#9ca3af' }};">
|
||||
@if ($hasChildren)
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z" />
|
||||
</svg>
|
||||
@else
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" />
|
||||
<path d="M14 2v4a2 2 0 0 0 2 2h4" />
|
||||
</svg>
|
||||
@endif
|
||||
</span>
|
||||
|
||||
<span style="flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;">{{ $node['name'] }}</span>
|
||||
|
||||
@if ($node['products_count'] > 0)
|
||||
<span style="flex-shrink:0;font-size:11px;padding:1px 6px;border-radius:10px;
|
||||
{{ $isSelected ? 'background:#fcd9c8;color:#b83400;' : 'background:#e5e7eb;color:#6b7280;' }}">
|
||||
{{ $node['products_count'] }}
|
||||
</span>
|
||||
@endif
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@if ($hasChildren)
|
||||
<div x-show="open" style="margin-top:1px;">
|
||||
@foreach ($node['children'] as $childIndex => $child)
|
||||
@include('livewire.supplier-portal.product-group-tree-node', [
|
||||
'node' => $child,
|
||||
])
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
@ -0,0 +1,31 @@
|
||||
<div style="background:#f9fafb;border:1px solid #e5e7eb;border-radius:8px;padding:8px;overflow-y:auto;height:100%">
|
||||
{{-- Összes termék gomb --}}
|
||||
<button
|
||||
wire:click="selectGroup(null)"
|
||||
style="display:flex;align-items:center;gap:8px;width:100%;padding:6px 8px;border-radius:6px;font-size:13px;font-weight:500;border:none;cursor:pointer;text-align:left;
|
||||
{{ $selectedGroupId === null
|
||||
? 'background:#f0e8e0;color:#b83400;font-weight:700;'
|
||||
: 'background:transparent;color:#374151;' }}"
|
||||
onmouseover="{{ $selectedGroupId !== null ? "this.style.background='#f3f4f6'" : '' }}"
|
||||
onmouseout="{{ $selectedGroupId !== null ? "this.style.background='transparent'" : '' }}"
|
||||
>
|
||||
<span style="display:flex;align-items:center;flex-shrink:0;color:{{ $selectedGroupId === null ? '#b83400' : '#9ca3af' }};">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<rect width="7" height="7" x="3" y="3" rx="1" />
|
||||
<rect width="7" height="7" x="14" y="3" rx="1" />
|
||||
<rect width="7" height="7" x="14" y="14" rx="1" />
|
||||
<rect width="7" height="7" x="3" y="14" rx="1" />
|
||||
</svg>
|
||||
</span>
|
||||
<span>Összes termék</span>
|
||||
</button>
|
||||
|
||||
{{-- Termékfa (Preline tree-view stílus) --}}
|
||||
<div style="margin-top:4px;">
|
||||
@foreach ($tree as $node)
|
||||
@include('livewire.supplier-portal.product-group-tree-node', [
|
||||
'node' => $node,
|
||||
])
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
Loading…
Reference in New Issue
Block a user