Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ APP_URL=http://chamados
# Definir o parâmetro em MB, o padrão aqui é 16MB (se não estiver definido valor algum)
UPLOAD_MAX_FILESIZE=16

# Timeout padrão em horas para edição de comentários próprios nas filas que habilitarem essa opção.
# Cada fila pode sobrescrever esse valor nas suas configurações. Use 0 para permitir edição sem limite de tempo.
EDITAR_COMENTARIOS_TIMEOUT_HORAS=12

# Se a aplicação está atrás de um proxy que conecta com o usuário por https
# mas conecta com a aplicação por http, você deve habilitar essa flag
######## Deprecado em favor de LARAVEL_TOOLS_FORCAR_HTTPS (2/2023) ############
Expand Down Expand Up @@ -220,4 +224,3 @@ WS_FOTO_FAKE_PATH=
DUSK_DRIVER_URL='http://selenium:4444/wd/hub'
DUSK_START_MAXIMIZED=true
DUSK_HEADLESS_DISABLED=true

41 changes: 41 additions & 0 deletions app/Http/Controllers/ComentarioController.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use App\Models\Comentario;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

class ComentarioController extends Controller
{
Expand Down Expand Up @@ -59,4 +60,44 @@ public function store(Request $request, Chamado $chamado)
$request->session()->flash('alert-info', 'Comentário enviado com sucesso');
return redirect("chamados/$chamado->id");
}

public function update(Request $request, Comentario $comentario)
{
$this->authorize('chamados.view', $comentario->chamado);

if (!$comentario->podeSerEditadoPor(\Auth::user())) {
abort(403);
}

$request->validate([
'comentario' => ['required'],
]);

$comentarioOriginal = $comentario->comentario;
$comentarioEditado = $request->comentario;

if ($comentarioOriginal == $comentarioEditado) {
$request->session()->flash('alert-info', 'Nenhuma alteração realizada');
return redirect("chamados/{$comentario->chamado->id}");
}

$comentario->comentario = $comentarioEditado;
$comentario->save();

Log::info('Comentário editado', [
'comentario_id' => $comentario->id,
'chamado_id' => $comentario->chamado_id,
'user_id' => \Auth::user()->id,
'comentario_original' => $comentarioOriginal,
'comentario_editado' => $comentarioEditado,
]);

Comentario::criarSystem(
$comentario->chamado,
'O comentário de ' . e($comentario->user->name) . ' foi editado.'
);

$request->session()->flash('alert-info', 'Comentário editado com sucesso');
return redirect("chamados/{$comentario->chamado->id}");
}
}
4 changes: 4 additions & 0 deletions app/Http/Controllers/FilaController.php
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,10 @@ public function update(Request $request, Fila $fila)
}

if ($request->card == 'config') {
$request->validate([
'config.editar_comentarios_timeout_horas' => 'required|integer|min:0',
]);

$settings = $request->settings;
$fila->settings()->set('instrucoes', $settings['instrucoes']);

Expand Down
28 changes: 28 additions & 0 deletions app/Models/Comentario.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use App\Models\Chamado;
use App\Models\User;
use App\Observers\ComentarioObserver;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

Expand Down Expand Up @@ -51,6 +52,33 @@ public static function tipos()
return ['user', 'system'];
}

public function podeSerEditadoPor(User $user)
{
if ($this->tipo != 'user') {
return false;
}

if ($this->user_id != $user->id) {
return false;
}

if (!$this->chamado->fila->config->editar_comentarios) {
return false;
}

$timeout = $this->chamado->fila->config->editar_comentarios_timeout_horas;
if ($timeout == 0) {
return true;
}

return $this->created_at->greaterThanOrEqualTo(Carbon::now()->subHours($timeout));
}

public function foiEditado()
{
return $this->created_at && $this->updated_at && $this->updated_at->greaterThan($this->created_at);
}

/**
* relacionamento com user
*/
Expand Down
6 changes: 6 additions & 0 deletions app/Models/Fila.php
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,9 @@ public function getConfigAttribute($value)
$out = new \StdClass;
$out->triagem = $value->triagem ?? config('filas.config.triagem');
$out->patrimonio = $value->patrimonio ?? config('filas.config.patrimonio');
$out->editar_comentarios = $value->editar_comentarios ?? config('filas.config.editar_comentarios');
$out->editar_comentarios_timeout_horas = $value->editar_comentarios_timeout_horas
?? config('filas.config.editar_comentarios_timeout_horas');
$out->visibilidade = $v;
$out->status = $value->status ?? config('filas.config.status');
return $out;
Expand Down Expand Up @@ -219,6 +222,9 @@ public function setConfigAttribute($value)
$config = new \StdClass;
$config->triagem = $value['triagem'];
$config->patrimonio = $value['patrimonio'];
$config->editar_comentarios = $value['editar_comentarios'] ?? 0;
$config->editar_comentarios_timeout_horas = $value['editar_comentarios_timeout_horas']
?? config('filas.config.editar_comentarios_timeout_horas');
$config->visibilidade = $v;

$config->status = $value['status'];
Expand Down
1 change: 1 addition & 0 deletions config/chamados.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

'usar_foto' => env('USAR_FOTO', false),
'upload_max_filesize' => (int) env('UPLOAD_MAX_FILESIZE', '16') * 1024,
'editar_comentarios_timeout_horas' => (int) env('EDITAR_COMENTARIOS_TIMEOUT_HORAS', 12),

// deprecado em 2/23. Remover no próximo release
'forcar_https' => env('FORCAR_HTTPS', false),
Expand Down
2 changes: 2 additions & 0 deletions config/filas.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
'setores' => 'todos', # todos ou interno
],
'patrimonio' => 0,
'editar_comentarios' => 0,
'editar_comentarios_timeout_horas' => config('chamados.editar_comentarios_timeout_horas'),
];

$template = '{}';
Expand Down
2 changes: 2 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,8 @@ Cadastre uma nova URL no configurador de senha única utilizando o caminho `http

Há várias opções que precisam ser ajustadas nesse arquivo. Faça com atenção para não deixar passar nada. O arquivo está todo documentado.

A variável `EDITAR_COMENTARIOS_TIMEOUT_HORAS` define o timeout padrão, em horas, para edição de comentários próprios nas filas que habilitarem essa opção. Cada fila pode sobrescrever esse valor nas suas configurações; use `0` para permitir edição sem limite de tempo.

### Popular banco de dados

php artisan migrate
Expand Down
61 changes: 55 additions & 6 deletions resources/views/chamados/show/card-comentarios-user.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,48 @@
@forelse ($chamado->comentarios->where('tipo','user')->sortByDesc('created_at') as $comentario)
<div class="">
<b>{{ $comentario->user->name }}</b> - {{ $comentario->created_at->format('d/m/Y H:i') }}
@if ($comentario->foiEditado())
<span class="badge badge-secondary" title="Editado em {{ $comentario->updated_at->format('d/m/Y H:i') }}">editado</span>
@endif
@if ($comentario->podeSerEditadoPor(Auth::user()))
<button type="button" class="btn btn-sm btn-light text-primary py-0 ml-1" data-toggle="modal"
data-target="#editarComentarioModal{{ $comentario->id }}" title="Editar comentário">
<i class="far fa-edit"></i>
</button>
@endif
</div>
<div class="ml-2">
<p class="card-text" id="comentario">{!! nl2br($comentario->comentario) !!}</p>
<p class="card-text">{!! nl2br($comentario->comentario) !!}</p>
</div>
@if ($comentario->podeSerEditadoPor(Auth::user()))
<div class="modal fade" id="editarComentarioModal{{ $comentario->id }}" data-backdrop="static" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Editar comentário</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
{{ html()->form('PUT', 'comentarios/' . $comentario->id)->open() }}
@csrf
<div class="form-group">
<textarea class="form-control comentario-linkify" name="comentario" rows="7" required>{{ $comentario->comentario }}</textarea>
<small class="form-text text-muted">
Aceita tags HTML básicas. URLs são convertidas automaticamente em links, exceto quando estiverem entre aspas simples.
</small>
</div>
<div class="form-group">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
<button type="submit" class="btn btn-primary">Salvar</button>
</div>
{{ html()->form()->close() }}
</div>
</div>
</div>
</div>
@endif
<hr />
@empty
Não há comentários
Expand All @@ -48,24 +86,35 @@ function validURL(str) {
'(\\#[-a-z\\d_]*)?$','i'); // fragment locator
return !!pattern.test(str);
}

function hasOddSingleQuotes(str) {
var quotes = str.match(/'/g);
return quotes !== null && quotes.length % 2 === 1;
}

/* Procura palavra por palavra formato de url e converte em tag html */
$(function() {
$("#comentario").on("blur", function() {
$("textarea[name='comentario']").on("blur", function() {
var text = $(this).val();
var text1 = text.replace(/(?:\r\n|\r|\n)/g, ' <br> ');
var array = text1.trim().split(/\s+/);
var html = '';
var insideSingleQuotes = false;
for (var i = 0; i < array.length; i++) {
if (validURL(array[i])) {
var ignoreLink = insideSingleQuotes || array[i].indexOf("'") !== -1;
if (!ignoreLink && validURL(array[i])) {
if (array[i].search('http://') === -1 && array[i].search('https://') === -1) {
array[i] = "http://" + array[i];
array[i] = "https://" + array[i];
}
array[i] = "<a href='" + array[i] + "' target='_blank'>" + array[i] + "</a>";
array[i] = "<a href='" + array[i] + "' target='_blank'>" + array[i] + "</a>";
}
if (hasOddSingleQuotes(array[i])) {
insideSingleQuotes = !insideSingleQuotes;
}
html += array[i] + " ";
}
$(this).val(html);
})
})
</script>
@endsection
@endsection
3 changes: 3 additions & 0 deletions resources/views/chamados/show/comentarios-add-modal.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@

<div class="form-group">
<textarea class="form-control" id="comentario" name="comentario" rows="7" required></textarea>
<small class="form-text text-muted">
Aceita tags HTML básicas. URLs são convertidas automaticamente em links, exceto quando estiverem entre aspas simples.
</small>
</div>

@if ($chamado->status != 'Fechado')
Expand Down
31 changes: 31 additions & 0 deletions resources/views/filas/partials/config-card.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,37 @@
</div>
</div>

<div class="ml-2 mt-3">
<span class="font-weight-bold">Comentários</span>

<div class="ml-2">
<span class="text-muted mr-2">permitir edição pelo autor:</span>

<div class="form-check form-check-inline">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="config[editar_comentarios]" value="1"
{{ $fila->config->editar_comentarios ? 'checked' : '' }}>
Sim
</label>
</div>
<div class="form-check form-check-inline">
<label class="form-check-label">
<input class="form-check-input" type="radio" name="config[editar_comentarios]" value="0"
{{ $fila->config->editar_comentarios ? '' : 'checked' }}>
Não
</label>
</div>

<div class="form-group mt-2">
<label for="editar_comentarios_timeout_horas" class="text-muted">timeout para edição em horas:</label>
<input class="form-control form-control-sm col-md-2" type="number" min="0"
id="editar_comentarios_timeout_horas" name="config[editar_comentarios_timeout_horas]"
value="{{ $fila->config->editar_comentarios_timeout_horas }}">
<small class="form-text text-muted">Use 0 para permitir edição sem limite de tempo.</small>
</div>
</div>
</div>

<x-textarea class="mt-3" label="<b>Instruções</b>" name="settings[instrucoes]"
value="{!! $fila->settings()->get('instrucoes') !!}" helpView="ajuda.filas.config-instrucoes" />

Expand Down
1 change: 1 addition & 0 deletions routes/web.php
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@

// COMENTARIOS
Route::post('comentarios/{chamado}/', [ComentarioController::class, 'store']);
Route::put('comentarios/{comentario}/', [ComentarioController::class, 'update']);

// ARQUIVOS
Route::resource('arquivos', ArquivoController::class);
Expand Down
Loading
Loading