# product-ui-components > Componentes de UI para produtos seguindo o padrão de components do Easy Budget. - Author: JoseApRJunior - Repository: JoseApRJunior/easy-budget-laravel - Version: 20260120093427 - Stars: 0 - Forks: 0 - Last Updated: 2026-02-06 - Source: https://github.com/JoseApRJunior/easy-budget-laravel - Web: https://mule.run/skillshub/@@JoseApRJunior/easy-budget-laravel~product-ui-components:20260120093427 --- --- name: product-ui-components description: Componentes de UI para produtos seguindo o padrão de components do Easy Budget. --- # Componentes de UI para Produtos Esta skill define os componentes Blade específicos para a gestão de produtos no Easy Budget, seguindo o padrão de components estabelecido no sistema. ## Estrutura de Components ``` resources/views/components/ ├── product/ │ ├── product-card.blade.php # Card resumido de produto │ ├── product-details.blade.php # Detalhes completos do produto │ ├── product-form.blade.php # Formulário de criação/edição │ ├── product-status.blade.php # Badge de status do produto │ ├── product-inventory.blade.php # Informações de estoque │ ├── product-actions.blade.php # Ações disponíveis para produto │ ├── product-filters.blade.php # Filtros específicos para produtos │ ├── product-pricing.blade.php # Informações de preço │ ├── product-image.blade.php # Exibição de imagem do produto │ └── product-summary.blade.php # Resumo do produto └── ... ``` ## 1. Product Card Component Componente para exibição resumida de produtos em listas e dashboards. ### Uso Básico ```blade ``` ### Parâmetros | Parâmetro | Tipo | Descrição | Padrão | |-----------|------|-----------|--------| | `product` | `Product` | Modelo do produto | Obrigatório | | `showCategory` | `bool` | Exibir categoria do produto | `true` | | `showStock` | `bool` | Exibir quantidade em estoque | `true` | | `variant` | `string` | Estilo do card (primary, secondary, etc.) | `primary` | ### Estrutura ```blade @props([ 'product', 'showCategory' => true, 'showStock' => true, 'variant' => 'primary' ])
@if($product->image) {{ $product->name }} @else @endif
{{ $product->name }}
@if($product->code) Código: {{ $product->code }} @endif
@if($showCategory && $product->category)
{{ $product->category->name }}
@endif
Preço de Venda
R$ {{ number_format($product->price, 2, ',', '.') }}
@if($showStock) @endif
Última Atualização
{{ $product->updated_at->format('d/m/Y H:i') }}
``` ## 2. Product Details Component Componente para exibição detalhada de informações do produto. ### Uso Básico ```blade ``` ### Parâmetros | Parâmetro | Tipo | Descrição | Padrão | |-----------|------|-----------|--------| | `product` | `Product` | Modelo do produto | Obrigatório | | `showInventory` | `bool` | Exibir informações de estoque | `true` | | `showPricing` | `bool` | Exibir informações de preço | `true` | | `collapsible` | `bool` | Permitir colapsar seções | `false` | ### Estrutura ```blade @props([ 'product', 'showInventory' => true, 'showPricing' => true, 'collapsible' => false ])
{{ $product->name }}
{{ $product->code ?? 'Não definido' }}
@if($product->description)
Descrição

{{ $product->description }}

@endif @if($product->category)
Categoria
{{ $product->category->name }} @if($product->category->parent) Subcategoria de {{ $product->category->parent->name }} @endif
Ver Categoria
@endif @if($showPricing) @endif @if($showInventory) @endif @if($product->image) @endif
``` ## 3. Product Status Component Componente para exibição do status do produto com cores e ícones apropriados. ### Uso Básico ```blade ``` ### Parâmetros | Parâmetro | Tipo | Descrição | Padrão | |-----------|------|-----------|--------| | `product` | `Product` | Modelo do produto | Obrigatório | | `showIcon` | `bool` | Exibir ícone ao lado do status | `true` | | `size` | `string` | Tamanho do badge (sm, md, lg) | `md` | ### Estrutura ```blade @props([ 'product', 'showIcon' => true, 'size' => 'md' ]) @php $status = $product->active ? 'active' : 'inactive'; $color = $product->active ? '#198754' : '#6c757d'; $icon = $product->active ? 'check-circle' : 'x-circle'; $description = $product->active ? 'Ativo' : 'Inativo'; $sizeClass = match($size) { 'sm' => 'badge-sm', 'lg' => 'badge-lg', default => 'badge-md' }; @endphp @if($showIcon) @endif {{ $description }} ``` ## 4. Product Inventory Component Componente para exibição de informações de estoque do produto. ### Uso Básico ```blade ``` ### Parâmetros | Parâmetro | Tipo | Descrição | Padrão | |-----------|------|-----------|--------| | `product` | `Product` | Modelo do produto | Obrigatório | | `showMovements` | `bool` | Exibir movimentações recentes | `true` | | `showAlerts` | `bool` | Exibir alertas de estoque | `true` | ### Estrutura ```blade @props([ 'product', 'showMovements' => true, 'showAlerts' => true ])
Controle de Estoque
{{ $product->inventory->quantity ?? 0 }}
{{ $product->inventory->min_quantity ?? 0 }}
{{ $product->inventory->max_quantity ?? 'Ilimitado' }}
@if($showAlerts) @php $currentStock = $product->inventory->quantity ?? 0; $minStock = $product->inventory->min_quantity ?? 0; $maxStock = $product->inventory->max_quantity; @endphp @if($currentStock <= $minStock) @elseif($maxStock && $currentStock >= $maxStock) @endif @endif @if($showMovements && $product->inventoryMovements->isNotEmpty())
Últimas Movimentações
@foreach($product->inventoryMovements->take(5) as $movement) @endforeach
Data Tipo Quantidade Motivo
{{ $movement->created_at->format('d/m/Y H:i') }} {{ $movement->type === 'in' ? 'Entrada' : 'Saída' }} {{ $movement->type === 'in' ? '+' : '-' }}{{ $movement->quantity }} {{ $movement->reason ?? 'Sem motivo' }}
@endif
``` ## 5. Product Pricing Component Componente para exibição de informações de preço do produto. ### Uso Básico ```blade ``` ### Parâmetros | Parâmetro | Tipo | Descrição | Padrão | |-----------|------|-----------|--------| | `product` | `Product` | Modelo do produto | Obrigatório | | `showCost` | `bool` | Exibir preço de custo (se disponível) | `true` | | `showProfit` | `bool` | Exibir margem de lucro | `true` | ### Estrutura ```blade @props([ 'product', 'showCost' => true, 'showProfit' => true ])
Informações de Preço
R$ {{ number_format($product->price, 2, ',', '.') }}
@if($showCost)
R$ {{ number_format($product->cost ?? 0, 2, ',', '.') }}
@endif
@if($showProfit && $product->cost)
@php $cost = $product->cost ?? 0; $price = $product->price; $profit = $price - $cost; $margin = $cost > 0 ? ($profit / $cost) * 100 : 0; @endphp
{{ number_format($margin, 2, ',', '.') }}%
R$ {{ number_format($profit, 2, ',', '.') }}
@endif
``` ## 6. Product Form Component Componente para formulário de criação e edição de produtos. ### Uso Básico ```blade ``` ### Parâmetros | Parâmetro | Tipo | Descrição | Padrão | |-----------|------|-----------|--------| | `product` | `Product|null` | Modelo do produto (para edição) | `null` | | `categories` | `Collection` | Categorias disponíveis | Obrigatório | | `units` | `Collection` | Unidades de medida disponíveis | Obrigatório | | `showInventory` | `bool` | Exibir campos de estoque | `true` | ### Estrutura ```blade @props([ 'product' => null, 'categories' => [], 'units' => [], 'showInventory' => true ])
@csrf @if(isset($product)) @method('PUT') @endif
Informações Básicas
@error('name')
{{ $message }}
@enderror
@error('code')
{{ $message }}
@enderror
@error('description')
{{ $message }}
@enderror
Categoria
@error('category_id')
{{ $message }}
@enderror
Preço
@error('price')
{{ $message }}
@enderror
@error('cost')
{{ $message }}
@enderror
@if($showInventory)
Controle de Estoque
@error('initial_quantity')
{{ $message }}
@enderror
@error('min_quantity')
{{ $message }}
@enderror
@error('max_quantity')
{{ $message }}
@enderror
@endif
Imagem do Produto
@error('image')
{{ $message }}
@enderror @if(isset($product) && $product->image)
{{ $product->name }}
@endif
Status
active ?? true)) ? 'checked' : '' }}>
Cancelar
@push('scripts') @endpush ``` ## 7. Product Actions Component Componente para exibição de ações disponíveis para um produto. ### Uso Básico ```blade ``` ### Parâmetros | Parâmetro | Tipo | Descrição | Padrão | |-----------|------|-----------|--------| | `product` | `Product` | Modelo do produto | Obrigatório | | `showInventory` | `bool` | Exibir botão de controle de estoque | `true` | | `showEdit` | `bool` | Exibir botão de edição | `true` | | `showDelete` | `bool` | Exibir botão de exclusão | `true` | ### Estrutura ```blade @props([ 'product', 'showInventory' => true, 'showEdit' => true, 'showDelete' => true ])
Visualizar @if($showEdit) Editar @endif @if($showInventory) @endif @if($showDelete) @endif
``` ## 8. Product Filters Component Componente para filtros específicos de listagem de produtos. ### Uso Básico ```blade ``` ### Parâmetros | Parâmetro | Tipo | Descrição | Padrão | |-----------|------|-----------|--------| | `filters` | `array` | Filtros atuais | `[]` | | `showCategory` | `bool` | Exibir filtro por categoria | `true` | | `showStatus` | `bool` | Exibir filtro por status | `true` | | `showPriceRange` | `bool` | Exibir filtro por faixa de preço | `true` | ### Estrutura ```blade @props([ 'filters' => [], 'showCategory' => true, 'showStatus' => true, 'showPriceRange' => true ])
@if($showCategory)
@endif @if($showStatus)
@endif @if($showPriceRange)
até
@endif
Limpar
``` ## 9. Product Image Component Componente para exibição de imagem do produto. ### Uso Básico ```blade ``` ### Parâmetros | Parâmetro | Tipo | Descrição | Padrão | |-----------|------|-----------|--------| | `product` | `Product` | Modelo do produto | Obrigatório | | `showThumbnail` | `bool` | Exibir miniatura | `true` | | `size` | `string` | Tamanho da imagem (small, medium, large) | `medium` | ### Estrutura ```blade @props([ 'product', 'showThumbnail' => true, 'size' => 'medium' ])
@if($product->image)
Imagem do Produto
@php $sizeClass = match($size) { 'small' => 'img-thumbnail', 'large' => 'img-fluid', default => 'img-thumbnail' }; @endphp {{ $product->name }}
Última atualização: {{ $product->updated_at->format('d/m/Y H:i') }}
@else
Imagem do Produto

Nenhuma imagem cadastrada

@endif
``` ## 10. Product Summary Component Componente para exibição de resumo do produto. ### Uso Básico ```blade ``` ### Parâmetros | Parâmetro | Tipo | Descrição | Padrão | |-----------|------|-----------|--------| | `product` | `Product` | Modelo do produto | Obrigatório | | `showStats` | `bool` | Exibir estatísticas | `true` | | `showCategory` | `bool` | Exibir informações da categoria | `true` | ### Estrutura ```blade @props([ 'product', 'showStats' => true, 'showCategory' => true ])
@if($showStats)
Estoque Atual
{{ $product->inventory->quantity ?? 0 }}
Preço de Venda
R$ {{ number_format($product->price, 2, ',', '.') }}
Movimentações
{{ $product->inventoryMovements->count() }}
@endif
@if($showCategory && $product->category)
Categoria
{{ $product->category->name }}

@if($product->category->parent) Subcategoria de {{ $product->category->parent->name }} @else Categoria principal @endif

{{ $product->category->products->count() }} produtos
@endif
``` ## 11. Integração com Padrões Existentes ### Uso em Views ```blade {{-- Dashboard --}} {{-- Listagem --}} {{-- Formulários --}} {{-- Ações --}} ``` ### Estilos CSS ```css /* Product Components Styles */ .product-form .form-control:focus { border-color: #0d6efd; box-shadow: 0 0 0 0.2rem rgba(13, 110, 253, 0.25); } .product-actions .btn { transition: all 0.2s ease; } .product-actions .btn:hover { transform: translateY(-1px); box-shadow: 0 2px 4px rgba(0,0,0,0.1); } .product-summary .card { border-left: 4px solid #0d6efd; } .product-inventory .alert { border-left: 4px solid; } .product-inventory .alert-warning { border-left-color: #ffc107; } .product-inventory .alert-info { border-left-color: #0dcaf0; } ``` ## 12. JavaScript Interatividade ### Formulário de Produto ```javascript // product-form.js document.addEventListener('DOMContentLoaded', function() { // Formatar campos de preço const priceInputs = document.querySelectorAll('input[name="price"], input[name="cost"]'); priceInputs.forEach(input => { if (input) { input.addEventListener('input', function() { let value = this.value.replace(/\D/g, ''); if (value.length > 2) { value = value.replace(/(\d{2})$/, '.$1'); } this.value = value; }); } }); // Validar estoque const minQuantityInput = document.querySelector('input[name="min_quantity"]'); const maxQuantityInput = document.querySelector('input[name="max_quantity"]'); if (minQuantityInput && maxQuantityInput) { minQuantityInput.addEventListener('change', function() { if (parseInt(this.value) > parseInt(maxQuantityInput.value)) { maxQuantityInput.value = this.value; } }); } }); ``` ## 13. Validação e Segurança ### Autorização ```php // ProductPolicy.php public function view(User $user, Product $product) { return $user->tenant_id === $product->tenant_id; } public function update(User $user, Product $product) { return $user->tenant_id === $product->tenant_id; } public function delete(User $user, Product $product) { return $user->tenant_id === $product->tenant_id && $product->budgetItems->isEmpty() && $product->serviceItems->isEmpty(); } ``` ### Validations ```blade {{-- Product Card com validação de permissões --}} @can('view', $product) @endcan {{-- Product Actions com validação de status --}} @can('update', $product) @endcan ``` Este padrão de components para produtos garante consistência visual, reutilização de código e manutenibilidade, seguindo os mesmos princípios estabelecidos nos outros components do sistema.