Make Ctrl+Plus context aware

This commit is contained in:
2026-07-22 20:15:33 +02:00
parent fd62bf2e15
commit a6b83285eb
5 changed files with 243 additions and 16 deletions
@@ -0,0 +1,79 @@
export type GridInsertionRowType =
| "circuitCompact"
| "circuitSummary"
| "deviceRow"
| "reserveCircuit"
| "placeholder";
export type GridInsertionCellKind = "circuitField" | "deviceField" | "readonly" | "computed";
export interface GridInsertionSelection {
rowType: GridInsertionRowType;
cellKind: GridInsertionCellKind;
sectionId: string;
circuitId?: string;
deviceId?: string;
}
export type GridInsertionIntent =
| { kind: "circuit"; sectionId: string; afterCircuitId?: string }
| { kind: "device"; sectionId: string; circuitId: string; afterDeviceRowId?: string };
export function resolveGridInsertionIntent(
selection: GridInsertionSelection | null,
fallbackSectionId?: string
): GridInsertionIntent | null {
if (!selection) {
return fallbackSectionId ? { kind: "circuit", sectionId: fallbackSectionId } : null;
}
if (selection.rowType === "placeholder") {
return { kind: "circuit", sectionId: selection.sectionId };
}
const targetsDevice =
selection.rowType === "deviceRow" ||
((selection.rowType === "circuitCompact" || selection.rowType === "reserveCircuit") &&
selection.cellKind === "deviceField");
if (targetsDevice && selection.circuitId) {
return {
kind: "device",
sectionId: selection.sectionId,
circuitId: selection.circuitId,
afterDeviceRowId: selection.deviceId,
};
}
if (selection.circuitId) {
return {
kind: "circuit",
sectionId: selection.sectionId,
afterCircuitId: selection.circuitId,
};
}
return { kind: "circuit", sectionId: selection.sectionId };
}
export function getInsertionSortOrder(
orderedEntries: Array<{ id: string; sortOrder: number }>,
afterId?: string
): number {
if (orderedEntries.length === 0) {
return 10;
}
if (!afterId) {
return Math.max(...orderedEntries.map((entry) => entry.sortOrder)) + 10;
}
const entries = [...orderedEntries].sort((left, right) => left.sortOrder - right.sortOrder);
const index = entries.findIndex((entry) => entry.id === afterId);
if (index < 0) {
return entries[entries.length - 1].sortOrder + 10;
}
const current = entries[index].sortOrder;
const next = entries[index + 1]?.sortOrder;
return next === undefined ? current + 10 : current + (next - current) / 2;
}