2024-06-18 19:53:56 +03:00
|
|
|
import { Extension } from '@codemirror/state';
|
|
|
|
import { EditorView } from '@uiw/react-codemirror';
|
|
|
|
|
|
|
|
import { ConstituentaID, IRSForm } from '@/models/rsform';
|
|
|
|
import { findAliasAt } from '@/utils/codemirror';
|
|
|
|
|
2024-06-19 12:09:10 +03:00
|
|
|
const navigationProducer = (schema: IRSForm, onOpenEdit: (cstID: ConstituentaID) => void) => {
|
2024-06-18 19:53:56 +03:00
|
|
|
return EditorView.domEventHandlers({
|
|
|
|
click: (event: MouseEvent, view: EditorView) => {
|
|
|
|
if (!event.ctrlKey) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const pos = view.posAtCoords({ x: event.clientX, y: event.clientY });
|
|
|
|
if (!pos) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const { alias } = findAliasAt(pos, view.state);
|
|
|
|
if (!alias) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const cst = schema.cstByAlias.get(alias);
|
|
|
|
if (!cst) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
event.preventDefault();
|
|
|
|
event.stopPropagation();
|
|
|
|
onOpenEdit(cst.id);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
export function rsNavigation(schema: IRSForm, onOpenEdit: (cstID: ConstituentaID) => void): Extension {
|
2024-06-19 12:09:10 +03:00
|
|
|
return [navigationProducer(schema, onOpenEdit)];
|
2024-06-18 19:53:56 +03:00
|
|
|
}
|