Add Merge & continue and Other… to ready cards

This commit is contained in:
Ian Gulliver
2026-10-20 11:01:59 -07:00
parent 25f275e012
commit ef98b1179d
13 changed files with 363 additions and 88 deletions
+13 -5
View File
@@ -21,6 +21,7 @@ struct MergeWarning {
final class MergeModel {
let taskId: String
let target: String
let keepOpen: Bool
let parentTitle: String?
let coAuthors: [Participant]
let original: String
@@ -32,9 +33,10 @@ final class MergeModel {
@ObservationIgnored var leave: Leave = { _ in }
@ObservationIgnored private var loads = 0
init(taskId: String, target: String, parentTitle: String?, coAuthors: [Participant], title: String) {
init(taskId: String, target: String, keepOpen: Bool, parentTitle: String?, coAuthors: [Participant], title: String) {
self.taskId = taskId
self.target = target
self.keepOpen = keepOpen
self.parentTitle = parentTitle
self.coAuthors = coAuthors
original = title
@@ -72,7 +74,7 @@ final class MergeModel {
}
@MainActor
func confirmMerge(_ taskId: String, _ store: Store, _ overlays: Overlays) async {
func confirmMerge(_ taskId: String, _ store: Store, _ overlays: Overlays, keepOpen: Bool = false) async {
guard let task = store.findTask(taskId), task.status == .active else {
return
}
@@ -107,7 +109,7 @@ func confirmMerge(_ taskId: String, _ store: Store, _ overlays: Overlays) async
}
let title = mergeDrafts[taskId] ?? task.mergeTitle
mergeDrafts[taskId] = nil
let model = MergeModel(taskId: taskId, target: target, parentTitle: parent?.status == .active ? parent?.name : nil, coAuthors: coAuthors, title: title)
let model = MergeModel(taskId: taskId, target: target, keepOpen: keepOpen, parentTitle: !keepOpen && parent?.status == .active ? parent?.name : nil, coAuthors: coAuthors, title: title)
model.leave = { [weak model] go in
if let model {
mergeDrafts[taskId] = model.sentTitle
@@ -131,13 +133,19 @@ func confirmMerge(_ taskId: String, _ store: Store, _ overlays: Overlays) async
let merge = { (afterReview: Bool) in
let body: Operations.MergeTask.Input.Body.JsonPayload = model.toParent
? .init(target: .parent, afterReview: afterReview ? true : nil)
: .init(mergeTitle: model.sentTitle, afterReview: afterReview ? true : nil)
: .init(mergeTitle: model.sentTitle, afterReview: afterReview ? true : nil, keepOpen: keepOpen ? true : nil)
do {
_ = try await store.api.client.mergeTask(path: .init(taskId: taskId), body: .json(body)).accepted
} catch {
overlays.showAlert(errorText(error))
}
}
if keepOpen {
if await overlays.showModal(content, [ModalButton(label: "Cancel", value: "cancel"), ModalButton(label: "Merge & continue", value: "ok", primary: true)], inPane: true, canSubmit: { model.valid }) == "ok" {
await merge(false)
}
return
}
if !model.running {
if await overlays.showModal(content, [ModalButton(label: "Cancel", value: "cancel"), ModalButton(label: "Merge", value: "ok", primary: true)], inPane: true, canSubmit: { model.valid }) == "ok" {
await merge(false)
@@ -245,7 +253,7 @@ private struct MergeContent: View {
.padding(.bottom, 16)
}
if !model.toParent {
Text("Merge into \(model.target) as:")
Text(model.keepOpen ? "Merge the work so far into \(model.target), keeping the task open, as:" : "Merge into \(model.target) as:")
.foregroundStyle(Palette.muted)
.padding(.bottom, 4)
titleRow