Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
sequenceData = { sequence: "" },
readOnly,
updateSequenceData,
wrappedInsertSequenceDataAtPositionOrRange,
caretPositionUpdate
// handleInsert
} = this.props;
const sequenceLength = sequenceData.sequence.length;
if (readOnly) {
return window.toastr.warning("Sorry the sequence is Read-Only");
}
if (sequenceLength > 0) {
let rangeToDelete = selectionLayer;
if (caretPosition > 0) {
rangeToDelete = {
start: normalizePositionByRangeLength(
caretPosition - (sequenceData.isProtein ? 3 : 1),
sequenceLength
),
end: normalizePositionByRangeLength(
caretPosition - 1,
sequenceLength
)
};
}
const [newSeqData] = wrappedInsertSequenceDataAtPositionOrRange(
{},
sequenceData,
rangeToDelete
);
updateSequenceData(newSeqData);
caretPositionUpdate(
//no selection layer yet, so we'll start one if necessary
// 0 1 2 3 4 5 6 7 8 9
// c
// n
//
let dragEnd = {
start: caretPosition,
end: normalizePositionByRangeLength(
nearestCaretPos - 1,
sequenceLength,
true
)
};
let dragStart = {
start: nearestCaretPos,
end: normalizePositionByRangeLength(caretPosition - 1, sequenceLength, true)
};
if (caretPosition === nearestCaretPos) {
return; // do nothing because nearestCaretPos === caretPosition
} else if (
getRangeLength(dragEnd, sequenceLength) <
getRangeLength(dragStart, sequenceLength)
) {
draggingEnd = true; //the caret becomes the "selection end"
selectionLayerUpdate(dragEnd);
caretPositionOnDragStart = null;
} else {
draggingEnd = false; //the caret becomes the "selection end"
selectionLayerUpdate(dragStart);
caretPositionOnDragStart = null;
}
}
) {
selectionLayerUpdate({
start: anchorPos,
end: normalizePositionByRangeLength(
newCaretPosition - 1,
sequenceLength
),
cursorAtEnd: true
});
} else {
selectionLayerUpdate({
start: normalizePositionByRangeLength(
newCaretPosition,
sequenceLength
),
end: normalizePositionByRangeLength(anchorPos - 1, sequenceLength),
cursorAtEnd: false
});
}
}
} else {
//no shiftHeld
//handle special cases
if (moveBy === 0) {
if (type === "moveCaretRightOne") {
return caretPositionUpdate(selectionLayer.end + 1);
} else if (type === "moveCaretLeftOne") {
return caretPositionUpdate(selectionLayer.start);
} else {
throw new Error("this case should not be hit...");
}
} else if (moveBy > 0) {
function normalizeNewCaretPos(caretPosition, sequenceLength, circular) {
if (circular) {
return normalizePositionByRangeLength(caretPosition, sequenceLength, true);
} else {
return trimNumberToFitWithin0ToAnotherNumber(caretPosition, sequenceLength);
}
}
getNearestCursorPositionToMouseEvent(event, sequenceLength, callback) {
if (!event.clientX) {
return;
}
let boundingRect = this.refs.circularView.getBoundingClientRect();
//get relative click positions
let clickX = event.clientX - boundingRect.left - boundingRect.width / 2;
let clickY = event.clientY - boundingRect.top - boundingRect.height / 2;
//get angle
let angle = Math.atan2(clickY, clickX) + Math.PI / 2;
if (angle < 0) angle += Math.PI * 2; //normalize the angle if necessary
let nearestCaretPos =
sequenceLength === 0
? 0
: normalizePositionByRangeLength(
getPositionFromAngle(angle, sequenceLength, true),
sequenceLength
); //true because we're in between positions
if (this.props.sequenceData && this.props.sequenceData.isProtein) {
nearestCaretPos = Math.round(nearestCaretPos / 3) * 3;
}
callback({
event,
className: event.target.parentNode.className.animVal,
shiftHeld: event.shiftKey,
nearestCaretPos,
selectionStartGrabbed: event.target.parentNode.classList.contains(
draggableClassnames.selectionStart
),
selectionEndGrabbed: event.target.parentNode.classList.contains(
draggableClassnames.selectionEnd
{map(replacementLayers, function(replacementLayer) {
if (!replacementLayer) return null;
let atCaret = replacementLayer.caretPosition > -1;
let normedCaretPos;
if (atCaret) {
normedCaretPos = normalizePositionByRangeLength(
replacementLayer.caretPosition,
sequenceLength
);
}
let insertedBpsLayer = {
...replacementLayer,
start: atCaret ? normedCaretPos : replacementLayer.start,
end:
(atCaret ? normedCaretPos : replacementLayer.start) +
replacementLayer.sequence.length
};
let { sequence } = insertedBpsLayer;
let layerRangeOverlaps = getOverlapsOfPotentiallyCircularRanges(
insertedBpsLayer,
row,
sequenceLength
(tickMarkPosition +
(getGaps ? getGaps(tickMarkPosition).gapsBefore : 0)) *
charWidth +
charWidth / 2;
let yStart = 0;
let yEnd = annotationHeight / 3;
tickMarkSVG.push(
export function normalizeNewCaretPos(caretPosition, sequenceLength, circular) {
if (circular) {
return normalizePositionByRangeLength(caretPosition, sequenceLength, true);
} else {
return trimNumberToFitWithin0ToAnotherNumber(caretPosition, sequenceLength);
}
}