feat: version 2.17.1 -- Proyectos: checkbox "Ocultar proyectos 100%"
Desmarcado por defecto; la eleccion se guarda en localStorage y sobrevive al cierre de sesion. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -22,6 +22,7 @@ import { DetailPopup } from '../../components/DetailPopup.jsx';
|
||||
import { SharedWithIcon } from '../../components/SharedWithIcon.jsx';
|
||||
|
||||
const CAN_DELETE_ROLES = ['superadmin', 'admin', 'it_manager', 'project_lead'];
|
||||
const HIDE_COMPLETED_KEY = 'plc_projects_hide_completed';
|
||||
|
||||
function flatten(nodes, acc = []) {
|
||||
for (const n of nodes) { acc.push(n); if (n.children?.length) flatten(n.children, acc); }
|
||||
@@ -48,6 +49,14 @@ export default function ProyectosPage() {
|
||||
const [filterStatusId, setFilterStatusId] = useState('');
|
||||
const [filterPriorityId, setFilterPriorityId] = useState('');
|
||||
const [filterDueSoon, setFilterDueSoon] = useState(false);
|
||||
// Persistido en el navegador: se conserva al cerrar sesion o recargar.
|
||||
const [hideCompleted, setHideCompleted] = useState(() => {
|
||||
try { return localStorage.getItem(HIDE_COMPLETED_KEY) === '1'; } catch { return false; }
|
||||
});
|
||||
function toggleHideCompleted(checked) {
|
||||
setHideCompleted(checked);
|
||||
try { localStorage.setItem(HIDE_COMPLETED_KEY, checked ? '1' : '0'); } catch { /* sin storage: solo en memoria */ }
|
||||
}
|
||||
const [filterOwnerUserId, setFilterOwnerUserId] = useState('');
|
||||
// Prueba exploratoria: filtro "ver todos / por usuario" solo para roles que ya ven todos los
|
||||
// proyectos hoy (superadmin/admin/it_manager) -- backend ya soporta ownerUserId, sin cambios.
|
||||
@@ -178,13 +187,16 @@ export default function ProyectosPage() {
|
||||
|
||||
if (!projects) return <div className="text-muted">{t('common_loading')}</div>;
|
||||
|
||||
const visibleProjects = filterDueSoon && !showTrash
|
||||
const dueSoonProjects = filterDueSoon && !showTrash
|
||||
? projects.filter((p) => {
|
||||
if (p.status_is_closed || !p.estimated_end_date) return false;
|
||||
const diffDays = Math.round((new Date(p.estimated_end_date) - new Date()) / 86400000);
|
||||
return diffDays >= 0 && diffDays <= 7;
|
||||
})
|
||||
: projects;
|
||||
const visibleProjects = hideCompleted && !showTrash
|
||||
? dueSoonProjects.filter((p) => Number(p.progress_pct) < 100)
|
||||
: dueSoonProjects;
|
||||
|
||||
return (
|
||||
<div>
|
||||
@@ -244,6 +256,10 @@ export default function ProyectosPage() {
|
||||
<input type="checkbox" checked={filterDueSoon} onChange={(e) => setFilterDueSoon(e.target.checked)} />
|
||||
{t('project_filter_due_soon')}
|
||||
</label>
|
||||
<label className="checkbox-row">
|
||||
<input type="checkbox" checked={hideCompleted} onChange={(e) => toggleHideCompleted(e.target.checked)} />
|
||||
{t('project_filter_hide_completed')}
|
||||
</label>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user