дзеркало
https://github.com/l0ng-ai/openidea.git
синхронізовано 2026-11-08 19:02:17 +02:00
⌘F12 / Ctrl+F12 in a focused table editor did nothing. It now opens Go to Column: the table's columns with their types and key icons, filtered as you type (prefix matches first); Enter selects that column's cell in the current row and scrolls the grid to it. File Structure in text editors is unchanged. The grid now also scrolls sideways when arrow keys or the search bar's current match move to a column outside the view.
60 рядки
1.8 KiB
TypeScript
60 рядки
1.8 KiB
TypeScript
/**
|
|
* The table editor that has focus, for Submit / Revert (⌘↩ / ⌥⌘Z) and Go to Column (⌘F12). Not
|
|
* while a text field has it: ⌘↩ there applies the field's own edit (the Value panel, the cell editor).
|
|
*/
|
|
import { setContext } from "@/platform/context";
|
|
|
|
export interface TableEditorHandle {
|
|
dirty: boolean;
|
|
submit(): void;
|
|
revert(): void;
|
|
showColumns(): void;
|
|
}
|
|
|
|
const handles = new WeakMap<Element, TableEditorHandle>();
|
|
let active: TableEditorHandle | null = null;
|
|
|
|
const isTextField = (el: Element) => !!el.closest("input, textarea, select, [contenteditable='true']");
|
|
|
|
function update() {
|
|
setContext("dbTableEditorFocus", !!active);
|
|
setContext("dbTableEditorChanges", !!active?.dirty);
|
|
}
|
|
|
|
function onFocusIn(event: FocusEvent) {
|
|
const target = event.target instanceof Element ? event.target : null;
|
|
const root = target?.closest("[data-db-table-editor]");
|
|
active = (root && !isTextField(target!) && handles.get(root)) || null;
|
|
update();
|
|
}
|
|
|
|
/** Registers the editor rooted at `root`; returns the function that unregisters it. */
|
|
export function registerTableEditor(root: Element, handle: TableEditorHandle): () => void {
|
|
handles.set(root, handle);
|
|
if (root.contains(document.activeElement) && !isTextField(document.activeElement!)) active = handle;
|
|
update();
|
|
return () => {
|
|
handles.delete(root);
|
|
if (active === handle) active = null;
|
|
update();
|
|
};
|
|
}
|
|
|
|
/** The handle's state changed (pending edits). */
|
|
export function tableEditorChanged(handle: TableEditorHandle) {
|
|
if (active === handle) update();
|
|
}
|
|
|
|
export function activeTableEditor(): TableEditorHandle | null {
|
|
return active;
|
|
}
|
|
|
|
export function installTableEditorFocus(): () => void {
|
|
document.addEventListener("focusin", onFocusIn);
|
|
return () => {
|
|
document.removeEventListener("focusin", onFocusIn);
|
|
active = null;
|
|
update();
|
|
};
|
|
}
|