Add review workflows, tree-shaped workflows and a workflow editor

This commit is contained in:
Ian Gulliver
2026-10-20 18:52:04 -07:00
parent 9869fad988
commit f2188c53eb
31 changed files with 2179 additions and 863 deletions
+49
View File
@@ -110,6 +110,53 @@ struct ProjectView: View {
}
}
private struct ReviewWorkflowMenu: View {
let project: Project
@Environment(Store.self) private var store
@Environment(Overlays.self) private var overlays
@ViewState private var reviewWorkflows: [String] = []
var body: some View {
Menu {
Button("No reviews") { set("") }
ForEach(reviewWorkflows, id: \.self) { name in
Button(name) { set(name) }
}
} label: {
HStack(spacing: 6) {
Text(project.reviewWorkflow.isEmpty ? "no reviews" : "reviews: \(project.reviewWorkflow)")
Image(systemName: "chevron.up.chevron.down")
.font(.system(size: 8, weight: .semibold))
}
.font(Fonts.font(11))
.foregroundStyle(Palette.muted)
.contentShape(Rectangle())
}
.menuStyle(.button)
.buttonStyle(.plain)
.menuIndicator(.hidden)
.fixedSize()
.help("The review workflow whose reviewers review every snapshot of this project's tasks")
.task {
do {
reviewWorkflows = try await store.api.client.listWorkflows().ok.body.json.filter { $0.kind == .review }.map(\.name)
} catch {
reviewWorkflows = []
}
}
}
private func set(_ name: String) {
Task {
do {
_ = try await store.api.client.setReviewWorkflow(path: .init(projectId: project.id), body: .json(.init(workflow: name))).ok.body.json
} catch {
overlays.showAlert(errorText(error))
}
}
}
}
private struct ProjectBlock: View {
let project: Project
let todo: Result<Todo, ApiError>?
@@ -121,6 +168,8 @@ private struct ProjectBlock: View {
HStack(alignment: .firstTextBaseline, spacing: 6) {
Text(project.name).font(Fonts.font(13, weight: 700))
Text(project.defaultBranch).font(Fonts.font(11)).foregroundStyle(Palette.muted)
Spacer()
ReviewWorkflowMenu(project: project)
}
.padding(.top, 16)
.padding(.bottom, 6)