x: getNewPositionOrBorderIfExceeded()

in web/src/shared/components/annotator/hooks/use-gutter-move.ts [79:168]


                x: getNewPositionOrBorderIfExceeded(
                    selectedGutter!.stablePosition.end.x,
                    xDelta,
                    selectedGutter!.type
                ),
                y: getNewPositionOrBorderIfExceeded(
                    selectedGutter!.stablePosition.end.y,
                    yDelta,
                    selectedGutter!.type
                )
            }
        };
        const realXDelta =
            selectedGutter!.type === 'vertical'
                ? newPosition.start.x - selectedGutter!.stablePosition.start.x
                : 0;
        setXDeltaState(realXDelta);
        const realYDelta =
            selectedGutter!.type === 'horizontal'
                ? newPosition.start.y - selectedGutter!.stablePosition.start.y
                : 0;
        setYDeltaState(realYDelta);
        let gtrs = gutters;
        gtrs[selectedGutter!.id] = {
            ...(selectedGutter as TableGutter),
            stablePosition: newPosition
        };
        onGuttersChanged(gtrs);
    };

    const isClickedNotOnGutter = (target: HTMLElement): boolean => {
        return (
            isCellMode ||
            !possiblyClickedOnTableGutter(target) ||
            !selectedGutter ||
            !Object.values(selectedGutter).length ||
            !selectedAnnotation ||
            selectedAnnotation.id !== annotation.id
        );
    };

    const findNeighbourGutter = (
        selectedGutter: TableGutter,
        direction: 'prev' | 'next'
    ): Maybe<TableGutter> => {
        let closestGutter: Maybe<TableGutter> = undefined;
        const possibleGutter = gutters[selectedGutter.id + (direction === 'next' ? 1 : -1)];
        if (possibleGutter && possibleGutter.type === selectedGutter.type)
            closestGutter = possibleGutter;
        return closestGutter;
    };

    const getRelativeGutterIndex = (): number => {
        let idx = 0;
        let prevGutter = findNeighbourGutter(selectedGutter!, 'prev');
        while (prevGutter) {
            idx = idx + 1;
            prevGutter = findNeighbourGutter(prevGutter, 'prev');
        }
        return idx;
    };

    const recalculateGutterPartsAfterMouseUp = (
        gutter: TableGutter,
        idx: number,
        delta: number
    ): GutterPart[] => {
        let newParts: GutterPart[] = gutter.parts;
        if (newParts.length > 1) {
            newParts[idx].length += delta;
            newParts[idx + 1].length -= delta;
        }
        return newParts;
    };

    const recalculatedAffectedCells = () => {
        const delta: number = selectedGutter!.type === 'vertical' ? xDeltaState : yDeltaState;
        const selector: string = selectedGutter!.type === 'vertical' ? 'col' : 'row';
        const boundSelector: 'width' | 'height' =
            selectedGutter!.type === 'vertical' ? 'width' : 'height';
        const coordSelector: 'x' | 'y' = selectedGutter!.type === 'vertical' ? 'x' : 'y';
        const relativeIdx = getRelativeGutterIndex();
        const newCells: Annotation[] = [];
        for (let cell of scaledCells) {
            const newCell: Annotation = cell;
            if (
                cell.data[selector] +
                    (cell.data[`${selector}span`] ? cell.data[`${selector}span`] - 1 : 0) ===
                relativeIdx
            ) {