make parent tickets and decision refs clickable throughlinks
Clicking a parent ticket in the tree publishes builtin.tickets/selection — loads that ticket in the detail view. Clicking a decision ref publishes builtin.decisions/selection — switches context panel to the decision detail. Both show hover highlight. Enables full cross-reference navigation without leaving the context panel. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -206,21 +206,24 @@ class _CompactCard extends StatelessWidget {
|
|||||||
final typeColor = typeColors.forType(type);
|
final typeColor = typeColors.forType(type);
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: EdgeInsets.only(left: indent * 12.0, bottom: 4),
|
padding: EdgeInsets.only(left: indent * 12.0, bottom: 4),
|
||||||
child: Container(
|
child: ClideTappable(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 6),
|
onTap: () => ClideKernel.of(context).messages.publish('builtin.tickets', 'selection', {'id': id}),
|
||||||
decoration: BoxDecoration(
|
builder: (ctx, hovered, _) => Container(
|
||||||
color: tokens.panelBackground,
|
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 6),
|
||||||
borderRadius: BorderRadius.circular(4),
|
decoration: BoxDecoration(
|
||||||
border: Border.all(color: tokens.panelBorder),
|
color: hovered ? tokens.sidebarItemHover : tokens.panelBackground,
|
||||||
),
|
borderRadius: BorderRadius.circular(4),
|
||||||
child: Row(
|
border: Border.all(color: hovered ? tokens.panelActiveBorder : tokens.panelBorder),
|
||||||
children: [
|
),
|
||||||
Container(width: 6, height: 6, decoration: BoxDecoration(color: typeColor, shape: BoxShape.circle)),
|
child: Row(
|
||||||
const SizedBox(width: 6),
|
children: [
|
||||||
ClideText(id, fontSize: 11, color: tokens.globalTextMuted, fontFamily: clideMonoFamily),
|
Container(width: 6, height: 6, decoration: BoxDecoration(color: typeColor, shape: BoxShape.circle)),
|
||||||
const SizedBox(width: 8),
|
const SizedBox(width: 6),
|
||||||
Expanded(child: ClideText(title, fontSize: 12)),
|
ClideText(id, fontSize: 11, color: tokens.globalTextMuted, fontFamily: clideMonoFamily),
|
||||||
],
|
const SizedBox(width: 8),
|
||||||
|
Expanded(child: ClideText(title, fontSize: 12)),
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -246,28 +249,31 @@ class _DecisionRefCard extends StatelessWidget {
|
|||||||
};
|
};
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.only(bottom: 4),
|
padding: const EdgeInsets.only(bottom: 4),
|
||||||
child: Container(
|
child: ClideTappable(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 6),
|
onTap: () => ClideKernel.of(context).messages.publish('builtin.decisions', 'selection', {'id': id}),
|
||||||
decoration: BoxDecoration(
|
builder: (ctx, hovered, _) => Container(
|
||||||
color: tokens.panelBackground,
|
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 6),
|
||||||
borderRadius: BorderRadius.circular(4),
|
decoration: BoxDecoration(
|
||||||
border: Border.all(color: tokens.panelBorder),
|
color: hovered ? tokens.sidebarItemHover : tokens.panelBackground,
|
||||||
),
|
borderRadius: BorderRadius.circular(4),
|
||||||
child: Column(
|
border: Border.all(color: hovered ? tokens.panelActiveBorder : tokens.panelBorder),
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
),
|
||||||
children: [
|
child: Column(
|
||||||
Row(
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Container(width: 6, height: 6, decoration: BoxDecoration(color: color, shape: BoxShape.circle)),
|
Row(
|
||||||
const SizedBox(width: 6),
|
children: [
|
||||||
ClideText(id, fontSize: 11, color: color, fontFamily: clideMonoFamily),
|
Container(width: 6, height: 6, decoration: BoxDecoration(color: color, shape: BoxShape.circle)),
|
||||||
const Spacer(),
|
const SizedBox(width: 6),
|
||||||
if (domain != null) ClideText(domain, fontSize: 10, color: tokens.globalTextMuted, fontFamily: clideMonoFamily),
|
ClideText(id, fontSize: 11, color: color, fontFamily: clideMonoFamily),
|
||||||
],
|
const Spacer(),
|
||||||
),
|
if (domain != null) ClideText(domain, fontSize: 10, color: tokens.globalTextMuted, fontFamily: clideMonoFamily),
|
||||||
const SizedBox(height: 3),
|
],
|
||||||
ClideText(title, fontSize: 12),
|
),
|
||||||
],
|
const SizedBox(height: 3),
|
||||||
|
ClideText(title, fontSize: 12),
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user