Rename Wallamonitor to Wallabicher across all files and update related configurations in Docker and documentation. Adjusted service names, container names, and references in scripts and frontend components to reflect the new naming convention.

This commit is contained in:
Omar Sánchez Pizarro
2026-01-19 22:04:25 +01:00
parent 609d9e24e7
commit dc9c9130aa
23 changed files with 198 additions and 150 deletions

View File

@@ -1,22 +1,22 @@
<template>
<div>
<div class="mb-6">
<div class="flex justify-between items-center mb-4">
<h1 class="text-3xl font-bold text-gray-900">Artículos Notificados</h1>
<div class="flex items-center space-x-4">
<select
v-model="selectedPlatform"
@change="loadArticles"
class="input"
style="width: auto;"
>
<option value="">Todas las plataformas</option>
<option value="wallapop">Wallapop</option>
<option value="vinted">Vinted</option>
</select>
<button @click="loadArticles" class="btn btn-primary">
Actualizar
</button>
<div class="mb-4 sm:mb-6">
<div class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 sm:gap-4 mb-4">
<h1 class="text-2xl sm:text-3xl font-bold text-gray-900">Artículos Notificados</h1>
<div class="flex flex-col sm:flex-row items-stretch sm:items-center gap-2 sm:space-x-4">
<select
v-model="selectedPlatform"
@change="loadArticles"
class="input text-sm sm:text-base"
style="width: 100%; min-width: 180px;"
>
<option value="">Todas las plataformas</option>
<option value="wallapop">Wallapop</option>
<option value="vinted">Vinted</option>
</select>
<button @click="loadArticles" class="btn btn-primary whitespace-nowrap">
Actualizar
</button>
</div>
</div>
@@ -63,18 +63,18 @@
:key="`${article.platform}-${article.id}`"
class="card hover:shadow-lg transition-shadow"
>
<div class="flex gap-4">
<div class="flex flex-col sm:flex-row gap-3 sm:gap-4">
<!-- Imagen del artículo -->
<div class="flex-shrink-0">
<div v-if="article.images && article.images.length > 0" class="w-32 h-32 relative">
<div class="flex-shrink-0 self-center sm:self-start">
<div v-if="article.images && article.images.length > 0" class="w-24 h-24 sm:w-32 sm:h-32 relative">
<img
:src="article.images[0]"
:alt="article.title || 'Sin título'"
class="w-32 h-32 object-cover rounded-lg"
class="w-24 h-24 sm:w-32 sm:h-32 object-cover rounded-lg"
@error="($event) => handleImageError($event)"
/>
</div>
<div v-else class="w-32 h-32 bg-gray-200 rounded-lg flex items-center justify-center">
<div v-else class="w-24 h-24 sm:w-32 sm:h-32 bg-gray-200 rounded-lg flex items-center justify-center">
<span class="text-gray-400 text-xs">Sin imagen</span>
</div>
</div>
@@ -83,7 +83,7 @@
<div class="flex-1 min-w-0">
<div class="flex items-start justify-between mb-2">
<div class="flex-1 min-w-0">
<div class="flex items-center space-x-2 mb-2">
<div class="flex flex-wrap items-center gap-2 mb-2">
<span
class="px-2 py-1 text-xs font-semibold rounded flex-shrink-0"
:class="
@@ -94,12 +94,12 @@
>
{{ article.platform?.toUpperCase() || 'N/A' }}
</span>
<span class="text-sm text-gray-500 whitespace-nowrap">
<span class="text-xs sm:text-sm text-gray-500">
{{ formatDate(article.notifiedAt) }}
</span>
</div>
<h3 class="text-lg font-semibold text-gray-900 mb-1 truncate" :title="article.title">
<h3 class="text-base sm:text-lg font-semibold text-gray-900 mb-1 line-clamp-2" :title="article.title">
{{ article.title || 'Sin título' }}
</h3>
@@ -109,36 +109,36 @@
</span>
</div>
<div class="space-y-1 text-sm text-gray-600 mb-2">
<div v-if="article.location" class="flex items-center">
<div class="space-y-1 text-xs sm:text-sm text-gray-600 mb-2">
<div v-if="article.location" class="flex flex-wrap items-center">
<span class="font-medium">📍 Localidad:</span>
<span class="ml-2">{{ article.location }}</span>
</div>
<div v-if="article.allows_shipping !== null" class="flex items-center">
<div v-if="article.allows_shipping !== null" class="flex flex-wrap items-center">
<span class="font-medium">🚚 Envío:</span>
<span class="ml-2">{{ article.allows_shipping ? '✅ Acepta envíos' : '❌ No acepta envíos' }}</span>
</div>
<div v-if="article.modified_at" class="flex items-center">
<div v-if="article.modified_at" class="flex flex-wrap items-center">
<span class="font-medium">🕒 Modificado:</span>
<span class="ml-2">{{ article.modified_at }}</span>
<span class="ml-2 break-all">{{ article.modified_at }}</span>
</div>
</div>
<p v-if="article.description" class="text-sm text-gray-700 mb-2 overflow-hidden" style="display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;">
<p v-if="article.description" class="text-xs sm:text-sm text-gray-700 mb-2 overflow-hidden line-clamp-2">
{{ article.description }}
</p>
<div class="flex items-center space-x-4 mt-3">
<div class="flex flex-wrap items-center gap-2 sm:gap-4 mt-3">
<a
v-if="article.url"
:href="article.url"
target="_blank"
rel="noopener noreferrer"
class="text-primary-600 hover:text-primary-700 text-sm font-medium"
class="text-primary-600 hover:text-primary-700 text-xs sm:text-sm font-medium break-all"
>
🔗 Ver anuncio
</a>
<span class="text-xs text-gray-400">
<span class="text-xs text-gray-400 break-all">
ID: {{ article.id }}
</span>
</div>
@@ -159,14 +159,14 @@
</button>
</div>
<p class="text-center text-sm text-gray-500 mt-4">
<p class="text-center text-xs sm:text-sm text-gray-500 mt-4 px-2">
<span v-if="searchQuery">
Mostrando {{ filteredArticles.length }} resultados de búsqueda en Redis
<span class="ml-2 text-xs text-primary-600">(de {{ total }} artículos totales)</span>
<span class="block sm:inline sm:ml-2 text-xs text-primary-600">(de {{ total }} artículos totales)</span>
</span>
<span v-else>
Mostrando {{ filteredArticles.length }} de {{ total }} artículos
<span class="ml-2 text-xs text-gray-400">(Actualización automática cada 30s)</span>
<span class="block sm:inline sm:ml-2 text-xs text-gray-400">(Actualización automática cada 30s)</span>
</span>
</p>
</div>

View File

@@ -1,17 +1,17 @@
<template>
<div>
<h1 class="text-3xl font-bold text-gray-900 mb-6">Dashboard</h1>
<h1 class="text-2xl sm:text-3xl font-bold text-gray-900 mb-4 sm:mb-6">Dashboard</h1>
<!-- Estadísticas -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 sm:gap-6 mb-6 sm:mb-8">
<div class="card">
<div class="flex items-center">
<div class="flex-shrink-0 bg-primary-100 rounded-lg p-3">
<Cog6ToothIcon class="w-6 h-6 text-primary-600" />
</div>
<div class="ml-4">
<p class="text-sm font-medium text-gray-600">Workers Activos</p>
<p class="text-2xl font-bold text-gray-900">{{ stats.activeWorkers }}/{{ stats.totalWorkers }}</p>
<div class="ml-3 sm:ml-4">
<p class="text-xs sm:text-sm font-medium text-gray-600">Workers Activos</p>
<p class="text-xl sm:text-2xl font-bold text-gray-900">{{ stats.activeWorkers }}/{{ stats.totalWorkers }}</p>
</div>
</div>
</div>
@@ -56,9 +56,9 @@
</div>
<!-- Gráfico de plataformas -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-4 sm:gap-6">
<div class="card">
<h2 class="text-xl font-bold text-gray-900 mb-4">Distribución por Plataforma</h2>
<h2 class="text-lg sm:text-xl font-bold text-gray-900 mb-3 sm:mb-4">Distribución por Plataforma</h2>
<div class="space-y-4">
<div>
<div class="flex justify-between mb-2">
@@ -92,7 +92,7 @@
</div>
<div class="card">
<h2 class="text-xl font-bold text-gray-900 mb-4">Accesos Rápidos</h2>
<h2 class="text-lg sm:text-xl font-bold text-gray-900 mb-3 sm:mb-4">Accesos Rápidos</h2>
<div class="space-y-3">
<router-link
to="/articles"

View File

@@ -1,8 +1,8 @@
<template>
<div>
<div class="flex justify-between items-center mb-6">
<h1 class="text-3xl font-bold text-gray-900">Favoritos</h1>
<button @click="loadFavorites" class="btn btn-primary">
<div class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 sm:gap-4 mb-4 sm:mb-6">
<h1 class="text-2xl sm:text-3xl font-bold text-gray-900">Favoritos</h1>
<button @click="loadFavorites" class="btn btn-primary self-start sm:self-auto">
Actualizar
</button>
</div>
@@ -57,17 +57,17 @@
</div>
</div>
<div class="flex space-x-2 mt-4">
<div class="flex flex-col sm:flex-row gap-2 sm:space-x-2 mt-4">
<a
:href="favorite.url"
target="_blank"
class="flex-1 btn btn-primary text-center"
class="flex-1 btn btn-primary text-center text-sm sm:text-base"
>
Ver artículo
</a>
<button
@click="removeFavorite(favorite.platform, favorite.id)"
class="btn btn-danger"
class="btn btn-danger text-sm sm:text-base"
>
Eliminar
</button>

View File

@@ -1,26 +1,26 @@
<template>
<div>
<div class="flex justify-between items-center mb-6">
<h1 class="text-3xl font-bold text-gray-900">Logs del Sistema</h1>
<div class="flex items-center space-x-4">
<select v-model="logLevel" @change="loadLogs" class="input" style="width: auto;">
<div class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 sm:gap-4 mb-4 sm:mb-6">
<h1 class="text-2xl sm:text-3xl font-bold text-gray-900">Logs del Sistema</h1>
<div class="flex flex-col sm:flex-row items-stretch sm:items-center gap-2 sm:space-x-4">
<select v-model="logLevel" @change="loadLogs" class="input text-sm sm:text-base" style="width: 100%; min-width: 160px;">
<option value="">Todos los niveles</option>
<option value="INFO">INFO</option>
<option value="WARNING">WARNING</option>
<option value="ERROR">ERROR</option>
<option value="DEBUG">DEBUG</option>
</select>
<button @click="loadLogs" class="btn btn-primary">
<button @click="loadLogs" class="btn btn-primary text-sm sm:text-base whitespace-nowrap">
Actualizar
</button>
<button @click="autoRefresh = !autoRefresh" class="btn btn-secondary">
<button @click="autoRefresh = !autoRefresh" class="btn btn-secondary text-sm sm:text-base whitespace-nowrap">
{{ autoRefresh ? '⏸ Pausar' : '▶ Auto-refresh' }}
</button>
</div>
</div>
<div class="card">
<div class="bg-gray-900 text-green-400 font-mono text-sm p-4 rounded-lg overflow-x-auto max-h-[600px] overflow-y-auto">
<div class="card p-2 sm:p-6">
<div class="bg-gray-900 text-green-400 font-mono text-xs sm:text-sm p-3 sm:p-4 rounded-lg overflow-x-auto max-h-[400px] sm:max-h-[600px] overflow-y-auto">
<div v-if="loading" class="text-center py-8">
<div class="inline-block animate-spin rounded-full h-6 w-6 border-b-2 border-green-400"></div>
<p class="mt-2 text-gray-400">Cargando logs...</p>

View File

@@ -1,15 +1,15 @@
<template>
<div>
<div class="flex justify-between items-center mb-6">
<h1 class="text-3xl font-bold text-gray-900">Gestión de Workers</h1>
<div class="flex space-x-2">
<button @click="showGeneralModal = true" class="btn btn-secondary">
<div class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 sm:gap-4 mb-4 sm:mb-6">
<h1 class="text-2xl sm:text-3xl font-bold text-gray-900">Gestión de Workers</h1>
<div class="flex flex-wrap gap-2">
<button @click="showGeneralModal = true" class="btn btn-secondary text-xs sm:text-sm">
Configuración General
</button>
<button @click="handleClearCache" class="btn btn-secondary">
<button @click="handleClearCache" class="btn btn-secondary text-xs sm:text-sm">
🗑 Limpiar Caché
</button>
<button @click="showAddModal = true" class="btn btn-primary">
<button @click="showAddModal = true" class="btn btn-primary text-xs sm:text-sm whitespace-nowrap">
+ Añadir Worker
</button>
</div>
@@ -42,7 +42,7 @@
</span>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 text-sm mb-3">
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4 text-xs sm:text-sm mb-3">
<div>
<span class="text-gray-600 block mb-1">Búsqueda:</span>
<p class="font-medium">{{ worker.search_query }}</p>
@@ -102,22 +102,22 @@
</details>
</div>
</div>
<div class="flex space-x-2 ml-4">
<div class="flex flex-wrap gap-2 sm:space-x-2 sm:ml-4 mt-3 sm:mt-0">
<button
@click="editWorker(worker, activeWorkersIndex(index))"
class="btn btn-secondary text-sm"
class="btn btn-secondary text-xs sm:text-sm flex-1 sm:flex-none"
>
Editar
</button>
<button
@click="deleteWorker(worker.name)"
class="btn btn-danger text-sm"
class="btn btn-danger text-xs sm:text-sm flex-1 sm:flex-none"
>
🗑 Eliminar
</button>
<button
@click="disableWorker(worker.name)"
class="btn btn-secondary text-sm"
class="btn btn-secondary text-xs sm:text-sm flex-1 sm:flex-none"
>
Desactivar
</button>
@@ -128,18 +128,18 @@
</div>
<!-- Workers desactivados -->
<div v-if="disabledWorkers.length > 0" class="mt-8">
<h2 class="text-xl font-semibold text-gray-900 mb-4">Workers Desactivados ({{ disabledWorkers.length }})</h2>
<div v-if="disabledWorkers.length > 0" class="mt-6 sm:mt-8">
<h2 class="text-lg sm:text-xl font-semibold text-gray-900 mb-3 sm:mb-4">Workers Desactivados ({{ disabledWorkers.length }})</h2>
<div class="grid grid-cols-1 gap-4">
<div
v-for="(worker, index) in disabledWorkers"
:key="index"
class="card opacity-60 hover:opacity-80 transition-opacity"
>
<div class="flex items-start justify-between">
<div class="flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3">
<div class="flex-1">
<div class="flex items-center space-x-2 mb-2">
<h3 class="text-lg font-semibold text-gray-900">{{ worker.name }}</h3>
<div class="flex flex-wrap items-center gap-2 mb-2">
<h3 class="text-base sm:text-lg font-semibold text-gray-900">{{ worker.name }}</h3>
<span class="px-2 py-1 text-xs font-semibold rounded bg-red-100 text-red-800">
Desactivado
</span>
@@ -147,24 +147,24 @@
{{ (worker.platform || 'wallapop').toUpperCase() }}
</span>
</div>
<p class="text-sm text-gray-600">{{ worker.search_query }}</p>
<p class="text-xs sm:text-sm text-gray-600">{{ worker.search_query }}</p>
</div>
<div class="flex space-x-2 ml-4">
<div class="flex flex-wrap gap-2 sm:space-x-2 sm:ml-4">
<button
@click="editWorker(worker, disabledWorkersIndex(index))"
class="btn btn-secondary text-sm"
class="btn btn-secondary text-xs sm:text-sm flex-1 sm:flex-none"
>
Editar
</button>
<button
@click="enableWorker(worker.name)"
class="btn btn-primary text-sm"
class="btn btn-primary text-xs sm:text-sm flex-1 sm:flex-none"
>
Activar
</button>
<button
@click="deleteWorker(worker.name)"
class="btn btn-danger text-sm"
class="btn btn-danger text-xs sm:text-sm flex-1 sm:flex-none"
>
🗑 Eliminar
</button>
@@ -185,18 +185,18 @@
<!-- Modal para añadir/editar worker -->
<div
v-if="showAddModal || editingWorker"
class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50"
class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-2 sm:p-4"
@click.self="closeModal"
>
<div class="bg-white rounded-lg p-6 max-w-4xl w-full mx-4 max-h-[90vh] overflow-y-auto">
<h2 class="text-2xl font-bold text-gray-900 mb-4">
<div class="bg-white rounded-lg p-4 sm:p-6 max-w-4xl w-full max-h-[95vh] sm:max-h-[90vh] overflow-y-auto">
<h2 class="text-xl sm:text-2xl font-bold text-gray-900 mb-3 sm:mb-4">
{{ editingWorker ? 'Editar Worker' : 'Añadir Worker' }}
</h2>
<form @submit.prevent="saveWorker" class="space-y-6">
<!-- Información básica -->
<div class="border-b border-gray-200 pb-4">
<h3 class="text-lg font-semibold text-gray-900 mb-4">Información Básica</h3>
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div class="border-b border-gray-200 pb-3 sm:pb-4">
<h3 class="text-base sm:text-lg font-semibold text-gray-900 mb-3 sm:mb-4">Información Básica</h3>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-3 sm:gap-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">Nombre *</label>
<input v-model="workerForm.name" type="text" class="input" required />
@@ -216,9 +216,9 @@
</div>
<!-- Precios y Thread -->
<div class="border-b border-gray-200 pb-4">
<h3 class="text-lg font-semibold text-gray-900 mb-4">Precios y Notificaciones</h3>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div class="border-b border-gray-200 pb-3 sm:pb-4">
<h3 class="text-base sm:text-lg font-semibold text-gray-900 mb-3 sm:mb-4">Precios y Notificaciones</h3>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">Precio Mínimo ()</label>
<input v-model.number="workerForm.min_price" type="number" class="input" min="0" step="0.01" />
@@ -365,11 +365,11 @@
</div>
</div>
<div class="flex justify-end space-x-2 pt-4">
<button type="button" @click="closeModal" class="btn btn-secondary">
<div class="flex flex-col-reverse sm:flex-row justify-end gap-2 sm:space-x-2 pt-4">
<button type="button" @click="closeModal" class="btn btn-secondary text-sm sm:text-base">
Cancelar
</button>
<button type="submit" class="btn btn-primary">
<button type="submit" class="btn btn-primary text-sm sm:text-base">
Guardar
</button>
</div>
@@ -380,11 +380,11 @@
<!-- Modal para configuración general -->
<div
v-if="showGeneralModal"
class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50"
class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-2 sm:p-4"
@click.self="closeGeneralModal"
>
<div class="bg-white rounded-lg p-6 max-w-2xl w-full mx-4 max-h-[90vh] overflow-y-auto">
<h2 class="text-2xl font-bold text-gray-900 mb-4">Configuración General</h2>
<div class="bg-white rounded-lg p-4 sm:p-6 max-w-2xl w-full max-h-[95vh] sm:max-h-[90vh] overflow-y-auto">
<h2 class="text-xl sm:text-2xl font-bold text-gray-900 mb-3 sm:mb-4">Configuración General</h2>
<p class="text-sm text-gray-600 mb-4">Estas configuraciones se aplican a todos los workers</p>
<form @submit.prevent="saveGeneralConfig" class="space-y-4">
<div>
@@ -405,11 +405,11 @@
placeholder="Una palabra por línea o separadas por comas"
></textarea>
</div>
<div class="flex justify-end space-x-2 pt-4 border-t border-gray-200">
<button type="button" @click="closeGeneralModal" class="btn btn-secondary">
<div class="flex flex-col-reverse sm:flex-row justify-end gap-2 sm:space-x-2 pt-4 border-t border-gray-200">
<button type="button" @click="closeGeneralModal" class="btn btn-secondary text-sm sm:text-base">
Cancelar
</button>
<button type="submit" class="btn btn-primary">
<button type="submit" class="btn btn-primary text-sm sm:text-base">
Guardar
</button>
</div>