diff --git a/Corner/UI/NewTaskField.swift b/Corner/UI/NewTaskField.swift index 53b5f4b..ae48a59 100644 --- a/Corner/UI/NewTaskField.swift +++ b/Corner/UI/NewTaskField.swift @@ -7,6 +7,9 @@ struct NewTaskField: View { var placeholder: LocalizedStringKey = "Agregar tarea…" /// Tomar el foco al aparecer (campo de subtareas: se expande para escribir). var autofocus: Bool = false + /// Esc: además de limpiar y soltar el foco, avisa a quien lo muestre + /// (para que un grupo de subtareas vacío pueda cerrarse). + var onCancel: (() -> Void)? = nil let onSubmit: (String) -> Void @State private var text = "" @@ -30,6 +33,7 @@ struct NewTaskField: View { // Esc limpia y suelta el foco; la segunda Esc cierra el panel. text = "" focused = false + onCancel?() } .onAppear { if autofocus { focused = true } diff --git a/Corner/UI/TaskGroupRows.swift b/Corner/UI/TaskGroupRows.swift index 7f07df4..1ea8dd1 100644 --- a/Corner/UI/TaskGroupRows.swift +++ b/Corner/UI/TaskGroupRows.swift @@ -25,7 +25,10 @@ struct TaskGroupRows: View { ? nil : (subtasks.filter(\.isDone).count, subtasks.count), isExpanded: isExpanded, - onToggleExpand: subtasks.isEmpty ? nil : { toggleExpanded() }, + // El chevron también aparece en un grupo expandido pero aún vacío: + // si no, tocar "+" y no escribir nada dejaba el campo abierto sin + // manera de cerrarlo (SPEC §4.2). + onToggleExpand: (subtasks.isEmpty && !isExpanded) ? nil : { toggleExpanded() }, onAddSubtask: { withAnimation(.snappy) { _ = expanded.insert(task.id) } }, moveDestinations: Self.labeledDestinations(store.moveDestinations(), excluding: task.assignedDay), @@ -50,7 +53,13 @@ struct TaskGroupRows: View { .listRowSeparator(.hidden) .moveDisabled(true) } - NewTaskField(placeholder: "Agregar paso…", autofocus: true) { text in + NewTaskField(placeholder: "Agregar paso…", autofocus: true, onCancel: { + // Esc en un grupo que sigue vacío lo colapsa; con subtareas + // ya creadas, Esc solo suelta el campo (SPEC §4.2). + if store.subtasks(of: task).isEmpty { + withAnimation(.snappy) { expanded.remove(task.id) } + } + }) { text in store.addSubtask(text, to: task) } .padding(.leading, 26) diff --git a/docs/SPEC.md b/docs/SPEC.md index 1706508..1bfcd4f 100644 --- a/docs/SPEC.md +++ b/docs/SPEC.md @@ -141,6 +141,9 @@ El panel se cierra cuando ocurre cualquiera de: - **UI plegable:** el padre con subtareas muestra un chevron y un contador "2/5". Expandir revela las subtareas indentadas + campo "Agregar paso…". El estado expandido/colapsado es efímero (se colapsa al reabrir el panel). + El chevron también está disponible en un grupo **expandido pero aún vacío**, + y **Esc en su campo lo colapsa**: abrir el campo con "+" y no escribir nada + nunca deja una fila abierta sin forma de cerrarla. - **Crear la primera subtarea:** botón "+" visible al hacer hover sobre la tarea (junto a la ✕), o clic derecho → "Agregar subtarea". Ambos expanden la fila y el campo "Agregar paso…" toma el foco listo para escribir.