File manager - Edit - /var/www/html/portal/storage/app/public/comprovantes/mobiangra.zip
Back
PK ! �$60�t �t horarios/linha_form.blade.phpnu �[��� @extends('layouts.admin.theme') @section('title', env('APP_NAME') . ' :: ' . ($linha ? __('Editar Linha') : __('Nova Linha')) . ' - MobiAngra') @section('content') <div class="card shadow-sm"> @php $isEdicao = $linha !== null; $headLine = "<i class='fa-solid fa-bus'></i> " . ($isEdicao ? __('Linha :cod - :nome', ['cod' => $linha->codigo, 'nome' => $linha->nome]) : __('Nova Linha de Horários')); @endphp @include('components.buttons._headLineButtonsBackAdd', [ 'headLine' => $headLine, 'routeBack' => 'admin.mobiangra.index', 'routeBackParams' => ['tab' => 'horarios'], 'nameBack' => __('Voltar'), 'permission' => 'GERENCIADOR_DE_MOBIANGRA', ]) <div class="card-body"> @include('errors.messageFlash') {{-- ===== DADOS BÁSICOS DA LINHA ===== --}} <form action="{{ $isEdicao ? route('admin.mobiangra.horarios.linhas.update', $linha) : route('admin.mobiangra.horarios.linhas.store') }}" method="post"> @csrf @if ($isEdicao) @method('PUT') @endif <div class="border rounded p-3 mb-4"> <h5 class="mb-3"><i class="fa-solid fa-info-circle me-1"></i>{{ __('Dados da Linha') }}</h5> <div class="row g-3"> <div class="col-md-2"> <label class="form-label fw-semibold">{{ __('Código') }} <span class="text-danger">*</span></label> <input type="text" name="codigo" class="form-control @error('codigo') is-invalid @enderror" value="{{ old('codigo', $linha->codigo ?? '') }}" placeholder="ex: 101, C01, T10" maxlength="20" required> @error('codigo')<div class="invalid-feedback">{{ $message }}</div>@enderror </div> <div class="col-md-4"> <label class="form-label fw-semibold">{{ __('Nome Curto') }} <span class="text-danger">*</span></label> <input type="text" name="nome" class="form-control @error('nome') is-invalid @enderror" value="{{ old('nome', $linha->nome ?? '') }}" placeholder="ex: CANTAGALO x DIVISA MANGARATIBA" maxlength="255" required> @error('nome')<div class="invalid-feedback">{{ $message }}</div>@enderror </div> <div class="col-md-6"> <label class="form-label fw-semibold">{{ __('Nome Completo (exibido ao público)') }} <span class="text-danger">*</span></label> <input type="text" name="nome_completo" class="form-control @error('nome_completo') is-invalid @enderror" value="{{ old('nome_completo', $linha->nome_completo ?? '') }}" placeholder="ex: 101 - CANTAGALO x DIVISA MANGARATIBA" maxlength="255" required> @error('nome_completo')<div class="invalid-feedback">{{ $message }}</div>@enderror </div> <div class="col-md-2"> <label class="form-label fw-semibold">{{ __('Tarifa (R$)') }}</label> <input type="number" step="0.01" min="0" name="tarifa" class="form-control @error('tarifa') is-invalid @enderror" value="{{ old('tarifa', $linha->tarifa ?? '') }}" placeholder="7,00"> @error('tarifa')<div class="invalid-feedback">{{ $message }}</div>@enderror </div> <div class="col-md-2"> <label class="form-label fw-semibold">{{ __('Tarifa Cidadão (R$)') }}</label> <input type="number" step="0.01" min="0" name="tarifa_cidadao" class="form-control @error('tarifa_cidadao') is-invalid @enderror" value="{{ old('tarifa_cidadao', $linha->tarifa_cidadao ?? '') }}" placeholder="2,00"> @error('tarifa_cidadao')<div class="invalid-feedback">{{ $message }}</div>@enderror </div> <div class="col-md-2"> <label class="form-label fw-semibold">{{ __('Ordem') }}</label> <input type="number" min="0" name="ordem" class="form-control" value="{{ old('ordem', $linha->ordem ?? 0) }}"> </div> <div class="col-md-2 d-flex align-items-end"> <div class="form-check mb-2"> <input class="form-check-input" type="checkbox" name="publicada" id="publicada" value="1" {{ old('publicada', $linha->publicada ?? true) ? 'checked' : '' }}> <label class="form-check-label" for="publicada">{{ __('Publicada') }}</label> </div> </div> </div> @if ($isEdicao) {{-- -- Legendas de cores --------------------------------- --}} <hr> <h6 class="mt-2 mb-1"> <i class="fa-solid fa-circle-half-stroke me-1 text-muted"></i>{{ __('Legendas de cores') }} </h6> <p class="text-muted small mb-2"> {{ __('Explique o significado dos horários marcados em cores diferentes na planilha.') }} </p> <div id="legendas-container"> @foreach ($linha->legendas as $i => $leg) <div class="d-flex align-items-center gap-2 mb-2 legenda-row"> <select name="legendas[{{ $i }}][cor]" class="form-select form-select-sm" style="width:130px" required> @foreach (['azul' => __('🔵 Azul'), 'vermelho' => __('🔴 Vermelho'), 'verde' => __('🟢 Verde'), 'laranja' => __('🟠 Laranja'), 'amarelo' => __('🟡 Amarelo'), 'preto' => __('⚫ Preto')] as $val => $label) <option value="{{ $val }}" {{ $leg->cor === $val ? 'selected' : '' }}>{{ $label }}</option> @endforeach </select> <input type="text" name="legendas[{{ $i }}][descricao]" class="form-control form-control-sm" value="{{ $leg->descricao }}" placeholder="{{ __('Ex: Saindo do Cantagalo') }}" required> <button type="button" class="btn btn-sm btn-outline-danger flex-shrink-0 remover-legenda" title="{{ __('Remover') }}"> <i class="fa-solid fa-trash"></i> </button> </div> @endforeach </div> <button type="button" class="btn btn-sm btn-outline-secondary mt-1" id="btn-add-legenda"> <i class="fa-solid fa-plus me-1"></i>{{ __('Adicionar legenda') }} </button> {{-- -- Integrações ---------------------------------------- --}} <hr> <h6 class="mt-2 mb-1"> <i class="fa-solid fa-right-left me-1 text-muted"></i>{{ __('Integrações') }} </h6> <p class="text-muted small mb-2"> {{ __('Indique quais linhas o passageiro pode usar em sequência pagando apenas uma passagem, e por quanto tempo.') }} </p> <div id="integracoes-container"> @foreach ($linha->integracoes as $i => $integ) @php $envolvidas = $integ->linhas_envolvidas ?? []; @endphp <div class="integracao-row border rounded p-3 mb-3 bg-light"> <div class="d-flex justify-content-between align-items-start mb-2"> <strong class="small text-muted">{{ __('Integração') }} {{ $i + 1 }}</strong> <button type="button" class="btn btn-sm btn-outline-danger remover-integracao" title="{{ __('Remover integração') }}"> <i class="fa-solid fa-trash"></i> </button> </div> {{-- Tempo de integração --}} <div class="mb-3"> <label class="form-label form-label-sm fw-semibold"> <i class="fa-regular fa-clock me-1"></i>{{ __('Tempo de integração') }} </label> <div class="input-group input-group-sm" style="max-width:180px"> <input type="number" min="0" max="9999" name="integracoes[{{ $i }}][tempo_minutos]" class="form-control" value="{{ $integ->tempo_minutos }}"> <span class="input-group-text">{{ __('minutos') }}</span> </div> </div> {{-- Linhas envolvidas --}} <label class="form-label form-label-sm fw-semibold mb-2"> <i class="fa-solid fa-bus me-1"></i>{{ __('Linhas envolvidas na integração') }} </label> <div class="linhas-envolvidas-container d-flex flex-column gap-2 mb-2"> @foreach ($envolvidas as $j => $lenv) <div class="linha-envolvida-row d-flex align-items-center gap-2"> @if ($j > 0) <span class="text-muted fw-bold" style="width:20px;text-align:center">↔</span> @else <span style="width:20px"></span> @endif <input type="text" name="integracoes[{{ $i }}][linhas][{{ $j }}][codigo]" class="form-control form-control-sm" style="max-width:80px" value="{{ $lenv['codigo'] ?? '' }}" placeholder="{{ __('Cód.') }}" required> <input type="text" name="integracoes[{{ $i }}][linhas][{{ $j }}][nome]" class="form-control form-control-sm" value="{{ $lenv['nome'] ?? '' }}" placeholder="{{ __('Nome do destino, ex: Divisa Mangaratiba') }}" required> @if ($j >= 2) <button type="button" class="btn btn-sm btn-outline-danger flex-shrink-0 remover-linha-envolvida" title="{{ __('Remover') }}"> <i class="fa-solid fa-minus"></i> </button> @else <span style="width:30px"></span> @endif </div> @endforeach </div> <button type="button" class="btn btn-sm btn-outline-secondary btn-add-linha-envolvida"> <i class="fa-solid fa-plus me-1"></i>{{ __('Adicionar outra linha') }} </button> </div> @endforeach </div> <button type="button" class="btn btn-sm btn-outline-secondary mt-1" id="btn-add-integracao"> <i class="fa-solid fa-plus me-1"></i>{{ __('Adicionar integração') }} </button> <div id="mobiangra-horarios-linha-form-config" class="d-none" data-legenda-idx="{{ count($linha->legendas) }}" data-integracao-idx="{{ count($linha->integracoes) }}" data-legendas='@json($linha->legendas->map(fn ($l) => ["cor" => $l->cor, "descricao" => $l->descricao])->values())' data-cor-azul="{{ __('🔵 Azul') }}" data-cor-vermelho="{{ __('🔴 Vermelho') }}" data-cor-verde="{{ __('🟢 Verde') }}" data-cor-laranja="{{ __('🟠 Laranja') }}" data-cor-amarelo="{{ __('🟡 Amarelo') }}" data-cor-preto="{{ __('⚫ Preto') }}" data-ph-descricao="{{ __('Ex: Saindo do Cantagalo') }}" data-ph-codigo="{{ __('Cód.') }}" data-ph-nome="{{ __('Nome do destino, ex: Divisa Mangaratiba') }}" data-label-integracao="{{ __('Integração') }}" data-label-tempo="{{ __('Tempo de integração') }}" data-label-minutos="{{ __('minutos') }}" data-label-linhas="{{ __('Linhas envolvidas na integração') }}" data-label-add-linha="{{ __('Adicionar outra linha') }}" data-label-remover="{{ __('Remover') }}" data-label-remover-integracao="{{ __('Remover integração') }}" data-label-pintor="{{ __('Clique em cada horário para alternar a cor das legendas cadastradas.') }}" data-label-cores="{{ __('Cores dos horários') }}" data-label-sem-legenda="{{ __('Salve ao menos uma legenda de cor acima para pintar horários.') }}" data-label-padrao="{{ __('Padrão (sem cor)') }}" data-label-horarios="{{ __('horários') }}"> </div> @endif </div> <div class="d-flex gap-2 mb-4 flex-wrap"> @if ($isEdicao && (auth()->user()->getPermissaoDetalhes('GERENCIADOR_DE_MOBIANGRA')['visualizar'] ?? false)) <a href="{{ route('mobiangra.horarios', ['linha' => $linha->codigo]) }}" target="_blank" rel="noopener noreferrer" class="btn btn-outline-primary" @if (! $linha->publicada) title="{{ __('Esta linha está oculta no site. Publique-a para que o público possa vê-la.') }}" @else title="{{ __('Abrir a grade de horários desta linha no site público') }}" @endif> <i class="fa-solid fa-eye me-1" aria-hidden="true"></i>{{ __('Visualizar no site') }} </a> @endif @if (auth()->user()->getPermissaoDetalhes('GERENCIADOR_DE_MOBIANGRA')['editar'] ?? false) <button type="submit" class="btn btn-primary"> <i class="fa-solid fa-floppy-disk me-1"></i>{{ __('Salvar dados da linha') }} </button> <a href="{{ route('admin.mobiangra.index', ['tab' => 'horarios']) }}" class="btn btn-outline-secondary"> {{ __('Cancelar') }} </a> @endif </div> </form> {{-- ===== SEÇÕES E GRADES (somente em edição) ===== --}} @if ($isEdicao) <hr> <div class="d-flex align-items-center justify-content-between mb-3"> <h5 class="mb-0"><i class="fa-solid fa-table me-1"></i>{{ __('Seções e Horários') }}</h5> @if (auth()->user()->getPermissaoDetalhes('GERENCIADOR_DE_MOBIANGRA')['adicionar'] ?? false) <form action="{{ route('admin.mobiangra.horarios.secoes.store', $linha) }}" method="post" class="d-flex gap-2"> @csrf <input type="text" name="titulo" class="form-control form-control-sm" style="width:260px" placeholder="{{ __('Título da nova seção, ex: SAÍDA DO CENTRO') }}" required> <button type="submit" class="btn btn-sm btn-success"> <i class="fa-solid fa-plus me-1"></i>{{ __('Adicionar seção') }} </button> </form> @endif </div> @forelse ($linha->secoes as $secao) <div class="border rounded mb-3" id="secao-{{ $secao->id }}"> {{-- Cabeçalho da seção --}} <div class="d-flex align-items-center justify-content-between p-3 bg-light rounded-top border-bottom"> <form action="{{ route('admin.mobiangra.horarios.secoes.update', $secao) }}" method="post" class="d-flex align-items-center gap-2 flex-grow-1 me-3"> @csrf @method('PUT') <input type="text" name="titulo" class="form-control form-control-sm fw-semibold" value="{{ $secao->titulo }}" required> @if (auth()->user()->getPermissaoDetalhes('GERENCIADOR_DE_MOBIANGRA')['editar'] ?? false) <button type="submit" class="btn btn-sm btn-outline-primary text-nowrap"> <i class="fa-solid fa-pen"></i> {{ __('Renomear') }} </button> @endif </form> @if (auth()->user()->getPermissaoDetalhes('GERENCIADOR_DE_MOBIANGRA')['excluir'] ?? false) <form action="{{ route('admin.mobiangra.horarios.secoes.destroy', $secao) }}" method="post" onsubmit="return confirm('{{ __('Excluir esta seção e todos seus horários?') }}')"> @csrf @method('DELETE') <button type="submit" class="btn btn-sm btn-outline-danger"> <i class="fa-solid fa-trash"></i> </button> </form> @endif </div> <div class="p-3"> {{-- Grades existentes --}} @if ($secao->grades->isNotEmpty()) <div class="row g-3 mb-3"> @foreach ($secao->grades as $grade) <div class="col-md-4"> <div class="card h-100 border-0 shadow-sm"> <div class="card-header d-flex justify-content-between align-items-center py-2" style="background:#0085CD;color:#fff"> <strong class="small">{{ $grade->label }}</strong> @if (auth()->user()->getPermissaoDetalhes('GERENCIADOR_DE_MOBIANGRA')['excluir'] ?? false) <form action="{{ route('admin.mobiangra.horarios.grades.destroy', $grade) }}" method="post" onsubmit="return confirm('{{ __('Remover esta grade de horários?') }}')"> @csrf @method('DELETE') <button type="submit" class="btn btn-sm btn-light border-0 p-1 lh-1"> <i class="fa-solid fa-trash fa-xs text-danger"></i> </button> </form> @endif </div> @if (auth()->user()->getPermissaoDetalhes('GERENCIADOR_DE_MOBIANGRA')['editar'] ?? false) <div class="card-body p-2"> <form action="{{ route('admin.mobiangra.horarios.grades.store', $secao) }}" method="post" class="horarios-grade-form"> @csrf <input type="hidden" name="periodo" value="{{ $grade->periodo }}"> <input type="hidden" name="label" value="{{ $grade->label }}"> @if ($linha->legendas->isNotEmpty()) <p class="text-muted small mb-2"> {{ __('Clique em um horário para alternar a cor. Abra "Edição em lote" para colar ou alterar a lista inteira.') }} </p> <div class="horarios-pintor-legenda mb-2"> @foreach ($linha->legendas as $leg) <span class="horarios-pintor-legenda__item horarios-pintor-legenda__item--{{ $leg->cor }}"> {{ __(':cor: :desc', ['cor' => ucfirst($leg->cor), 'desc' => $leg->descricao]) }} </span> @endforeach </div> <div class="horarios-pintor-chips d-flex flex-wrap gap-1 mb-2"> @foreach ($grade->horariosItens() as $item) <button type="button" class="btn btn-sm horarios-pintor-chip horarios-pintor-chip--{{ $item['c'] ?: 'nenhuma' }}" data-hora="{{ $item['h'] }}" data-cor="{{ $item['c'] ?? '' }}" title="{{ __('Clique para alternar a cor') }}"> {{ $item['h'] }} </button> @endforeach </div> <input type="hidden" name="horarios_cores" class="horarios-cores-input" value=""> <textarea name="horarios" class="form-control form-control-sm font-monospace horarios-grade-textarea d-none">{{ $grade->horariosComoTexto() }}</textarea> <details class="mb-2"> <summary class="small fw-semibold text-primary"> {{ __('Edição em lote (colar lista)') }} </summary> <textarea class="form-control form-control-sm font-monospace horarios-grade-bulk mt-2" rows="3" placeholder="06:50, 07:00, 07:30..." title="{{ __('Horários separados por vírgula ou nova linha') }}">{{ $grade->horariosComoTexto() }}</textarea> </details> @else <textarea name="horarios" class="form-control form-control-sm font-monospace mb-2 horarios-grade-textarea" rows="4" placeholder="06:50, 07:00, 07:30..." title="{{ __('Horários separados por vírgula ou nova linha') }}">{{ $grade->horariosComoTexto() }}</textarea> <p class="text-muted small mb-2"> {{ __('Salve ao menos uma legenda de cor acima para pintar horários.') }} </p> @endif <div class="d-flex justify-content-between align-items-center gap-2 mt-1"> <small class="text-muted horarios-grade-count"> {{ count($grade->horariosItens()) }} {{ __('horários') }} </small> <button type="submit" class="btn btn-sm btn-primary"> <i class="fa-solid fa-floppy-disk me-1"></i>{{ __('Salvar') }} </button> </div> </form> </div> @else <div class="card-body p-2"> <div class="d-flex flex-wrap gap-1"> @foreach ($grade->horariosItens() as $item) <span @class([ 'badge border', 'text-bg-light' => empty($item['c']), 'horarios-pintor-chip--' . $item['c'] => ! empty($item['c']), ])>{{ $item['h'] }}</span> @endforeach </div> <small class="text-muted mt-1 d-block">{{ count($grade->horariosItens()) }} {{ __('horários') }}</small> </div> @endif </div> </div> @endforeach </div> @endif {{-- Adicionar novo período --}} @if (auth()->user()->getPermissaoDetalhes('GERENCIADOR_DE_MOBIANGRA')['adicionar'] ?? false) @php $periodosExistentes = $secao->grades->pluck('periodo')->all(); $periodosDisponiveis = array_diff_key($periodos, array_flip($periodosExistentes)); @endphp @if (!empty($periodosDisponiveis)) <form action="{{ route('admin.mobiangra.horarios.grades.store', $secao) }}" method="post" class="border rounded p-3 bg-light"> @csrf <h6 class="mb-2 text-muted">{{ __('Adicionar período') }}</h6> <div class="row g-2"> <div class="col-md-3"> <select name="periodo" class="form-select form-select-sm" required> @foreach ($periodosDisponiveis as $key => $label) <option value="{{ $key }}">{{ $label }}</option> @endforeach </select> </div> <div class="col-md-2"> <input type="text" name="label" class="form-control form-control-sm" placeholder="{{ __('Label (opcional)') }}"> </div> <div class="col"> <input type="text" name="horarios" class="form-control form-control-sm" placeholder="06:50, 07:00, 07:30, 08:00, ..." required> </div> <div class="col-auto"> <button type="submit" class="btn btn-sm btn-success"> <i class="fa-solid fa-plus"></i> </button> </div> </div> </form> @endif @endif </div> </div> @empty <div class="alert alert-info"> {{ __('Nenhuma seção cadastrada. Adicione ao menos uma seção para incluir os horários.') }} </div> @endforelse @endif </div>{{-- card-body --}} </div>{{-- card --}} @endsection @push('scripts') <link rel="stylesheet" href="{{ asset('pmar/css/admin/mobiangra/horarios_linha_form.css') }}?v={{ time() }}"> @endpush @push('after-scripts') <script src="{{ asset('pmar/js/admin/mobiangra/horarios_linha_form.js') }}?v={{ time() }}"></script> @endpush PK ! ��j�� � horarios/_linhas_tbody.blade.phpnu �[��� @foreach ($linhasHorarios as $lh) <tr> <td><span class="badge bg-primary">{{ $lh->codigo }}</span></td> <td>{{ $lh->nome }}</td> <td class="text-center"> @if ($lh->tarifa) R$ {{ number_format($lh->tarifa, 2, ',', '.') }} @else <span class="text-muted">-</span> @endif </td> <td class="text-center"> <span class="badge bg-secondary">{{ $lh->secoes_count }}</span> </td> <td class="text-center"> @if (auth()->user()->getPermissaoDetalhes('GERENCIADOR_DE_MOBIANGRA')['editar'] ?? false) <div class="d-flex justify-content-center"> <form class="m-0" action="{{ route('admin.mobiangra.horarios.linhas.status', $lh) }}" method="post"> @csrf <input type="hidden" name="tab" value="horarios"> <button type="submit" class="btn btn-sm {{ $lh->publicada ? 'btn-success' : 'btn-secondary' }}" title="{{ $lh->publicada ? __('Publicada') : __('Oculta') }}"> <i class="fa-solid {{ $lh->publicada ? 'fa-eye' : 'fa-eye-slash' }}"></i> </button> </form> </div> @else <span class="badge {{ $lh->publicada ? 'bg-success' : 'bg-secondary' }}"> {{ $lh->publicada ? __('Publicada') : __('Oculta') }} </span> @endif </td> <td class="text-center"> <div class="d-flex justify-content-center align-items-center gap-2 flex-nowrap"> @if (auth()->user()->getPermissaoDetalhes('GERENCIADOR_DE_MOBIANGRA')['editar'] ?? false) <a href="{{ route('admin.mobiangra.horarios.linhas.edit', $lh) }}" class="btn btn-sm btn-outline-primary" title="{{ __('Editar') }}"> <i class="fa-solid fa-pen"></i> </a> @endif @if (auth()->user()->getPermissaoDetalhes('GERENCIADOR_DE_MOBIANGRA')['excluir'] ?? false) <form class="d-inline m-0" action="{{ route('admin.mobiangra.horarios.linhas.destroy', $lh) }}" method="post" onsubmit="return confirm('{{ __('Excluir a linha :cod e todos seus horários?', ['cod' => $lh->codigo]) }}')"> @csrf @method('DELETE') <input type="hidden" name="tab" value="horarios"> <button type="submit" class="btn btn-sm btn-outline-danger" title="{{ __('Excluir') }}"> <i class="fa-solid fa-trash"></i> </button> </form> @endif </div> </td> </tr> @endforeach PK ! 6y4�% �% manifestacoes/show.blade.phpnu �[��� @extends('layouts.admin.theme') @section('title', env('APP_NAME') . ' :: ' . __('Manifestação - MobiAngra')) @section('content') <div class="card shadow-sm"> @php $headLine = '<i class="fa-solid fa-comments"></i> ' . __('Manifestação do cidadão'); @endphp @include('components.buttons._headLineButtonsBackAdd', [ 'headLine' => $headLine, 'routeBack' => 'admin.mobiangra.index', 'routeBackParams' => $filterParams, 'nameBack' => __('Voltar'), 'permission' => 'GERENCIADOR_DE_MOBIANGRA', ]) <div class="card-body"> @include('errors.messageFlash') <div class="row g-4 mb-4"> <div class="{{ $manifestacao->imagem_path ? 'col-lg-8' : 'col-12' }}"> <dl class="row g-2 mb-0"> @if ($chamado) <dt class="col-sm-4 col-lg-3 text-sm-end fw-bold mb-0">{{ __('Nº registro') }}:</dt> <dd class="col-sm-8 col-lg-9 mb-0"> <span class="badge bg-light text-dark border font-monospace">{{ $chamado->numeroChamado }}</span> </dd> <dt class="col-sm-4 col-lg-3 text-sm-end fw-bold mb-0">{{ __('Status') }}:</dt> <dd class="col-sm-8 col-lg-9 mb-0">{{ $chamado->statusChamado }}</dd> @endif <dt class="col-sm-4 col-lg-3 text-sm-end fw-bold mb-0">{{ __('Registrado em') }}:</dt> <dd class="col-sm-8 col-lg-9 mb-0">{{ $manifestacao->created_at?->format('d/m/Y H:i') }}</dd> <dt class="col-sm-4 col-lg-3 text-sm-end fw-bold mb-0">{{ __('Solicitante') }}:</dt> <dd class="col-sm-8 col-lg-9 mb-0">{{ $manifestacao->identificacao }}</dd> <dt class="col-sm-4 col-lg-3 text-sm-end fw-bold mb-0">{{ __('E-mail') }}:</dt> <dd class="col-sm-8 col-lg-9 mb-0"> <a href="mailto:{{ $manifestacao->email }}">{{ $manifestacao->email }}</a> </dd> <dt class="col-sm-4 col-lg-3 text-sm-end fw-bold mb-0">{{ __('Linha') }}:</dt> <dd class="col-sm-8 col-lg-9 mb-0">{{ $manifestacao->linha ?: '-' }}</dd> <dt class="col-sm-4 col-lg-3 text-sm-end fw-bold mb-0">{{ __('Sentido') }}:</dt> <dd class="col-sm-8 col-lg-9 mb-0">{{ $sentidoLabel }}</dd> <dt class="col-sm-4 col-lg-3 text-sm-end fw-bold mb-0">{{ __('Horário') }}:</dt> <dd class="col-sm-8 col-lg-9 mb-0">{{ $manifestacao->horario ?: '-' }}</dd> <dt class="col-sm-4 col-lg-3 text-sm-end fw-bold mb-0">{{ __('Local') }}:</dt> <dd class="col-sm-8 col-lg-9 mb-0">{{ $manifestacao->local ?: '-' }}</dd> <dt class="col-sm-4 col-lg-3 text-sm-end fw-bold mb-0">{{ __('Número do veículo') }}:</dt> <dd class="col-sm-8 col-lg-9 mb-0">{{ $manifestacao->numero_veiculo ?: '-' }}</dd> <dt class="col-sm-4 col-lg-3 text-sm-end fw-bold mb-0 align-self-start">{{ __('Relato') }}:</dt> <dd class="col-sm-8 col-lg-9 mb-0"> <div class="border rounded p-3 bg-light text-break"> {!! nl2br(e($manifestacao->relato)) !!} </div> </dd> </dl> </div> @if ($manifestacao->imagem_path) <div class="col-lg-4"> <div class="card border h-100"> <div class="card-header py-2 bg-light"> <span class="small fw-bold"> <i class="fa-solid fa-image me-1" aria-hidden="true"></i>{{ __('Imagem anexada') }}: </span> </div> <div class="card-body d-flex flex-column align-items-center justify-content-center text-center"> <x-admin.image-lightbox :src="asset('storage/' . $manifestacao->imagem_path)" :alt="__('Imagem anexada à manifestação')" :title="__('Imagem anexada à manifestação')" modal-id="mobiangra-manifestacao-imagem" /> <p class="form-text mb-0 mt-2">{{ __('Clique para ver em tela cheia') }}</p> </div> </div> </div> @endif </div> @if ($chamado) <hr class="my-4"> <h5 class="mb-3"> <i class="fa-solid fa-headset me-1"></i>{{ __('Andamento do chamado') }} </h5> @foreach ($mensagens as $mensagem) <div class="mb-3"> <ul class="list-group"> <li class="list-group-item {{ $mensagem->solicitacao ? 'bg-dark text-white' : 'bg-light' }}"> <strong> {{ $mensagem->solicitacao ? __('Solicitação inicial') : __('Mensagem') }} </strong> - {{ $mensagem->created_at?->format('d/m/Y H:i') }} </li> <li class="list-group-item"> <strong>{{ __('Autor') }}:</strong> {{ $mensagem->user?->name ?? __('Sistema') }} </li> <li class="list-group-item"> <strong>{{ __('Conteúdo') }}:</strong> <div class="mt-2">{!! $mensagem->mensagem !!}</div> </li> @php $index = $mensagem->solicitacao ? 0 : 100; @endphp @foreach ($mensagem->arquivos as $arquivo) <li class="list-group-item"> @include('components.tables._openPhotoAndPdf', [ 'asset' => $arquivo->link, 'alt' => $arquivo->nome, 'title' => $arquivo->nome, 'text' => $arquivo->nome, 'index' => $index, ]) </li> @php $index++; @endphp @endforeach </ul> </div> @endforeach @if (($chamado->statusChamado ?? '') !== 'Finalizado' && (auth()->user()->getPermissaoDetalhes('GERENCIADOR_DE_MOBIANGRA')['editar'] ?? false)) <form action="{{ route('admin.mobiangra.manifestacoes.novaMensagem', $manifestacao) }}" method="post" enctype="multipart/form-data" class="mt-4"> @csrf @include('components.inputs._textarea', [ 'label' => __('Nova mensagem ao requerente'), 'name' => 'mensagem', 'id' => 'manifestacao_mensagem', 'rows' => 5, 'required' => true, 'height' => '200px', 'class' => 'textarea-body', 'style' => null, 'oninput' => null, 'value' => old('mensagem'), 'small' => null, ]) @include('components.inputs._inputType', [ 'for' => 'link', 'label' => __('Arquivos'), 'name' => 'link[]', 'id' => 'link', 'required' => false, 'type' => 'file', 'old' => null, 'oninput' => null, 'readonly' => true, 'multiple' => true, 'small' => __('* Apenas documentos de imagem: PDF, JPG, JPEG, PNG, GIF, BMP, WEBP.'), 'accept' => 'application/pdf,image/*', ]) @include('components.inputs._selectType', [ 'for' => 'statusChamado', 'label' => __('Status'), 'name' => 'statusChamado', 'required' => true, 'readonly' => false, 'options' => $statusChamado, 'selected' => old('statusChamado', $chamado->statusChamado), 'placeholder' => __('Selecione o status do chamado...'), 'small' => __('Informe o status atual do chamado.'), 'onchange' => null, ]) <div class="d-flex gap-2 flex-wrap"> <button type="submit" class="btn btn-primary"> <i class="fa-solid fa-paper-plane me-1"></i>{{ __('Enviar resposta') }} </button> </div> </form> @endif @else <div class="alert alert-warning mb-0"> <i class="fa-solid fa-triangle-exclamation me-1"></i> {{ __('Manifestação legada sem chamado vinculado. Não é possível registrar andamento por este canal.') }} </div> @endif </div> </div> @endsection PK ! �V�ZI I manifestacoes/_tab.blade.phpnu �[��� {{-- Aba Manifestações (incluída em admin.mobiangra.index) --}} @php $mensagensNaoLidasPorChamado = $mensagensNaoLidasPorChamado ?? []; @endphp <div class="tab-pane fade {{ $tabAtual === 'manifestacoes' ? 'show active' : '' }}" id="tab-manifestacoes" role="tabpanel" aria-labelledby="tab-manifestacoes-btn"> <div class="d-flex flex-wrap align-items-center justify-content-between gap-2 mb-3"> <h5 class="mb-0"> <i class="fa-solid fa-comments me-1"></i>{{ __('Manifestações') }} @if ($manifestacoes) <span class="badge bg-secondary ms-1">{{ $manifestacoes->total() }}</span> @endif </h5> <a href="{{ route('mobiangra.fale_conosco') }}" target="_blank" class="btn btn-sm btn-outline-primary"> <i class="fa-solid fa-eye me-1"></i>{{ __('Ver formulário no site') }} </a> </div> @if ($manifestacoes && $manifestacoes->isNotEmpty()) <div class="table-responsive"> <table class="table table-hover align-middle mb-0"> <thead class="table-light"> <tr> <th scope="col" style="width:150px">{{ __('Nº registro') }}</th> <th scope="col">{{ __('Data') }}</th> <th scope="col">{{ __('Solicitante') }}</th> <th scope="col">{{ __('Linha') }}</th> <th scope="col" style="width:150px">{{ __('Status') }}</th> <th scope="col" class="text-end">{{ __('Ações') }}</th> </tr> </thead> <tbody> @foreach ($manifestacoes as $item) <tr> <td class="text-nowrap chamado-registro-numero-cell"> @if ($item->chamado) <x-chamados.registro-numero-badge :numero="$item->chamado->numeroChamado" :nao-lidas="$mensagensNaoLidasPorChamado[(string) $item->chamado->id] ?? 0" /> @else <span class="text-muted">-</span> @endif </td> <td class="text-nowrap">{{ $item->created_at?->format('d/m/Y H:i') }}</td> <td>{{ $item->identificacao }}</td> <td>{{ $item->linha ?: '-' }}</td> <td> @if ($item->chamado) <span class="badge {{ $item->chamado->statusChamado === 'Finalizado' ? 'bg-secondary' : 'bg-primary' }}"> {{ $item->chamado->statusChamado }} </span> @else <span class="badge bg-warning text-dark">{{ __('Legado') }}</span> @endif </td> <td class="text-end"> @if (auth()->user()->getPermissaoDetalhes('GERENCIADOR_DE_MOBIANGRA')['visualizar'] ?? false) <a href="{{ route('admin.mobiangra.manifestacoes.show', $item) }}" class="btn btn-sm btn-outline-primary" title="{{ __('Visualizar') }}"> <i class="fa-solid fa-eye"></i> </a> @endif </td> </tr> @endforeach </tbody> </table> </div> <div class="mt-3"> {{ $manifestacoes->withQueryString()->links() }} </div> @else <div class="alert alert-info mb-0"> <i class="fa-solid fa-circle-info me-1"></i> {{ __('Nenhuma manifestação registrada até o momento.') }} </div> @endif </div> PK ! Xa�{<