Skip to content

Commit 8af7812

Browse files
Xingyan/fix code review (#1919)
* fix(CodeReview): 修复某些场景返回的行号列表与实际选中的行号列表不一致的问题 --------- Co-authored-by: TongxinXie <gin199413@163.com>
1 parent aedd851 commit 8af7812

File tree

4 files changed

+54
-36
lines changed

4 files changed

+54
-36
lines changed

packages/devui-vue/devui/code-review/src/composables/use-code-review-comment.ts

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
export function useCodeReviewComment(reviewContentRef: Ref<HTMLElement>, props: CodeReviewProps, ctx: SetupContext) {
1515
const { outputFormat, allowComment, allowChecked } = toRefs(props);
1616
const ns = useNamespace('code-review');
17-
const { onMousedown } = useCodeReviewLineSelection(reviewContentRef, props, updateLineNumbers, afterCheckLines);
17+
const { onMousedown } = useCodeReviewLineSelection(reviewContentRef, props, afterMouseup);
1818
const commentLeft = ref(-100);
1919
const commentTop = ref(-100);
2020
let currentLeftLineNumber = -1;
@@ -117,26 +117,6 @@ export function useCodeReviewComment(reviewContentRef: Ref<HTMLElement>, props:
117117
resetLeftTop();
118118
}
119119
};
120-
// 获代码行 取值方法
121-
const getLineNumbers = (currentNumber: number, currentNumbers: Array<number>, moveDirection: 'up' | 'down') => {
122-
if (currentNumber === -1) {
123-
// 当前行没数据不代表之前选中的没数据,此时返回原来的
124-
return currentNumbers;
125-
}
126-
if (currentNumbers.length === 0) {
127-
return [currentNumber];
128-
}
129-
const numbers = [...currentNumbers];
130-
let max = Math.max(...numbers);
131-
let min = Math.min(...numbers);
132-
if (moveDirection === 'down') {
133-
max = currentNumber;
134-
}
135-
if (moveDirection === 'up') {
136-
min = currentNumber;
137-
}
138-
return Array.from({ length: max - min + 1 }, (_, i) => i + min);
139-
};
140120
// 获取一些公共类和判断
141121
const getCommonClassAndJudge = () => {
142122
const checkedLine = [currentLeftLineNumbers, currentRightLineNumbers];
@@ -211,13 +191,9 @@ export function useCodeReviewComment(reviewContentRef: Ref<HTMLElement>, props:
211191
}
212192
getDoubleCheckedLineCode(shouldRenderClass);
213193
}
214-
function updateLineNumbers(moveDirection: 'up' | 'down') {
215-
currentLeftLineNumbers =
216-
currentLeftLineNumber === -1 ? currentLeftLineNumbers : getLineNumbers(currentLeftLineNumber, currentLeftLineNumbers, moveDirection);
217-
currentRightLineNumbers =
218-
currentRightLineNumber === -1
219-
? currentRightLineNumbers
220-
: getLineNumbers(currentRightLineNumber, currentRightLineNumbers, moveDirection);
194+
function updateLineNumbers({ lefts, rights }: { lefts: number[]; rights: number[] }) {
195+
currentLeftLineNumbers = lefts;
196+
currentRightLineNumbers = rights;
221197
getCheckedLineCode(false);
222198
afterCheckLinesEmitData = {
223199
left: currentLeftLineNumber,
@@ -230,6 +206,8 @@ export function useCodeReviewComment(reviewContentRef: Ref<HTMLElement>, props:
230206
};
231207
}
232208
const updateCheckedLineClass = () => {
209+
const lineClassName = props.outputFormat === 'line-by-line' ? '.d2h-code-linenumber' : '.d2h-code-side-linenumber';
210+
allTrNodes = reviewContentRef.value.querySelectorAll(lineClassName);
233211
getCheckedLineCode(true);
234212
};
235213
// 还原样式
@@ -280,6 +258,10 @@ export function useCodeReviewComment(reviewContentRef: Ref<HTMLElement>, props:
280258
function afterCheckLines() {
281259
ctx.emit('afterCheckLines', afterCheckLinesEmitData);
282260
}
261+
function afterMouseup(lineNumbers: { lefts: number[]; rights: number[] }) {
262+
updateLineNumbers(lineNumbers);
263+
afterCheckLines();
264+
}
283265
// 图标或者单行的点击
284266
const onCommentIconClick = (e: Event) => {
285267
if (e) {

packages/devui-vue/devui/code-review/src/composables/use-code-review-line-selection.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import type { Ref } from 'vue';
22
import type { CodeReviewProps } from '../code-review-types';
33
import { useNamespace } from '../../../shared/hooks/use-namespace';
4-
import { findParentTrNode } from '../utils';
4+
import { findParentTrNode, getLineNumbers } from '../utils';
55

66
export function useCodeReviewLineSelection(
77
reviewContentRef: Ref<HTMLElement>,
88
props: CodeReviewProps,
9-
mouseMoveCb: (moveDirection: 'up' | 'down') => void,
10-
mouseupCb: () => void
9+
afterMouseup: (lineNumbers: { lefts: number[]; rights: number[] }) => void
1110
) {
1211
const ns = useNamespace('code-review');
1312
let dragging = false;
@@ -16,7 +15,7 @@ export function useCodeReviewLineSelection(
1615
let isClickedLeft: boolean | undefined;
1716
let shouldClear: boolean;
1817
let isMouseMoved: boolean;
19-
let startClientY: number;
18+
let checkedTrNodes: HTMLElement[] = [];
2019

2120
const onMousedown = (e: MouseEvent) => {
2221
// 鼠标左键按下
@@ -45,7 +44,6 @@ export function useCodeReviewLineSelection(
4544
dragging = true;
4645
shouldClear = true;
4746
isMouseMoved = false;
48-
startClientY = e.clientY;
4947
e.preventDefault();
5048
e.stopPropagation();
5149
document.addEventListener('mousemove', onMousemove);
@@ -76,7 +74,6 @@ export function useCodeReviewLineSelection(
7674
if (endIndex === -1) {
7775
return;
7876
}
79-
mouseMoveCb(e.clientY > startClientY ? 'down' : 'up');
8077
if (startIndex > endIndex) {
8178
[startIndex, endIndex] = [endIndex, startIndex];
8279
}
@@ -89,9 +86,11 @@ export function useCodeReviewLineSelection(
8986
} else {
9087
position = 'right';
9188
}
89+
checkedTrNodes = [];
9290
for (let i = 0; i < trNodes.length; i++) {
9391
if (i >= startIndex && i <= endIndex) {
9492
toggleCommentCheckedClass(trNodes[i], true, position);
93+
checkedTrNodes.push(trNodes[i]);
9594
} else {
9695
toggleCommentCheckedClass(trNodes[i], false, position);
9796
}
@@ -101,7 +100,7 @@ export function useCodeReviewLineSelection(
101100
function onMouseup() {
102101
dragging = false;
103102
if (isMouseMoved) {
104-
mouseupCb();
103+
afterMouseup(getLineNumbers(checkedTrNodes, props.outputFormat, isClickedLeft ? 'left' : 'right'));
105104
}
106105
document.removeEventListener('mouseup', onMouseup);
107106
document.removeEventListener('mousemove', onMousemove);

packages/devui-vue/devui/code-review/src/utils.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,3 +528,40 @@ export function findParentTrNode(node: HTMLElement | null) {
528528
}
529529
return findParentTrNode(node.parentElement);
530530
}
531+
532+
/* 根据最大最小行号,获取从小到大的完整行号列表 */
533+
function getFullNumberList(min: number, max: number) {
534+
return Array.from({ length: max - min + 1 }, (_, i) => i + min);
535+
}
536+
537+
/* 多行选中,返回选中行的左右侧行号 */
538+
export function getLineNumbers(trNodes: HTMLElement[], outputFormat: OutputFormat, side: LineSide) {
539+
const leftNumbers: number[] = [];
540+
const rightNumbers: number[] = [];
541+
542+
for (let i = 0; i < trNodes.length; i++) {
543+
const itemTrNode = trNodes[i];
544+
if (outputFormat === 'line-by-line') {
545+
const lineNumberTdNode = Array.from(itemTrNode.children)[0] as HTMLElement;
546+
const leftLineNumber = parseInt((lineNumberTdNode.children[0] as HTMLElement)?.innerText);
547+
const rightLineNumber = parseInt((lineNumberTdNode.children[1] as HTMLElement)?.innerText);
548+
549+
leftLineNumber && leftNumbers.push(leftLineNumber);
550+
rightLineNumber && rightNumbers.push(leftLineNumber);
551+
} else {
552+
const tdNodes = Array.from(itemTrNode.children) as HTMLElement[];
553+
const lineNumberTdNode: HTMLElement = tdNodes[side === 'left' ? 0 : 2];
554+
if (lineNumberTdNode && notEmptyNode(lineNumberTdNode)) {
555+
const lineNumber = parseInt(lineNumberTdNode.innerText);
556+
if (lineNumber) {
557+
side === 'left' ? leftNumbers.push(lineNumber) : rightNumbers.push(lineNumber);
558+
}
559+
}
560+
}
561+
}
562+
563+
const lefts = leftNumbers.length ? getFullNumberList(leftNumbers[0], leftNumbers[leftNumbers.length - 1]) : leftNumbers;
564+
const rights = rightNumbers.length ? getFullNumberList(rightNumbers[0], rightNumbers[rightNumbers.length - 1]) : rightNumbers;
565+
566+
return { lefts, rights };
567+
}

packages/devui-vue/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "vue-devui",
3-
"version": "1.6.25",
3+
"version": "1.6.26",
44
"license": "MIT",
55
"description": "DevUI components based on Vite and Vue3",
66
"keywords": [

0 commit comments

Comments
 (0)