Make Ctrl+Plus context aware
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user