From 93cc962b82748259db9eee4a1c73ad76e07fc464 Mon Sep 17 00:00:00 2001
From: gnacho
Date: Sun, 4 Oct 2026 09:38:42 +0200
Subject: [PATCH 1/5] fix(app): decision solutions readable - actions in two
rows, attachments only while editing
---
app/src/components/DecisionModal.tsx | 176 +++++++++++++++------------
1 file changed, 96 insertions(+), 80 deletions(-)
diff --git a/app/src/components/DecisionModal.tsx b/app/src/components/DecisionModal.tsx
index adf4f89..06d5cb0 100644
--- a/app/src/components/DecisionModal.tsx
+++ b/app/src/components/DecisionModal.tsx
@@ -88,6 +88,8 @@ function AttachmentRow({
e.preventDefault()}
className="w-7 h-7 rounded-lg text-muted hover:bg-surface2 flex items-center justify-center shrink-0"
aria-label={t('decisions.attachment.download', { name: att.filename })}
>
@@ -97,6 +99,7 @@ function AttachmentRow({
)}
+ {/* Fila inferior: like + elegir */}
+
+ {decision.status === 'open' ? (
+ void handleVote(s.id, s.my_vote)}
+ className={`inline-flex items-center gap-1 rounded-full px-3 py-1.5 text-[13px] font-semibold transition-colors ${
+ s.my_vote
+ ? 'bg-brand text-brandfg'
+ : 'bg-surface border border-app text-muted hover:bg-surface2'
+ }`}
+ aria-label={t('decisions.votes', { count: s.votes })}
+ >
+
+ {s.votes}
+
+ ) : (
+
+
+ {s.votes}
+
+ )}
+ {decision.status === 'open' && canDecide && (
+ setChooseTarget(s.id)}
+ className="px-3 py-1.5 rounded-full text-[13px] font-semibold border border-brand/60 text-brand hover:bg-brand-soft transition-colors"
+ >
+ {t('decisions.modal.choose')}
+
+ )}
+
>
)}
From f764b5bef2863e0b5044fa32731fd9a6507c259d Mon Sep 17 00:00:00 2001
From: gnacho
Date: Sun, 4 Oct 2026 09:58:15 +0200
Subject: [PATCH 2/5] fix(app): decision solutions - vote beside edit, choose
floats in text gap
---
app/src/components/DecisionModal.tsx | 55 ++++++++++++++--------------
1 file changed, 28 insertions(+), 27 deletions(-)
diff --git a/app/src/components/DecisionModal.tsx b/app/src/components/DecisionModal.tsx
index 06d5cb0..f1a5eb3 100644
--- a/app/src/components/DecisionModal.tsx
+++ b/app/src/components/DecisionModal.tsx
@@ -654,7 +654,7 @@ export function DecisionModal({
) : (
<>
- {/* Fila superior: titulo + editar */}
+ {/* Fila superior: titulo + like + editar */}
+ {decision.status === 'open' ? (
+
void handleVote(s.id, s.my_vote)}
+ className={`inline-flex items-center gap-1 shrink-0 rounded-full px-3 py-1.5 text-[13px] font-semibold transition-colors ${
+ s.my_vote
+ ? 'bg-brand text-brandfg'
+ : 'bg-surface border border-app text-muted hover:bg-surface2'
+ }`}
+ aria-label={t('decisions.votes', { count: s.votes })}
+ >
+
+ {s.votes}
+
+ ) : (
+
+
+ {s.votes}
+
+ )}
{(s.proposer_id === user?.id || user?.role === 'admin') && (
)}
-
- {t('decisions.by', { name: s.proposer_username })}
-
{solAttError?.solutionId === s.id && (
)}
- {/* Fila inferior: like + elegir */}
-
- {decision.status === 'open' ? (
-
void handleVote(s.id, s.my_vote)}
- className={`inline-flex items-center gap-1 rounded-full px-3 py-1.5 text-[13px] font-semibold transition-colors ${
- s.my_vote
- ? 'bg-brand text-brandfg'
- : 'bg-surface border border-app text-muted hover:bg-surface2'
- }`}
- aria-label={t('decisions.votes', { count: s.votes })}
- >
-
- {s.votes}
-
- ) : (
-
-
- {s.votes}
-
- )}
+ {/* Autor + Elegir flotando a la derecha: sin separador,
+ encaja en el hueco que deja el texto */}
+
+
+ {t('decisions.by', { name: s.proposer_username })}
+
{decision.status === 'open' && canDecide && (
setChooseTarget(s.id)}
- className="px-3 py-1.5 rounded-full text-[13px] font-semibold border border-brand/60 text-brand hover:bg-brand-soft transition-colors"
+ className="float-right px-3 py-1 rounded-full text-[12px] font-semibold border border-brand/60 text-brand hover:bg-brand-soft transition-colors"
>
{t('decisions.modal.choose')}
From 272e570f8eb7a5e185d79e946a6d63bf6073eaef Mon Sep 17 00:00:00 2001
From: gnacho
Date: Sun, 4 Oct 2026 10:13:48 +0200
Subject: [PATCH 3/5] fix(app): decision modal fits mobile - shared action row
and stacked comment form
---
app/src/components/DecisionModal.tsx | 117 ++++++++++++++-------------
1 file changed, 63 insertions(+), 54 deletions(-)
diff --git a/app/src/components/DecisionModal.tsx b/app/src/components/DecisionModal.tsx
index f1a5eb3..3838ea9 100644
--- a/app/src/components/DecisionModal.tsx
+++ b/app/src/components/DecisionModal.tsx
@@ -746,7 +746,7 @@ export function DecisionModal({
{/* Proponer solución */}
{decision.status === 'open' && (
-
+ )}
+ {/* Fila de acciones: proponer + acciones del creador, todas juntas */}
+
+ {decision.status === 'open' && (
{t('decisions.modal.propose')}
-
- )}
+ )}
+ {canDecide &&
+ (decision.status === 'decided' ? (
+
void handleReopen()}
+ className="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-[13px] font-medium bg-surface border border-app text-muted hover:bg-surface2"
+ >
+
+ {t('decisions.modal.reopen')}
+
+ ) : (
+ <>
+
setChooseTarget(null)}
+ className="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-[13px] font-medium bg-surface border border-app text-muted hover:bg-surface2"
+ >
+ {t('decisions.modal.closeWithoutSolution')}
+
+
void handleDelete()}
+ className="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-[13px] font-medium text-rose-600 dark:text-rose-400 hover:bg-rose-50 dark:hover:bg-rose-500/10"
+ >
+ {t('common.delete')}
+
+ >
+ ))}
+
{error && (
- {/* Acciones del creador */}
- {canDecide && (
-
- {decision.status === 'decided' ? (
- void handleReopen()}
- className="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-[13px] font-medium bg-surface border border-app text-muted hover:bg-surface2"
- >
-
- {t('decisions.modal.reopen')}
-
- ) : (
- <>
- setChooseTarget(null)}
- className="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-[13px] font-medium bg-surface border border-app text-muted hover:bg-surface2"
- >
- {t('decisions.modal.closeWithoutSolution')}
-
- void handleDelete()}
- className="inline-flex items-center gap-1.5 px-3 py-2 rounded-xl text-[13px] font-medium text-rose-600 dark:text-rose-400 hover:bg-rose-50 dark:hover:bg-rose-500/10"
- >
- {t('common.delete')}
-
- >
- )}
-
- )}
-
{/* Comentarios */}
-
- {t('decisions.modal.comments')}
-
- {comments.length > 0 ? (
-