wire ticket status buttons to pql ticket status

Status buttons in the detail view now call pql.tickets.status IPC,
publish a changed event to refresh the sidebar list, and reload the
detail. Disabled for the current status. IPC handler accepts ids as
a list for batch transitions. PqlClient.ticketSetStatus takes
List<String> and joins with comma per pql CLI contract.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-04-24 10:50:05 +02:00
co-authored by Claude
parent cf9a510e6c
commit 8a0ca92a1f
3 changed files with 27 additions and 3 deletions
@@ -153,9 +153,12 @@ class _StatusControls extends StatelessWidget {
for (final s in _statuses) ...[
Expanded(
child: ClideTappable(
onTap: () async {
await controller.ipc.request('pql.tickets.status', args: {'ids': detail.id, 'status': s});
await controller.load(detail.id);
onTap: detail.status == s ? null : () async {
final resp = await controller.ipc.request('pql.tickets.status', args: {'ids': [detail.id], 'status': s});
if (resp.ok) {
controller.messages.publish('builtin.tickets', 'changed', {'id': detail.id});
await controller.load(detail.id);
}
},
builder: (ctx, hovered, _) {
final active = detail.status == s;
+15
View File
@@ -209,6 +209,21 @@ void registerPqlCommands(DaemonDispatcher d, PqlClient pql) {
}
});
d.register('pql.tickets.status', (req) async {
final rawIds = req.args['ids'];
final ids = rawIds is List ? rawIds.cast<String>() : rawIds is String ? [rawIds] : <String>[];
final status = req.args['status'] as String?;
if (ids.isEmpty || status == null || status.isEmpty) {
return _userError(req.id, 'pql.tickets.status requires ids and status');
}
try {
final result = await pql.ticketSetStatus(ids, status);
return IpcResponse.ok(id: req.id, data: {'tickets': result});
} on PqlException catch (e) {
return _pqlError(req.id, e);
}
});
d.register('pql.tickets.board', (req) async {
try {
final board = await pql.ticketBoard(
+6
View File
@@ -8,6 +8,8 @@ library;
import 'dart:convert';
import 'dart:io';
import 'package:flutter/foundation.dart';
class PqlException implements Exception {
const PqlException(this.message, {this.exitCode = 1, this.stderr = ''});
final String message;
@@ -133,6 +135,10 @@ class PqlClient {
return _runObject(args);
}
Future<List<Map<String, Object?>>> ticketSetStatus(List<String> ids, String status) async {
return _runList(['ticket', 'status', ids.join(','), status]);
}
Future<List<Map<String, Object?>>> ticketBoard({String? team}) async {
final args = ['ticket', 'board'];
if (team != null) args.addAll(['--team', team]);