feat(功能用例): 用例评审脑图查看雏形

This commit is contained in:
teukkk 2024-07-02 19:42:03 +08:00 committed by Craftsman
parent abde8da1b1
commit 4e2cac42d7
23 changed files with 908 additions and 237 deletions

View File

@ -1,3 +1,5 @@
import type { MinderJsonNode } from '@/components/pure/ms-minder-editor/props';
import MSR from '@/api/http/index';
import {
AddReviewModuleUrl,
@ -15,6 +17,7 @@ import {
GetAssociatedIdsUrl,
getCaseReviewerListUrl,
GetCaseReviewHistoryListUrl,
GetCaseReviewMinderUrl,
GetReviewDetailCasePageUrl,
GetReviewDetailModuleCountUrl,
GetReviewDetailModuleTreeUrl,
@ -38,6 +41,7 @@ import {
BatchMoveReviewParams,
BatchReviewCaseParams,
CaseReviewFunctionalCaseUserItem,
CaseReviewMinderParams,
CommitReviewResultParams,
CopyReviewParams,
CopyReviewResponse,
@ -202,3 +206,8 @@ export const saveCaseReviewResult = (data: CommitReviewResultParams) => {
export const getCaseReviewerList = (reviewId: string, caseId: string) => {
return MSR.get<CaseReviewFunctionalCaseUserItem[]>({ url: `${getCaseReviewerListUrl}/${reviewId}/${caseId}` });
};
// 获取脑图
export function getCaseReviewMinder(data: CaseReviewMinderParams) {
return MSR.post<CommonList<MinderJsonNode>>({ url: `${GetCaseReviewMinderUrl}`, data });
}

View File

@ -27,3 +27,4 @@ export const GetReviewDetailModuleTreeUrl = '/case/review/detail/tree'; // 评
export const GetCaseReviewHistoryListUrl = '/review/functional/case/get/list'; // 评审详情-获取用例评审历史
export const SaveCaseReviewResultUrl = '/review/functional/case/save'; // 评审详情-提交评审
export const getCaseReviewerListUrl = '/case/review/detail/reviewer/list'; // 评审详情-获取用例的评审人
export const GetCaseReviewMinderUrl = '/functional/mind/case/review/list'; // 获取脑图数据

View File

@ -1,7 +1,7 @@
@font-face {
font-family: iconfont; /* Project id 3462279 */
src: url('iconfont.woff2?t=1719382977144') format('woff2'), url('iconfont.woff?t=1719382977144') format('woff'),
url('iconfont.ttf?t=1719382977144') format('truetype'), url('iconfont.svg?t=1719382977144#iconfont') format('svg');
src: url('iconfont.woff2?t=1719821100136') format('woff2'), url('iconfont.woff?t=1719821100136') format('woff'),
url('iconfont.ttf?t=1719821100136') format('truetype'), url('iconfont.svg?t=1719821100136#iconfont') format('svg');
}
.iconfont {
font-size: 16px;
@ -10,6 +10,21 @@
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-icon_right_branch::before {
content: '\e7ef';
}
.icon-icon_lower_branch1::before {
content: '\e7f0';
}
.icon-icon_left_and_right_branch::before {
content: '\e7ed';
}
.icon-icon_left_branch::before {
content: '\e7ee';
}
.icon-icon_structure::before {
content: '\e7ec';
}
.icon-icon_visible_outlined1::before {
content: '\e7eb';
}
@ -559,7 +574,7 @@
.icon-icon_repositioning_outlined::before {
content: '\e730';
}
.icon-icon_operation-analysis_outlined1::before {
.icon-icon_screen_outlined::before {
content: '\e731';
}
.icon-icon_right-align_outlined::before {
@ -946,18 +961,12 @@
.icon-icon_resubmit_filled::before {
content: '\e6ef';
}
.icon-icon_switch_outlined1::before {
content: '\e6f0';
}
.icon-icon_test-tracking_filled::before {
content: '\e6f1';
}
.icon-icon_add-comment_outlined::before {
content: '\e6f2';
}
.icon-icon_sort_outlined2::before {
content: '\e6f3';
}
.icon-icon_setting_filled::before {
content: '\e6f5';
}
@ -1120,9 +1129,6 @@
.icon-icon_organization_outlined::before {
content: '\e6aa';
}
.icon-icon_sort_outlined1::before {
content: '\e6ab';
}
.icon-icon_share-label_filled::before {
content: '\e6ac';
}
@ -1249,15 +1255,6 @@
.icon-icon_bottom-align_outlined::before {
content: '\e659';
}
.icon-icon_admin_outlined::before {
content: '\e65a';
}
.icon-icon_expand-right_filled::before {
content: '\e65b';
}
.icon-icon_delete-trash_outlined::before {
content: '\e65c';
}
.icon-icon_sort_outlined::before {
content: '\e65d';
}

File diff suppressed because one or more lines are too long

View File

@ -5,6 +5,41 @@
"css_prefix_text": "icon-",
"description": "DE、MS项目icon管理",
"glyphs": [
{
"icon_id": "40886382",
"name": "icon_right_branch",
"font_class": "icon_right_branch",
"unicode": "e7ef",
"unicode_decimal": 59375
},
{
"icon_id": "40886381",
"name": "icon_lower_branch",
"font_class": "icon_lower_branch1",
"unicode": "e7f0",
"unicode_decimal": 59376
},
{
"icon_id": "40886384",
"name": "icon_left_and_right_branch",
"font_class": "icon_left_and_right_branch",
"unicode": "e7ed",
"unicode_decimal": 59373
},
{
"icon_id": "40886383",
"name": "icon_left_branch",
"font_class": "icon_left_branch",
"unicode": "e7ee",
"unicode_decimal": 59374
},
{
"icon_id": "40885431",
"name": "icon_structure",
"font_class": "icon_structure",
"unicode": "e7ec",
"unicode_decimal": 59372
},
{
"icon_id": "40877565",
"name": "icon_visible_outlined",
@ -1288,8 +1323,8 @@
},
{
"icon_id": "36471613",
"name": "icon_operation-analysis_outlined",
"font_class": "icon_operation-analysis_outlined1",
"name": "icon_screen_outlined",
"font_class": "icon_screen_outlined",
"unicode": "e731",
"unicode_decimal": 59185
},
@ -2189,13 +2224,6 @@
"unicode": "e6ef",
"unicode_decimal": 59119
},
{
"icon_id": "33794385",
"name": "icon_switch_outlined",
"font_class": "icon_switch_outlined1",
"unicode": "e6f0",
"unicode_decimal": 59120
},
{
"icon_id": "33794386",
"name": "icon_test-tracking_filled",
@ -2210,13 +2238,6 @@
"unicode": "e6f2",
"unicode_decimal": 59122
},
{
"icon_id": "33794388",
"name": "icon_sort_outlined",
"font_class": "icon_sort_outlined2",
"unicode": "e6f3",
"unicode_decimal": 59123
},
{
"icon_id": "33794390",
"name": "icon_setting_filled",
@ -2595,13 +2616,6 @@
"unicode": "e6aa",
"unicode_decimal": 59050
},
{
"icon_id": "32849857",
"name": "icon_sort_outlined",
"font_class": "icon_sort_outlined1",
"unicode": "e6ab",
"unicode_decimal": 59051
},
{
"icon_id": "32849858",
"name": "icon_share-label_outlined-1",
@ -2896,27 +2910,6 @@
"unicode": "e659",
"unicode_decimal": 58969
},
{
"icon_id": "32849503",
"name": "icon_admin_outlined",
"font_class": "icon_admin_outlined",
"unicode": "e65a",
"unicode_decimal": 58970
},
{
"icon_id": "32849510",
"name": "icon_expand-right_filled",
"font_class": "icon_expand-right_filled",
"unicode": "e65b",
"unicode_decimal": 58971
},
{
"icon_id": "32849513",
"name": "icon_delete-trash_outlined",
"font_class": "icon_delete-trash_outlined",
"unicode": "e65c",
"unicode_decimal": 58972
},
{
"icon_id": "32849573",
"name": "icon_sort_outlined",

View File

@ -14,6 +14,16 @@
/>
<missing-glyph />
<glyph glyph-name="icon_right_branch" unicode="&#59375;" d="M469.333333 757.12a42.666667 42.666667 0 0 0 0-85.333333h-1.408c-24.32 0-39.466667-1.578667-55.594666-7.594667-23.893333-8.832-40.192-25.6-48.64-56.874667l-1.962667-8.106666C348.458667 536.32 313.173333 468.565333 273.365333 416H469.333333a42.666667 42.666667 0 0 0 0-85.333333l-196.010666 0.042666c36.992-48.810667 70.058667-110.72 85.248-169.642666l3.157333-13.568c7.765333-36.565333 24.746667-55.509333 50.645333-65.194667 14.208-5.290667 27.648-7.168 47.061334-7.552l9.898666-0.085333a42.666667 42.666667 0 0 0 4.992-85.034667l-6.144-0.298667c-33.792 0-57.258667 2.432-85.589333 13.013334-49.792 18.56-86.186667 57.088-101.802667 116.736l-2.56 10.752c-11.733333 55.509333-47.317333 118.613333-82.602666 161.92a85.333333 85.333333 0 1 0 0 163.2c32.768 40.192 65.792 97.450667 79.786666 149.888l2.858667 11.989333C292.181333 682.666667 329.898667 724.650667 382.634667 744.234667c24.746667 9.130667 45.653333 12.16 73.130666 12.757333L469.333333 757.12z m426.666667-341.12a42.666667 42.666667 0 0 0 0-85.333333h-256a42.666667 42.666667 0 0 0 0 85.333333h256z m0 341.333333a42.666667 42.666667 0 0 0 0-85.333333h-256a42.666667 42.666667 0 0 0 0 85.333333h256z m0-682.666666a42.666667 42.666667 0 0 0 0-85.333334h-256a42.666667 42.666667 0 0 0 0 85.333334h256z" horiz-adv-x="1024" />
<glyph glyph-name="icon_lower_branch1" unicode="&#59376;" d="M256 85.333333a42.666667 42.666667 0 0 0 0-85.333333H128a42.666667 42.666667 0 0 0 0 85.333333h128z m640 0a42.666667 42.666667 0 0 0 0-85.333333h-128a42.666667 42.666667 0 0 0 0 85.333333h128z m-298.666667 0a42.666667 42.666667 0 0 0 0-85.333333h-128a42.666667 42.666667 0 0 0 0 85.333333h128z m-341.333333 170.666667a42.666667 42.666667 0 0 0 0-85.333333H128a42.666667 42.666667 0 0 0 0 85.333333h128z m640 0a42.666667 42.666667 0 0 0 0-85.333333h-128a42.666667 42.666667 0 0 0 0 85.333333h128z m-298.666667 0a42.666667 42.666667 0 0 0 0-85.333333h-128a42.666667 42.666667 0 0 0 0 85.333333h128zM533.333333 810.666667c44.8 0 81.066667-38.186667 81.066667-85.333334 0-9.6-1.493333-18.773333-4.266667-27.392 38.997333-36.778667 94.336-73.258667 144.170667-87.04l9.088-2.304c103.338667-23.04 175.786667-111.872 175.274667-182.272-0.170667-23.552-18.474667-42.496-40.874667-42.325333-20.778667 0.170667-37.76 16.810667-39.978667 38.016l-0.213333 4.992c0.213333 27.392-40.533333 78.549333-102.4 95.957333l-8.576 2.133334c-59.392 13.226667-122.922667 50.688-172.714667 93.226666L573.866667 426.666667c0-23.552-18.133333-42.666667-40.533334-42.666667-22.4 0-40.533333 19.114667-40.533333 42.666667l0.042667 191.701333c-46.250667-39.509333-104.405333-74.666667-160-90.026667l-12.8-3.242666c-63.701333-14.165333-107.093333-64.64-110.72-94.506667L209.066667 426.666667c0-23.552-18.133333-42.666667-40.533334-42.666667-22.4 0-40.533333 19.114667-40.533333 42.666667 0 68.181333 67.456 153.258667 165.376 179.498666l9.856 2.432c52.096 11.605333 111.914667 50.346667 153.429333 89.344A85.973333 85.973333 0 0 0 452.266667 725.333333c0 47.146667 36.266667 85.333333 81.066666 85.333334z" horiz-adv-x="1024" />
<glyph glyph-name="icon_left_and_right_branch" unicode="&#59373;" d="M728.618667 768c21.76 0 39.381333-19.114667 39.381333-42.666667s-17.621333-42.666667-39.381333-42.666666l-5.674667-0.042667c-10.453333-0.213333-15.786667-1.109333-20.992-3.456-13.738667-6.272-25.514667-25.002667-33.408-69.802667l-3.2-18.773333-12.629333-80.981333c-5.12-32.64-9.856-58.794667-15.104-80.042667l1.706666-2.944L728.618667 426.666667c21.76 0 39.381333-19.114667 39.381333-42.666667s-17.621333-42.666667-39.381333-42.666667h-89.301334l-1.706666-2.986666-0.725334 2.986666c4.138667-16.298667 7.936-35.584 11.861334-58.624l5.973333-37.12 9.002667-58.154666 3.242666-19.541334 1.578667-9.258666c7.893333-44.8 19.626667-63.573333 33.408-69.802667 6.101333-2.773333 12.330667-3.498667 26.666667-3.498667 21.76 0 39.381333-19.114667 39.381333-42.666666s-17.621333-42.666667-39.381333-42.666667l-8.661334 0.085333c-19.2 0.426667-32.170667 2.688-48.426666 10.026667-40.789333 18.517333-67.925333 61.824-80.341334 132.565333l-5.034666 29.952-11.093334 71.381334-3.328 20.224-3.413333 18.986666c-0.554667 2.944-1.109333 5.802667-1.706667 8.533334l4.48 6.912A76.16 76.16 0 0 0 512 327.594667c-13.226667-16.256-32-27.008-53.205333-28.714667l-1.536-7.552c-1.109333-5.546667-2.218667-11.477333-3.370667-17.834667l-6.144-37.034666-9.898667-63.829334-3.370666-20.309333-1.664-9.642667c-12.416-70.741333-39.552-114.048-80.341334-132.565333-18.602667-8.405333-32.853333-10.112-57.088-10.112l-4.608 0.298667C271.189333 2.730667 256 20.778667 256 42.666667c0 23.552 17.621333 42.666667 39.381333 42.666666l5.674667 0.042667c10.453333 0.213333 15.786667 1.109333 20.992 3.456 13.738667 6.272 25.514667 25.002667 33.408 69.802667l3.2 18.773333 12.629333 80.981333c5.12 32.597333 9.856 58.752 15.104 80L384.682667 341.333333H295.381333C273.621333 341.333333 256 360.448 256 384s17.621333 42.666667 39.381333 42.666667h89.301334l1.706666 2.986666 0.768-3.072a755.626667 755.626667 0 0 0-11.904 58.709334l-5.973333 37.12-9.002667 58.154666-3.242666 19.541334a1813.888 1813.888 0 0 1-1.578667 9.258666c-7.893333 44.8-19.626667 63.573333-33.408 69.802667C315.946667 681.941333 309.717333 682.666667 295.381333 682.666667 273.621333 682.666667 256 701.781333 256 725.333333s17.621333 42.666667 39.381333 42.666667l8.661334-0.085333c19.2-0.426667 32.170667-2.688 48.426666-10.026667 40.789333-18.517333 67.925333-61.824 80.341334-132.565333l5.034666-29.952 11.093334-71.381334 3.328-20.224 3.413333-18.986666c0.554667-2.944 1.109333-5.802667 1.706667-8.533334l-4.48-6.912c23.552 0 44.672-11.178667 59.093333-28.928 13.226667 16.256 32 27.008 53.205333 28.714667l1.536 7.552c1.109333 5.546667 2.218667 11.477333 3.370667 17.834667l6.144 37.034666 9.898667 63.829334 3.370666 20.309333 1.664 9.642667c12.416 70.741333 39.552 114.048 80.341334 132.565333 18.602667 8.405333 32.853333 10.112 57.088 10.112zM170.666667 85.333333a42.666667 42.666667 0 0 0 0-85.333333H128a42.666667 42.666667 0 0 0 0 85.333333h42.666667z m725.333333 0a42.666667 42.666667 0 0 0 0-85.333333h-42.666667a42.666667 42.666667 0 0 0 0 85.333333h42.666667zM170.666667 426.666667a42.666667 42.666667 0 0 0 0-85.333334H128a42.666667 42.666667 0 0 0 0 85.333334h42.666667z m725.333333 0a42.666667 42.666667 0 0 0 0-85.333334h-42.666667a42.666667 42.666667 0 0 0 0 85.333334h42.666667zM170.666667 768a42.666667 42.666667 0 1 0 0-85.333333H128a42.666667 42.666667 0 1 0 0 85.333333h42.666667z m725.333333 0a42.666667 42.666667 0 0 0 0-85.333333h-42.666667a42.666667 42.666667 0 0 0 0 85.333333h42.666667z" horiz-adv-x="1024" />
<glyph glyph-name="icon_left_branch" unicode="&#59374;" d="M554.666667 757.12a42.666667 42.666667 0 0 1 0-85.333333h1.408c24.32 0 39.466667-1.578667 55.594666-7.594667 23.893333-8.832 40.192-25.6 48.64-56.874667l1.962667-8.106666c13.269333-62.890667 48.554667-130.602667 88.362667-183.210667H554.666667a42.666667 42.666667 0 0 1 0-85.333333l196.010666 0.042666c-36.992-48.810667-70.058667-110.72-85.248-169.642666l-3.157333-13.568c-7.765333-36.565333-24.746667-55.509333-50.645333-65.194667-14.208-5.290667-27.648-7.168-47.061334-7.552L554.666667 74.666667a42.666667 42.666667 0 0 1-4.992-85.034667l6.144-0.298667c33.792 0 57.258667 2.432 85.589333 13.013334 49.792 18.56 86.186667 57.088 101.802667 116.736l2.56 10.752c11.733333 55.509333 47.317333 118.613333 82.602666 161.92a85.333333 85.333333 0 1 1 0 163.2c-32.768 40.192-65.792 97.450667-79.786666 149.888l-2.858667 11.989333c-13.909333 65.834667-51.626667 107.818667-104.362667 127.402667-24.746667 9.130667-45.653333 12.16-73.130666 12.757333L554.666667 757.12zM128 416a42.666667 42.666667 0 0 1 0-85.333333h256a42.666667 42.666667 0 0 1 0 85.333333H128z m0 341.333333a42.666667 42.666667 0 0 1 0-85.333333h256a42.666667 42.666667 0 0 1 0 85.333333H128z m0-682.666666a42.666667 42.666667 0 0 1 0-85.333334h256a42.666667 42.666667 0 0 1 0 85.333334H128z" horiz-adv-x="1024" />
<glyph glyph-name="icon_structure" unicode="&#59372;" d="M980.906667 731.306667a42.666667 42.666667 0 0 0-36.266667-48.213334c-78.677333-11.093333-189.44-68.864-291.712-166.698666A701.141333 701.141333 0 0 0 535.850667 426.666667L938.666667 426.666667a42.666667 42.666667 0 0 0 0-85.333334H511.317333a882.474667 882.474667 0 0 0 132.053334-104.576c92.586667-88.533333 217.6-146.090667 298.154666-151.509333a42.666667 42.666667 0 0 0-5.717333-85.162667c-100.992 6.826667-244.693333 72.96-351.402667 174.976-101.162667 96.725333-210.56 154.282667-289.109333 166.314667L85.333333 341.333333a42.666667 42.666667 0 0 0 0 85.333334h211.370667l8.96 0.810666c80.64 9.173333 199.424 65.621333 288.298667 150.613334 114.645333 109.610667 241.450667 175.786667 338.773333 189.482666a42.666667 42.666667 0 0 0 48.213333-36.266666z" horiz-adv-x="1024" />
<glyph glyph-name="icon_visible_outlined1" unicode="&#59371;" d="M509.632 106.688c137.728 0 265.216 87.872 383.36 277.888-115.136 189.312-242.304 276.8-383.36 276.8-140.992 0-267.712-87.424-382.08-276.8 117.44-190.08 244.48-277.888 382.08-277.888zM63.872 346.048a76.288 76.288 0 0 0 0.96 78.4c123.52 214.848 271.744 322.24 444.8 322.24 173.76 0 322.88-108.288 447.488-324.864l1.152-2.048c12.608-22.144 12.544-49.472-0.384-71.424-127.872-217.984-277.312-327.04-448.256-327.04-170.432 0-318.976 108.288-445.76 324.736z m446.4-132.672A170.368 170.368 0 0 0 340.224 384a170.368 170.368 0 0 0 170.048 170.688A170.368 170.368 0 0 0 680.384 384a170.368 170.368 0 0 0-170.112-170.624z m0 85.312c46.976 0 85.12 38.208 85.12 85.312 0 47.168-38.144 85.376-85.12 85.376-46.976 0-85.056-38.208-85.056-85.376 0-47.104 38.08-85.312 85.12-85.312z" horiz-adv-x="1024" />
<glyph glyph-name="icon_test_set1" unicode="&#59370;" d="M128 682.666667a42.666667 42.666667 0 0 0 42.666667-42.666667v-597.333333h640a42.666667 42.666667 0 0 0 0-85.333334H128a42.666667 42.666667 0 0 0-42.666667 42.666667V640a42.666667 42.666667 0 0 0 42.666667 42.666667z m768 170.666666a42.666667 42.666667 0 0 0 42.666667-42.666666v-640a42.666667 42.666667 0 0 0-42.666667-42.666667H298.666667a42.666667 42.666667 0 0 0-42.666667 42.666667V810.666667a42.666667 42.666667 0 0 0 42.666667 42.666666h597.333333z m-42.666667-85.333333H341.333333v-554.666667h512V768z m-128-341.333333a42.666667 42.666667 0 0 0 0-85.333334h-298.666666a42.666667 42.666667 0 0 0 0 85.333334h298.666666z m-128 170.666666a42.666667 42.666667 0 0 0 0-85.333333h-170.666666a42.666667 42.666667 0 1 0 0 85.333333h170.666666z" horiz-adv-x="1024" />
@ -380,7 +390,7 @@
<glyph glyph-name="icon_repositioning_outlined" unicode="&#59184;" d="M128 810.666667h192a21.333333 21.333333 0 0 0 21.333333-21.333334v-42.666666a21.333333 21.333333 0 0 0-21.333333-21.333334H170.666667v-149.333333a21.333333 21.333333 0 0 0-21.333334-21.333333h-42.666666a21.333333 21.333333 0 0 0-21.333334 21.333333V768a42.666667 42.666667 0 0 0 42.666667 42.666667z m768-853.333334h-192a21.333333 21.333333 0 0 0-21.333333 21.333334v42.666666a21.333333 21.333333 0 0 0 21.333333 21.333334H853.333333v149.333333a21.333333 21.333333 0 0 0 21.333334 21.333333h42.666666a21.333333 21.333333 0 0 0 21.333334-21.333333V0a42.666667 42.666667 0 0 0-42.666667-42.666667zM85.333333 0v192a21.333333 21.333333 0 0 0 21.333334 21.333333h42.666666a21.333333 21.333333 0 0 0 21.333334-21.333333V42.666667h149.333333a21.333333 21.333333 0 0 0 21.333333-21.333334v-42.666666a21.333333 21.333333 0 0 0-21.333333-21.333334H128a42.666667 42.666667 0 0 0-42.666667 42.666667zM938.666667 768v-192a21.333333 21.333333 0 0 0-21.333334-21.333333h-42.666666a21.333333 21.333333 0 0 0-21.333334 21.333333V725.333333h-149.333333a21.333333 21.333333 0 0 0-21.333333 21.333334v42.666666a21.333333 21.333333 0 0 0 21.333333 21.333334H896a42.666667 42.666667 0 0 0 42.666667-42.666667zM512 384m-170.666667 0a170.666667 170.666667 0 1 1 341.333334 0 170.666667 170.666667 0 1 1-341.333334 0Z" horiz-adv-x="1024" />
<glyph glyph-name="icon_operation-analysis_outlined1" unicode="&#59185;" d="M170.666667 725.333333v-512h682.666666V725.333333H170.666667zM85.333333 768c0 23.594667 19.2 42.666667 42.666667 42.666667h768c23.466667 0 42.666667-19.072 42.666667-42.666667v-597.333333c0-23.552-19.2-42.666667-42.666667-42.666667H128c-23.466667 0-42.666667 19.114667-42.666667 42.666667V768zM658.688 606.1653329999999l60.330667-60.330666-202.026667-202.026667-98.517333 98.517333-68.309334-68.394666-60.330666 60.373333 128.64 128.682667 98.517333-98.517334 141.696 141.696zM725.333333 42.66666699999996H298.666667v-85.333334h426.666666v85.333334z" horiz-adv-x="1024" />
<glyph glyph-name="icon_screen_outlined" unicode="&#59185;" d="M170.666667 725.333333v-512h682.666666V725.333333H170.666667zM85.333333 768c0 23.594667 19.2 42.666667 42.666667 42.666667h768c23.466667 0 42.666667-19.072 42.666667-42.666667v-597.333333c0-23.552-19.2-42.666667-42.666667-42.666667H128c-23.466667 0-42.666667 19.114667-42.666667 42.666667V768zM658.688 606.1653329999999l60.330667-60.330666-202.026667-202.026667-98.517333 98.517333-68.309334-68.394666-60.330666 60.373333 128.64 128.682667 98.517333-98.517334 141.696 141.696zM725.333333 42.66666699999996H298.666667v-85.333334h426.666666v85.333334z" horiz-adv-x="1024" />
<glyph glyph-name="icon_right-align_outlined" unicode="&#59186;" d="M917.333333 0a21.333333 21.333333 0 0 0-21.333333-21.333333h-42.666667a21.333333 21.333333 0 0 0-21.333333 21.333333V810.666667a21.333333 21.333333 0 0 0 21.333333 21.333333h42.666667a21.333333 21.333333 0 0 0 21.333333-21.333333v-810.666667zM428.970667 157.525333l205.141333 205.141334H129.408a22.741333 22.741333 0 0 0-22.741333 22.784v39.808c0 12.544 10.197333 22.741333 22.741333 22.741333h505.728l-206.165333 206.165333a22.741333 22.741333 0 0 0 0 32.170667l28.16 28.16a22.741333 22.741333 0 0 0 32.170666 0l289.621334-289.621333a22.741333 22.741333 0 0 0 6.485333-19.029334 22.741333 22.741333 0 0 0-6.485333-19.072l-289.621334-289.621333a22.741333 22.741333 0 0 0-32.170666 0l-28.16 28.16a22.741333 22.741333 0 0 0 0 32.213333z" horiz-adv-x="1024" />
@ -638,14 +648,10 @@
<glyph glyph-name="icon_resubmit_filled" unicode="&#59119;" d="M512-85.33333300000004c259.2 0 469.333333 210.133333 469.333333 469.333333S771.2 853.333333 512 853.333333 42.666667 643.2 42.666667 384s210.133333-469.333333 469.333333-469.333333z m256 469.333333a256 256 0 1 0-512 0 256 256 0 0 0 512 0z m-256-170.666667a170.666667 170.666667 0 1 1 0 341.333334 170.666667 170.666667 0 0 1 0-341.333334z" horiz-adv-x="1024" />
<glyph glyph-name="icon_switch_outlined1" unicode="&#59120;" d="M106.666667 537.045333a21.333333 21.333333 0 0 1 21.333333-21.333333h778.666667c38.570667 0 57.344 47.104 29.354666 73.642667l-218.154666 206.634666a21.333333 21.333333 0 0 1-30.165334-0.810666l-29.525333-31.146667a21.333333 21.333333 0 0 1 0.597333-29.994667l140.8-136.789333H128a21.333333 21.333333 0 0 1-21.333333-21.333333v-38.869334zM117.333333 256c-38.570667 0-57.344-47.104-29.354666-73.642667l218.154666-206.677333a21.333333 21.333333 0 0 1 30.165334 0.853333l29.354666 30.933334a21.333333 21.333333 0 0 1-0.853333 30.165333L224.426667 170.666667H896a21.333333 21.333333 0 0 1 21.333333 21.333333v42.666667a21.333333 21.333333 0 0 1-21.333333 21.333333H117.333333z" horiz-adv-x="1024" />
<glyph glyph-name="icon_test-tracking_filled" unicode="&#59121;" d="M405.333333 853.333333a21.333333 21.333333 0 0 1-21.333333-21.333333v-128a21.333333 21.333333 0 0 1 21.333333-21.333333h213.333334a21.333333 21.333333 0 0 1 21.333333 21.333333v128a21.333333 21.333333 0 0 1-21.333333 21.333333h-213.333334zM172.714667 808.618667H298.666667V640a42.666667 42.666667 0 0 1 42.666666-42.666667h341.333334a42.666667 42.666667 0 0 1 42.666666 42.666667V808.618667h125.952c30.677333 0 44.714667-17.237333 44.714667-44.672v-804.565334c0-27.434667-14.037333-44.714667-44.714667-44.714666H172.714667C141.994667-85.333333 128-68.096 128-40.618667V763.946667c0 27.392 14.037333 44.672 44.714667 44.672zM321.024 426.666667a22.357333 22.357333 0 0 1-22.357333-22.357334v-44.714666c0-12.330667 9.984-22.314667 22.357333-22.314667h381.952c12.373333 0 22.357333 9.984 22.357333 22.314667v44.714666a22.357333 22.357333 0 0 1-22.357333 22.357334H321.024z m0-213.333334a22.357333 22.357333 0 0 1-22.357333-22.357333v-44.672c0-12.373333 9.984-22.357333 22.357333-22.357333h394.154667c12.373333 0 22.357333 9.984 22.357333 22.357333v44.672a22.357333 22.357333 0 0 1-22.357333 22.357333H321.024z" horiz-adv-x="1024" />
<glyph glyph-name="icon_add-comment_outlined" unicode="&#59122;" d="M768 490.666667H256v-85.333334h512v85.333334zM85.333333 810.666667a42.666667 42.666667 0 0 1-42.666666-42.666667v-640a42.666667 42.666667 0 0 1 42.666666-42.666667h149.333334v-64a42.666667 42.666667 0 0 1 61.738666-38.144L500.778667 85.333333H938.666667a42.666667 42.666667 0 0 1 42.666666 42.666667V768a42.666667 42.666667 0 0 1-42.666666 42.666667H85.333333z m42.666667-640V725.333333h768v-554.666666h-405.333333a42.624 42.624 0 0 1-19.072-4.522667L320 90.368V128a42.666667 42.666667 0 0 1-42.666667 42.666667H128z" horiz-adv-x="1024" />
<glyph glyph-name="icon_sort_outlined2" unicode="&#59123;" d="M350.165333-19.498667a21.333333 21.333333 0 0 1 21.333334 21.333334V780.501333c0 38.570667-47.104 57.344-73.642667 29.354667L91.178667 591.701333a21.333333 21.333333 0 0 1 0.853333-30.165333l31.146667-29.525333a21.333333 21.333333 0 0 1 29.952 0.64l136.832 140.8v-671.573334a21.333333 21.333333 0 0 1 21.333333-21.333333h38.826667z m281.002667 10.666667c0-38.570667 47.104-57.344 73.642667-29.312l206.677333 218.112a21.333333 21.333333 0 0 1-0.853333 30.165333l-30.933334 29.354667a21.205333 21.205333 0 0 1-30.165333-0.853333l-133.034667-140.373334V769.834667a21.333333 21.333333 0 0 1-21.333333 21.333333h-42.666667a21.333333 21.333333 0 0 1-21.333333-21.333333v-778.666667z" horiz-adv-x="1024" />
<glyph glyph-name="icon_setting_filled" unicode="&#59125;" d="M167.125333 65.792A468.864 468.864 0 0 0 64 244.224l74.666667 101.973333a64 64 0 0 1 0 75.605334L64 523.776a468.906667 468.906667 0 0 0 103.125333 178.432l125.44-13.653333a64 64 0 0 1 65.493334 37.802666l50.944 115.626667A470.613333 470.613333 0 0 0 512 853.333333c35.413333 0 69.845333-3.925333 102.997333-11.349333l50.944-115.626667a64 64 0 0 1 65.493334-37.802666l125.44 13.653333A468.821333 468.821333 0 0 0 960 523.776l-74.666667-101.973333a64 64 0 0 1 0-75.605334l74.666667-101.973333a468.778667 468.778667 0 0 0-103.125333-178.432l-125.44 13.653333a64 64 0 0 1-65.493334-37.802666l-50.944-115.626667c-33.152-7.424-67.626667-11.349333-102.997333-11.349333-35.413333 0-69.845333 3.925333-102.997333 11.349333l-50.944 115.626667a64 64 0 0 1-65.493334 37.802666l-125.44-13.653333zM512 213.333333a170.666667 170.666667 0 1 1 0 341.333334 170.666667 170.666667 0 0 1 0-341.333334z" horiz-adv-x="1024" />
<glyph glyph-name="icon_project-settings-filled" unicode="&#59126;" d="M42.666667 725.333333a42.666667 42.666667 0 0 0 42.666666 42.666667h357.632a42.666667 42.666667 0 0 0 38.144-23.594667L512 682.666667h384a42.666667 42.666667 0 0 0 42.666667-42.666667v-234.154667l-56.917334-6.186666a43.648 43.648 0 0 0-44.672 25.770666l-32.554666 73.898667a10.453333 10.453333 0 0 1-7.466667 6.058667 321.194667 321.194667 0 0 1-129.877333 0 10.453333 10.453333 0 0 1-7.466667-6.058667l-32.554667-73.898667c-7.68-17.408-25.728-27.818667-44.629333-25.770666l-80.213333 8.704a10.453333 10.453333 0 0 1-8.96-3.413334 319.744 319.744 0 0 1-65.024-112.512 10.453333 10.453333 0 0 1 1.493333-9.472l47.744-65.194666c11.221333-15.36 11.221333-36.181333 0-51.541334l-47.744-65.194666a10.453333 10.453333 0 0 1-1.493333-9.472A319.146667 319.146667 0 0 1 476.16 0H85.333333a42.666667 42.666667 0 0 0-42.666666 42.666667V725.333333zM559.957333 36.906667c2.261333-2.56 5.589333-3.797333 8.96-3.413334l57.386667 6.229334a32 32 0 0 0 32.725333-18.901334l23.296-52.906666a10.368 10.368 0 0 1 7.466667-6.016 235.349333 235.349333 0 0 1 92.416 0 10.368 10.368 0 0 1 7.466667 6.058666l23.296 52.864a32 32 0 0 0 32.768 18.901334l57.344-6.229334a10.410667 10.410667 0 0 1 8.96 3.413334 234.410667 234.410667 0 0 1 46.293333 80.085333 10.410667 10.410667 0 0 1-1.493333 9.429333l-34.133334 46.677334a32 32 0 0 0 0 37.802666l34.133334 46.634667a10.410667 10.410667 0 0 1 1.493333 9.472 234.410667 234.410667 0 0 1-46.293333 80.085333 10.410667 10.410667 0 0 1-8.96 3.413334l-57.386667-6.229334a32 32 0 0 0-32.725333 18.901334l-23.296 52.906666a10.368 10.368 0 0 1-7.466667 6.016 235.349333 235.349333 0 0 1-92.416 0 10.368 10.368 0 0 1-7.466667-6.058666l-23.296-52.864a32 32 0 0 0-32.768-18.901334l-57.344 6.229334a10.410667 10.410667 0 0 1-8.96-3.413334 234.410667 234.410667 0 0 1-46.293333-80.085333 10.410667 10.410667 0 0 1 1.493333-9.429333l34.133334-46.677334a32 32 0 0 0 0-37.802666l-34.133334-46.634667a10.410667 10.410667 0 0 1-1.493333-9.472c10.069333-29.866667 25.941333-57.002667 46.293333-80.085333zM821.333333 192a85.333333 85.333333 0 1 0-170.666666 0 85.333333 85.333333 0 0 0 170.666666 0z" horiz-adv-x="1024" />
@ -754,8 +760,6 @@
<glyph glyph-name="icon_organization_outlined" unicode="&#59050;" d="M268.970667 192h486.058666c10.666667 6.4 22.186667 11.52 34.304 15.146667V277.333333a42.666667 42.666667 0 0 1-42.666666 42.666667h-469.333334a42.666667 42.666667 0 0 1-42.666666-42.666667v-70.186666c12.16-3.626667 23.68-8.746667 34.304-15.146667zM149.333333 207.146667V277.333333a128 128 0 0 0 128 128H469.333333V496.042667a170.666667 170.666667 0 1 0 85.333334 0V405.333333h192a128 128 0 0 0 128-128v-70.186666a149.333333 149.333333 0 1 0-119.637334-15.146667H268.970667a149.333333 149.333333 0 1 0-119.637334 15.146667zM512 576a85.333333 85.333333 0 1 1 0 170.666667 85.333333 85.333333 0 0 1 0-170.666667zM832 0a64 64 0 1 1 0 128 64 64 0 0 1 0-128z m-640 0a64 64 0 1 1 0 128 64 64 0 0 1 0-128z" horiz-adv-x="1024" />
<glyph glyph-name="icon_sort_outlined1" unicode="&#59051;" d="M350.165333-19.498667a21.333333 21.333333 0 0 1 21.333334 21.333334V780.501333c0 38.570667-47.104 57.344-73.642667 29.354667L91.178667 591.701333a21.333333 21.333333 0 0 1 0.853333-30.165333l31.146667-29.525333a21.333333 21.333333 0 0 1 29.952 0.64l136.832 140.8v-671.573334a21.333333 21.333333 0 0 1 21.333333-21.333333h38.826667z m281.002667 10.666667c0-38.570667 47.104-57.344 73.642667-29.312l206.677333 218.112a21.333333 21.333333 0 0 1-0.853333 30.165333l-30.933334 29.354667a21.205333 21.205333 0 0 1-30.165333-0.853333l-133.034667-140.373334V769.834667a21.333333 21.333333 0 0 1-21.333333 21.333333h-42.666667a21.333333 21.333333 0 0 1-21.333333-21.333333v-778.666667z" horiz-adv-x="1024" />
<glyph glyph-name="icon_share-label_filled" unicode="&#59052;" d="M554.666667 640c0-16.426667 2.304-32.341333 6.656-47.36l-184.746667-109.184a170.666667 170.666667 0 1 1 9.941333-230.784l235.349334-112.938667a170.666667 170.666667 0 1 1 36.949333 76.928l-235.349333 112.938667a171.52 171.52 0 0 1-3.456 80.426667l184.746666 109.184A170.666667 170.666667 0 1 1 554.666667 640z" horiz-adv-x="1024" />
<glyph glyph-name="icon_visible_outlined" unicode="&#59053;" d="M511.36 106.666667c138.154667 0 266.069333 87.893333 384.64 277.888C780.458667 573.866667 652.8 661.333333 511.36 661.333333 369.92 661.333333 242.730667 573.909333 128 384.554667c117.76-190.037333 245.248-277.888 383.36-277.888zM64.085333 346.026667a76.032 76.032 0 0 0 0.981334 78.421333C188.928 639.274667 337.706667 746.666667 511.317333 746.666667c174.336 0 324.010667-108.288 448.981334-324.864l1.194666-2.048c12.629333-22.144 12.544-49.493333-0.426666-71.466667-128.256-217.941333-278.186667-326.954667-449.749334-326.954667-170.965333 0-320.042667 108.245333-447.232 324.693334zM512 213.333333a170.666667 170.666667 0 1 0 0 341.333334 170.666667 170.666667 0 0 0 0-341.333334z m0 85.333334a85.333333 85.333333 0 1 1 0 170.666666 85.333333 85.333333 0 0 1 0-170.666666z" horiz-adv-x="1024" />
@ -840,12 +844,6 @@
<glyph glyph-name="icon_bottom-align_outlined" unicode="&#58969;" d="M106.666667 0a21.333333 21.333333 0 0 0-21.333334 21.333333v42.666667a21.333333 21.333333 0 0 0 21.333334 21.333333h810.666666a21.333333 21.333333 0 0 0 21.333334-21.333333v-42.666667a21.333333 21.333333 0 0 0-21.333334-21.333333h-810.666666zM264.149333 488.362667L469.333333 283.221333V787.925333c0 12.544 10.197333 22.741333 22.741334 22.741334h39.850666c12.544 0 22.741333-10.197333 22.741334-22.741334v-505.728l206.165333 206.165334a22.741333 22.741333 0 0 0 32.170667 0l28.16-28.16a22.741333 22.741333 0 0 0 0-32.170667l-289.621334-289.621333a22.741333 22.741333 0 0 0-19.029333-6.485334 22.741333 22.741333 0 0 0-19.072 6.485334l-289.621333 289.621333a22.741333 22.741333 0 0 0 0 32.213333l28.16 28.16a22.741333 22.741333 0 0 0 32.170666 0z" horiz-adv-x="1024" />
<glyph glyph-name="icon_admin_outlined" unicode="&#58970;" d="M805.290667 597.333333a170.752 170.752 0 0 0-330.581334 0H112.682667c-9.514667 0-12.970667 1.024-16.426667 2.858667a19.370667 19.370667 0 0 0-8.106667 8.106667C86.357333 611.669333 85.333333 615.168 85.333333 624.64V655.36c0 9.472 0.981333 12.928 2.858667 16.426667a19.370667 19.370667 0 0 0 8.064 8.064C99.712 681.685333 103.168 682.666667 112.64 682.666667h362.026667a170.752 170.752 0 0 0 330.581333 0h106.026667c9.514667 0 12.970667-0.981333 16.426666-2.816a19.370667 19.370667 0 0 0 8.106667-8.106667c1.834667-3.413333 2.816-6.912 2.816-16.384v-30.677333c0-9.472-0.981333-12.928-2.858667-16.426667a19.370667 19.370667 0 0 0-8.064-8.064c-3.456-1.834667-6.912-2.858667-16.426666-2.858667h-106.026667zM640 554.666667a85.333333 85.333333 0 1 1 0 170.666666 85.333333 85.333333 0 0 1 0-170.666666zM549.290667 85.333333a170.752 170.752 0 0 0-330.581334 0H112.682667c-9.514667 0-12.970667 1.024-16.426667 2.858667a19.370667 19.370667 0 0 0-8.106667 8.106667c-1.834667 3.413333-2.816 6.912-2.816 16.384v30.677333c0 9.472 0.981333 12.928 2.858667 16.426667a19.370667 19.370667 0 0 0 8.064 8.064c3.456 1.834667 6.912 2.816 16.426667 2.816h106.026666a170.752 170.752 0 0 0 330.581334 0h362.026666c9.514667 0 12.970667-0.981333 16.426667-2.816a19.370667 19.370667 0 0 0 8.106667-8.106667c1.834667-3.413333 2.816-6.912 2.816-16.384v-30.634667c0-9.514667-0.981333-12.970667-2.858667-16.469333a19.370667 19.370667 0 0 0-8.064-8.064c-3.456-1.834667-6.912-2.858667-16.426667-2.858667h-362.026666zM384 42.666667a85.333333 85.333333 0 1 1 0 170.666666 85.333333 85.333333 0 0 1 0-170.666666z" horiz-adv-x="1024" />
<glyph glyph-name="icon_expand-right_filled" unicode="&#58971;" d="M797.994667 359.424L332.8-13.696a38.4 38.4 0 0 0-45.952 0 23.722667 23.722667 0 0 0-9.514667 18.389333V763.306667c0 14.378667 14.549333 26.026667 32.469334 26.026666 8.618667 0 16.853333-2.730667 22.954666-7.637333l465.237334-373.12c16.896-13.568 16.896-35.584 0-49.152z" horiz-adv-x="1024" />
<glyph glyph-name="icon_delete-trash_outlined" unicode="&#58972;" d="M341.333333 725.333333V768a42.666667 42.666667 0 0 0 42.666667 42.666667h256a42.666667 42.666667 0 0 0 42.666667-42.666667v-42.666667h228.650666c9.514667 0 12.970667-0.981333 16.426667-2.858666a19.370667 19.370667 0 0 0 8.106667-8.064c1.834667-3.456 2.816-6.912 2.816-16.426667v-30.634667c0-9.514667-0.981333-12.970667-2.858667-16.426666a19.370667 19.370667 0 0 0-8.064-8.106667c-3.456-1.834667-6.912-2.816-16.426667-2.816H853.333333v-640a42.666667 42.666667 0 0 0-42.666666-42.666667H213.333333a42.666667 42.666667 0 0 0-42.666666 42.666667V640H112.682667c-9.514667 0-12.970667 0.981333-16.426667 2.858667a19.370667 19.370667 0 0 0-8.106667 8.064C86.357333 654.378667 85.333333 657.834667 85.333333 667.306667v30.634666c0 9.514667 0.981333 12.970667 2.858667 16.426667a19.370667 19.370667 0 0 0 8.064 8.106667C99.712 724.309333 103.168 725.333333 112.64 725.333333H341.333333zM256 640v-597.333333h512V640H256z m149.333333-85.333333h42.666667a21.333333 21.333333 0 0 0 21.333333-21.333334v-384a21.333333 21.333333 0 0 0-21.333333-21.333333h-42.666667a21.333333 21.333333 0 0 0-21.333333 21.333333v384a21.333333 21.333333 0 0 0 21.333333 21.333334z m170.666667 0h42.666667a21.333333 21.333333 0 0 0 21.333333-21.333334v-384a21.333333 21.333333 0 0 0-21.333333-21.333333h-42.666667a21.333333 21.333333 0 0 0-21.333333 21.333333v384a21.333333 21.333333 0 0 0 21.333333 21.333334z" horiz-adv-x="1024" />
<glyph glyph-name="icon_sort_outlined" unicode="&#58973;" d="M350.165333-19.498667a21.333333 21.333333 0 0 1 21.333334 21.333334V780.501333c0 38.570667-47.104 57.344-73.642667 29.354667L91.178667 591.701333a21.333333 21.333333 0 0 1 0.853333-30.165333l31.146667-29.525333a21.333333 21.333333 0 0 1 29.952 0.64l136.832 140.8v-671.573334a21.333333 21.333333 0 0 1 21.333333-21.333333h38.826667z m281.002667 10.666667c0-38.570667 47.104-57.344 73.642667-29.312l206.677333 218.112a21.333333 21.333333 0 0 1-0.853333 30.165333l-30.933334 29.354667a21.205333 21.205333 0 0 1-30.165333-0.853333l-133.034667-140.373334V769.834667a21.333333 21.333333 0 0 1-21.333333 21.333333h-42.666667a21.333333 21.333333 0 0 1-21.333333-21.333333v-778.666667z" horiz-adv-x="1024" />
<glyph glyph-name="icon_vertical-align_outlined" unicode="&#58974;" d="M469.333333 624.554667L392.149333 701.696a22.741333 22.741333 0 0 1-32.170666 0l-28.16-28.16a22.741333 22.741333 0 0 1 0-32.170667l161.621333-161.621333a22.741333 22.741333 0 0 1 19.072-6.485333c6.741333-0.853333 13.824 1.28 19.029333 6.485333l161.621334 161.621333a22.741333 22.741333 0 0 1 0 32.213334l-28.16 28.16a22.741333 22.741333 0 0 1-32.170667 0L554.666667 623.488V830.592A22.741333 22.741333 0 0 1 531.925333 853.333333h-39.850666a22.741333 22.741333 0 0 1-22.741334-22.741333v-206.08zM469.333333 147.2L392.149333 69.973333a22.741333 22.741333 0 0 0-32.170666 0l-28.16 28.16a22.741333 22.741333 0 0 0 0 32.213334l161.621333 161.621333a22.741333 22.741333 0 0 0 19.072 6.485333c6.741333 0.853333 13.824-1.28 19.029333-6.485333l161.621334-161.664a22.741333 22.741333 0 0 0 0-32.170667l-28.16-28.16a22.741333 22.741333 0 0 0-32.170667 0L554.666667 148.181333v-207.018666a22.741333 22.741333 0 0 0-22.741334-22.784h-39.850666a22.741333 22.741333 0 0 0-22.741334 22.784V147.2zM106.666667 426.666667a21.333333 21.333333 0 0 1-21.333334-21.333334v-42.666666a21.333333 21.333333 0 0 1 21.333334-21.333334h810.666666a21.333333 21.333333 0 0 1 21.333334 21.333334v42.666666a21.333333 21.333333 0 0 1-21.333334 21.333334h-810.666666z" horiz-adv-x="1024" />

Before

Width:  |  Height:  |  Size: 510 KiB

After

Width:  |  Height:  |  Size: 513 KiB

View File

@ -0,0 +1,535 @@
<template>
<div class="h-full">
<MsMinderEditor
v-model:activeExtraKey="activeExtraKey"
v-model:extra-visible="extraVisible"
v-model:loading="loading"
v-model:import-json="importJson"
:show-save-button="false"
:extract-content-tab-list="extractContentTabList"
:priority-tooltip="t('caseManagement.caseReview.caseLevel')"
:priority-disable-check="priorityDisableCheck"
:can-show-float-menu="canShowFloatMenu()"
:can-show-priority-menu="canShowPriorityMenu()"
:can-show-more-menu="showCaseMenu"
:can-show-more-menu-node-operation="false"
:more-menu-other-operation-list="moreMenuOtherOperationList"
:disabled="!hasEditPermission"
single-tag
@node-select="handleNodeSelect"
>
<template #extractMenu>
<!-- 进入当前节点 -->
<template v-if="canShowEnterNode">
<MsButton type="text" class="!text-[var(--color-text-1)]" @click="handleEnterNode">
{{ t('minder.hotboxMenu.enterNode') }}
</MsButton>
</template>
<template v-if="showCaseMenu">
<!-- 评审 查看详情 更多 -->
<a-tooltip :content="t('caseManagement.caseReview.review')">
<MsButton type="icon" class="ms-minder-node-float-menu-icon-button">
<MsIcon type="icon-icon_audit" class="text-[var(--color-text-4)]" />
</MsButton>
</a-tooltip>
<a-tooltip :content="t('common.detail')">
<MsButton type="icon" class="ms-minder-node-float-menu-icon-button" @click="toggleDetail">
<MsIcon
type="icon-icon_describe_outlined"
class="text-[var(--color-text-4)]"
:class="[extraVisible ? 'ms-minder-node-float-menu-icon-button--focus' : '']"
/>
</MsButton>
</a-tooltip>
</template>
</template>
<template #extractTabContent>
<MsDescription
v-if="activeExtraKey === 'baseInfo'"
:loading="baseInfoLoading"
:descriptions="descriptions"
label-width="90px"
/>
<Attachment
v-else-if="activeExtraKey === 'attachment'"
v-model:model-value="fileList"
not-show-add-button
:active-case="activeCaseInfo"
/>
<div v-else>
<div v-if="props.reviewPassRule === 'MULTIPLE'" class="flex justify-between">
<div class="text-[12px]">
<span class="text-[var(--color-text-4)]">{{ t('caseManagement.caseReview.progress') }}</span>
{{ props.passRate }}
</div>
<!-- TODO 下拉 -->
</div>
<ReviewCommentList :review-comment-list="reviewHistoryList" active-comment="reviewComment" />
</div>
</template>
</MsMinderEditor>
</div>
</template>
<script setup lang="ts">
import { useRoute } from 'vue-router';
import dayjs from 'dayjs';
import MsButton from '@/components/pure/ms-button/index.vue';
import MsDescription, { Description } from '@/components/pure/ms-description/index.vue';
import MsMinderEditor from '@/components/pure/ms-minder-editor/minderEditor.vue';
import type { MinderJson, MinderJsonNode, MinderJsonNodeData } from '@/components/pure/ms-minder-editor/props';
import { MsFileItem } from '@/components/pure/ms-upload/types';
import Attachment from '@/components/business/ms-minders/featureCaseMinder/attachment.vue';
import useMinderBaseApi from '@/components/business/ms-minders/featureCaseMinder/useMinderBaseApi';
import ReviewCommentList from '@/views/case-management/caseManagementFeature/components/tabContent/tabComment/reviewCommentList.vue';
import { getCaseReviewHistoryList, getCaseReviewMinder } from '@/api/modules/case-management/caseReview';
import { getCaseDetail } from '@/api/modules/case-management/featureCase';
import { useI18n } from '@/hooks/useI18n';
import useAppStore from '@/store/modules/app';
import useMinderStore from '@/store/modules/components/minder-editor/index';
import { findNodeByKey, mapTree, replaceNodeInTree } from '@/utils';
import { hasAnyPermission } from '@/utils/permission';
import { ReviewHistoryItem, ReviewPassRule } from '@/models/caseManagement/caseReview';
import { ModuleTreeNode } from '@/models/common';
import { MinderEventName } from '@/enums/minderEnum';
import { convertToFile, getCustomField } from '@/views/case-management/caseManagementFeature/components/utils';
const props = defineProps<{
moduleId: string;
modulesCount: Record<string, number>; //
viewFlag: boolean; //
viewStatusFlag: boolean; //
passRate: string;
reviewPassRule: ReviewPassRule; //
moduleTree: ModuleTreeNode[];
}>();
const route = useRoute();
const appStore = useAppStore();
const { t } = useI18n();
const minderStore = useMinderStore();
const hasEditPermission = hasAnyPermission(['FUNCTIONAL_CASE:READ+MINDER']);
const { caseTag, moduleTag, canShowPriorityMenu, priorityDisableCheck } = useMinderBaseApi({
hasEditPermission,
});
const importJson = ref<MinderJson>({
root: {} as MinderJsonNode,
template: 'default',
treePath: [],
});
const loading = ref(false);
/**
* 初始化用例模块树
*/
async function initCaseTree() {
const tree = mapTree<MinderJsonNode>(props.moduleTree, (e) => ({
...e,
data: {
...e.data,
id: e.id || e.data?.id || '',
text: e.name || e.data?.text || '',
resource: props.modulesCount[e.id] !== undefined ? [moduleTag] : e.data?.resource,
expandState: e.level === 0 ? 'expand' : 'collapse',
count: props.modulesCount[e.id],
isNew: false,
changed: false,
},
children:
props.modulesCount[e.id] > 0 && !e.children?.length
? [
{
data: {
id: 'fakeNode',
text: 'fakeNode',
resource: ['fakeNode'],
isNew: false,
changed: false,
},
},
]
: e.children,
}));
importJson.value.root = {
children: tree,
data: {
id: 'NONE',
text: t('ms.minders.allModule'),
resource: [moduleTag],
disabled: true,
},
};
importJson.value.treePath = [];
window.minder.importJson(importJson.value);
if (props.moduleId !== 'all') {
// ID
nextTick(() => {
minderStore.dispatchEvent(MinderEventName.ENTER_NODE, undefined, undefined, undefined, [
findNodeByKey(importJson.value.root.children || [], props.moduleId, 'id', 'data') as MinderJsonNode,
]);
});
} else {
//
nextTick(() => {
minderStore.dispatchEvent(MinderEventName.ENTER_NODE, undefined, undefined, undefined, [importJson.value.root]);
});
}
}
onMounted(() => {
initCaseTree();
});
watch(
() => props.moduleId,
() => {
initCaseTree();
}
);
/**
* 移除占位的虚拟节点
* @param node 对应节点
* @param fakeNodeName 虚拟节点名称
*/
function removeFakeNode(node: MinderJsonNode, fakeNodeName: string) {
const fakeNode = node.children?.find((e: MinderJsonNode) => e.data?.id === fakeNodeName);
if (fakeNode) {
window.minder.removeNode(fakeNode);
}
}
/**
* 渲染其子节点
* @param node 对应节点
* @param renderNode 需要渲染的子节点
*/
function handleRenderNode(node: MinderJsonNode, renderNode: MinderJsonNode) {
const { data } = node;
if (!data) return;
window.minder.renderNodeBatch(renderNode);
node.layout();
data.isLoaded = true;
}
/**
* 加载模块节点下的用例节点
* @param selectedNode 选中节点
* @param loadMoreCurrent 加载模块下更多用例时的当前页码
*/
async function initNodeCases(selectedNode?: MinderJsonNode, loadMoreCurrent?: number) {
try {
loading.value = true;
const node = selectedNode || window.minder.getSelectedNode();
const { data } = node;
if (!data) return;
const { list, total } = await getCaseReviewMinder({
current: loadMoreCurrent ? loadMoreCurrent + 1 : 1,
projectId: appStore.currentProjectId,
moduleId: data.id,
reviewId: route.query.id as string,
viewFlag: props.viewFlag,
viewStatusFlag: props.viewStatusFlag,
});
//
removeFakeNode(node, loadMoreCurrent ? `tmp-${data.id}` : 'fakeNode');
//
if ((!list || list.length === 0) && node.children?.length && !loadMoreCurrent) {
node.expand();
handleRenderNode(node, node.children);
return;
}
let waitingRenderNodes: MinderJsonNode[] = [];
list.forEach((e) => {
//
const child = window.minder.createNode(
{
...e.data,
expandState: 'collapse',
isNew: false,
},
node
);
waitingRenderNodes.push(child);
const grandChildren: MinderJsonNode[] = [];
e.children?.forEach((item) => {
// //
const grandChild = window.minder.createNode(
{
...item.data,
expandState: 'collapse',
isNew: false,
},
child
);
grandChildren.push(grandChild);
const greatGrandChildren: MinderJsonNode[] = [];
item.children?.forEach((subItem) => {
//
const greatGrandChild = window.minder.createNode(
{
...subItem.data,
expandState: 'collapse',
isNew: false,
},
grandChild
);
greatGrandChildren.push(greatGrandChild);
});
window.minder.renderNodeBatch(greatGrandChildren);
});
window.minder.renderNodeBatch(grandChildren);
});
node.expand();
if (node.children && node.children.length > 0) {
waitingRenderNodes = waitingRenderNodes.concat(node.children);
}
if (total > list.length * (loadMoreCurrent || 1)) {
//
const moreNode = window.minder.createNode(
{
id: `tmp-${data.id}`,
text: '...',
type: 'tmp',
expandState: 'collapse',
current: loadMoreCurrent ? loadMoreCurrent + 1 : 1,
},
node
);
waitingRenderNodes.push(moreNode);
}
handleRenderNode(node, waitingRenderNodes);
// importJson
replaceNodeInTree([importJson.value.root], node.data?.id || '', window.minder.exportNode(node), 'data', 'id');
} catch (error) {
// eslint-disable-next-line no-console
console.log(error);
} finally {
loading.value = false;
}
}
watch(
() => props.viewStatusFlag,
() => {
initNodeCases();
}
);
const extraVisible = ref<boolean>(false);
const activeExtraKey = ref<'baseInfo' | 'attachment' | 'history'>('baseInfo');
const baseInfoLoading = ref(false);
const activeCaseInfo = ref<Record<string, any>>({});
const descriptions = ref<Description[]>([]);
const fileList = ref<MsFileItem[]>([]);
const extractContentTabList = [
{
value: 'baseInfo',
label: t('common.baseInfo'),
},
{
value: 'attachment',
label: t('caseManagement.featureCase.attachment'),
},
{
value: 'history',
label: t('caseManagement.caseReview.reviewHistory'),
},
];
function resetExtractInfo() {
activeCaseInfo.value = {};
fileList.value = [];
}
const canShowEnterNode = ref(false);
const showCaseMenu = ref(false);
const moreMenuOtherOperationList = [
{
value: 'changeReviewer',
label: t('caseManagement.caseReview.changeReviewer'),
permission: ['CASE_REVIEW:READ+UPDATE'],
onClick: () => {
// TODO
console.log('🤔️ =>', t('caseManagement.caseReview.changeReviewer'));
},
},
{
value: 'reReview',
label: t('caseManagement.caseReview.reReview'),
permission: ['CASE_REVIEW:READ+UPDATE'],
onClick: () => {
// TODO
console.log('🤔️ =>', t('caseManagement.caseReview.reReview'));
},
},
{
value: 'disassociate',
label: t('caseManagement.caseReview.disassociate'),
permission: ['CASE_REVIEW:READ+RELEVANCE'],
onClick: () => {
// TODO
console.log('🤔️ =>', t('caseManagement.caseReview.disassociate'));
},
},
];
/**
* 初始化用例详情
* @param data 节点数据
*/
async function initCaseDetail(data: MinderJsonNodeData) {
try {
baseInfoLoading.value = true;
const res = await getCaseDetail(data?.id || activeCaseInfo.value.id);
activeCaseInfo.value = res;
//
descriptions.value = [
{
label: t('caseManagement.caseReview.belongModule'),
value: res.moduleName || t('common.root'),
},
//
...res.customFields.map((e: Record<string, any>) => {
try {
return {
label: e.fieldName,
value: getCustomField(e),
};
} catch (error) {
return {
label: e.fieldName,
value: e.defaultValue,
};
}
}),
{
label: t('caseManagement.caseReview.creator'),
value: res.createUserName || '',
},
{
label: t('caseManagement.caseReview.createTime'),
value: dayjs().format('YYYY-MM-DD HH:mm:ss'),
},
];
//
if (activeCaseInfo.value.attachments) {
fileList.value = activeCaseInfo.value.attachments
.map((fileInfo: any) => {
return {
...fileInfo,
name: fileInfo.fileName,
};
})
.map((fileInfo: any) => {
return convertToFile(fileInfo);
});
}
} catch (error) {
// eslint-disable-next-line no-console
console.log(error);
} finally {
baseInfoLoading.value = false;
}
}
//
const reviewHistoryList = ref<ReviewHistoryItem[]>([]);
async function initReviewHistoryList(data: MinderJsonNodeData) {
try {
const res = await getCaseReviewHistoryList(route.query.id as string, data?.id || activeCaseInfo.value.id);
reviewHistoryList.value = res;
} catch (error) {
// eslint-disable-next-line no-console
console.log(error);
}
}
/**
* 切换用例详情显示
*/
async function toggleDetail(val?: boolean) {
extraVisible.value = val !== undefined ? val : !extraVisible.value;
const node: MinderJsonNode = window.minder.getSelectedNode();
const { data } = node;
if (extraVisible.value && data?.resource?.includes(caseTag)) {
activeExtraKey.value = 'baseInfo';
initCaseDetail(data);
initReviewHistoryList(data);
}
}
/**
* 是否可展示浮动菜单
*/
function canShowFloatMenu() {
if (window.minder) {
const node: MinderJsonNode = window.minder.getSelectedNode();
// TODO
if (node?.data?.type === 'tmp') {
return false;
}
if (!hasEditPermission) {
if (node?.data?.resource?.includes(caseTag)) {
//
return true;
}
return false;
}
}
return true;
}
/**
* 处理节点选中
* @param node 节点
*/
async function handleNodeSelect(node: MinderJsonNode) {
const { data } = node;
//
if (data?.type === 'tmp' && node.parent?.data?.resource?.includes(moduleTag)) {
await initNodeCases(node.parent, data.current);
return;
}
//
if (data?.resource?.includes(moduleTag) && (node.children || []).length > 0 && node.type !== 'root') {
canShowEnterNode.value = true;
} else {
canShowEnterNode.value = false;
}
if (data?.resource?.includes(caseTag)) {
showCaseMenu.value = true;
if (extraVisible.value) {
toggleDetail(true);
}
} else if (data?.resource?.includes(moduleTag) && data.count > 0 && data.isLoaded !== true) {
//
await initNodeCases(node);
showCaseMenu.value = false;
extraVisible.value = false;
} else {
showCaseMenu.value = false;
extraVisible.value = false;
resetExtractInfo();
removeFakeNode(node, 'fakeNode');
}
}
/**
* 进入当前节点
*/
function handleEnterNode() {
const selectedNodes: MinderJsonNode[] = window.minder.getSelectedNodes();
minderStore.dispatchEvent(MinderEventName.ENTER_NODE, undefined, undefined, undefined, [selectedNodes[0]]);
}
defineExpose({
initNodeCases,
});
</script>

View File

@ -1,6 +1,7 @@
<template>
<a-spin :loading="attachmentLoading" class="block h-full pl-[16px]">
<MsAddAttachment
v-if="!props.notShowAddButton"
v-model:file-list="fileList"
:disabled="!hasEditPermission"
multiple
@ -132,6 +133,7 @@
const props = defineProps<{
activeCase: Record<string, any>;
notShowAddButton?: boolean;
}>();
const emit = defineEmits<{
(e: 'uploadSuccess'): void;

View File

@ -1,23 +1,27 @@
<template>
<div class="flex flex-row items-center justify-between">
<slot name="left">
<a-popover v-if="props.name" title="" position="bottom">
<div class="flex">
<div class="one-line-text mr-1 max-h-[32px] max-w-[300px] text-[var(--color-text-1)]">
{{ props.name }}
<div class="flex">
<a-popover v-if="props.name" title="" position="bottom">
<div class="flex">
<div class="one-line-text mr-1 max-h-[32px] max-w-[300px] text-[var(--color-text-1)]">
{{ props.name }}
</div>
<span class="text-[var(--color-text-4)]"> ({{ props.count }})</span>
</div>
<span class="text-[var(--color-text-4)]"> ({{ props.count }})</span>
</div>
<template #content>
<div class="max-w-[400px] text-[14px] font-medium text-[var(--color-text-1)]">
{{ props.name }}
<span class="text-[var(--color-text-4)]">({{ props.count }})</span>
</div>
</template>
</a-popover>
<template #content>
<div class="max-w-[400px] text-[14px] font-medium text-[var(--color-text-1)]">
{{ props.name }}
<span class="text-[var(--color-text-4)]">({{ props.count }})</span>
</div>
</template>
</a-popover>
<slot name="nameRight"></slot>
</div>
</slot>
<div class="flex flex-row gap-[12px]">
<a-input-search
v-if="!props.notShowInputSearch"
v-model:modelValue="keyword"
size="small"
:placeholder="props.searchPlaceholder"
@ -85,6 +89,7 @@
searchPlaceholder?: string;
name?: string;
count?: number;
notShowInputSearch?: boolean;
}>();
const emit = defineEmits<{

View File

@ -15,9 +15,11 @@
class="ms-description-item"
:style="{ marginBottom: props.descriptions.length - index <= props.column ? '' : '16px' }"
>
<div class="ms-description-item-label" :style="{ width: props.labelWidth || '120px' }">
<slot name="item-label">{{ item.label }}</slot>
</div>
<a-tooltip :content="item.label">
<div :class="`ms-description-item-label one-line-text max-w-[${props.labelWidth || '120px'}]`">
<slot name="item-label">{{ item.label }}</slot>
</div>
</a-tooltip>
<div :class="getValueClass(item)">
<slot name="item-value" :item="item">
<template v-if="item.isTag">
@ -277,7 +279,7 @@
width: calc(100% / v-bind(column));
}
.ms-description-item-label {
@apply whitespace-pre-wrap font-normal;
@apply font-normal;
padding-right: 16px;
color: var(--color-text-3);

View File

@ -15,6 +15,7 @@
</MsButton>
</a-tooltip>
<a-button
v-if="props.showSaveButton"
type="outline"
:disabled="props.disabled"
class="px-[8px] py-[2px] text-[12px]"
@ -38,6 +39,7 @@
const props = defineProps<{
iconButtons?: MinderIconButtonItem[];
disabled?: boolean;
showSaveButton?: boolean;
}>();
const emit = defineEmits<{
(e: 'click', eventTag: string): void;

View File

@ -1,6 +1,11 @@
<template>
<div ref="mec" class="ms-minder-container">
<minderHeader :icon-buttons="props.iconButtons" :disabled="props.disabled" @save="save" />
<minderHeader
:icon-buttons="props.iconButtons"
:disabled="props.disabled"
:show-save-button="props.showSaveButton"
@save="save"
/>
<Navigator />
<div
v-if="currentTreePath?.length > 0"

View File

@ -134,35 +134,46 @@
</MsButton>
</a-tooltip>
<template #content>
<a-doption v-if="props.canShowEnterNode" value="enterNode">
<div class="flex items-center">
<div>{{ t('minder.hotboxMenu.enterNode') }}</div>
<!-- <div class="ml-[4px] text-[var(--color-text-4)]">(Ctrl+ Enter)</div> -->
</div>
</a-doption>
<a-doption value="copy">
<div class="flex items-center">
<div>{{ t('minder.hotboxMenu.copy') }}</div>
<!-- <div class="ml-[4px] text-[var(--color-text-4)]">(Ctrl + C)</div> -->
</div>
</a-doption>
<a-doption value="cut">
<div class="flex items-center">
<div>{{ t('minder.hotboxMenu.cut') }}</div>
<!-- <div class="ml-[4px] text-[var(--color-text-4)]">(Ctrl + X)</div> -->
</div>
</a-doption>
<a-doption v-if="props.canShowPasteMenu && minderStore.clipboard.length > 0" value="paste">
<div class="flex items-center">
<div>{{ t('minder.hotboxMenu.paste') }}</div>
<!-- <div class="ml-[4px] text-[var(--color-text-4)]">(Ctrl + V)</div> -->
</div>
</a-doption>
<a-doption value="delete">
<div class="flex items-center">
<div>{{ t('minder.hotboxMenu.delete') }}</div>
<!-- <div class="ml-[4px] text-[var(--color-text-4)]">(Backspace)</div> -->
</div>
<template v-if="props.canShowMoreMenuNodeOperation">
<a-doption v-if="props.canShowEnterNode" value="enterNode">
<div class="flex items-center">
<div>{{ t('minder.hotboxMenu.enterNode') }}</div>
<!-- <div class="ml-[4px] text-[var(--color-text-4)]">(Ctrl+ Enter)</div> -->
</div>
</a-doption>
<a-doption value="copy">
<div class="flex items-center">
<div>{{ t('minder.hotboxMenu.copy') }}</div>
<!-- <div class="ml-[4px] text-[var(--color-text-4)]">(Ctrl + C)</div> -->
</div>
</a-doption>
<a-doption value="cut">
<div class="flex items-center">
<div>{{ t('minder.hotboxMenu.cut') }}</div>
<!-- <div class="ml-[4px] text-[var(--color-text-4)]">(Ctrl + X)</div> -->
</div>
</a-doption>
<a-doption v-if="props.canShowPasteMenu && minderStore.clipboard.length > 0" value="paste">
<div class="flex items-center">
<div>{{ t('minder.hotboxMenu.paste') }}</div>
<!-- <div class="ml-[4px] text-[var(--color-text-4)]">(Ctrl + V)</div> -->
</div>
</a-doption>
<a-doption value="delete">
<div class="flex items-center">
<div>{{ t('minder.hotboxMenu.delete') }}</div>
<!-- <div class="ml-[4px] text-[var(--color-text-4)]">(Backspace)</div> -->
</div>
</a-doption>
</template>
<a-doption
v-for="item in props.moreMenuOtherOperationList"
:key="item.value"
v-permission="item.permission || []"
:value="item.value"
@click="item.onClick()"
>
<div>{{ item.label }}</div>
</a-doption>
</template>
</a-dropdown>

View File

@ -38,6 +38,7 @@
delProps,
editMenuProps,
floatMenuProps,
headerProps,
insertProps,
mainEditorProps,
MinderEvent,
@ -63,6 +64,7 @@
}>();
const props = defineProps({
...headerProps,
...floatMenuProps,
...insertProps,
...editMenuProps,

View File

@ -66,6 +66,11 @@ export const headerProps = {
iconButtons: {
type: [] as PropType<MinderIconButtonItem[]>,
},
// 是否显示保存按钮
showSaveButton: {
type: Boolean,
default: true,
},
};
export const priorityProps = {
@ -129,6 +134,12 @@ export interface InsertMenuItem {
value: string;
label: string;
}
export interface MoreMenuOtherOperationItem {
value: string;
label: string;
permission?: string[];
onClick: () => void;
}
export const floatMenuProps = {
// 插入同级选项
insertSiblingMenus: {
@ -149,6 +160,11 @@ export const floatMenuProps = {
type: Boolean,
default: true,
},
// 是否显示更多菜单里的[进入、复制、粘贴、剪切、删除]操作
canShowMoreMenuNodeOperation: {
type: Boolean,
default: true,
},
// 不显示更多菜单时,是否显示删除菜单
canShowDeleteMenu: {
type: Boolean,
@ -164,6 +180,13 @@ export const floatMenuProps = {
type: Boolean,
default: true,
},
// 更多菜单里自定义操作
moreMenuOtherOperationList: {
type: Array as PropType<MoreMenuOtherOperationItem[]>,
default() {
return [];
},
},
// 是否显示等级菜单
canShowPriorityMenu: {
type: Boolean,

View File

@ -250,3 +250,13 @@ export interface CaseReviewFunctionalCaseUserItem {
reviewId: string;
userId: string;
}
// 获取脑图请求参数
export interface CaseReviewMinderParams {
projectId: string;
moduleId: string;
current?: number;
reviewId: string;
viewFlag: boolean; // 是否只看我的
viewStatusFlag: boolean; // 我的评审结果
}

View File

@ -1,117 +1,149 @@
<template>
<div class="px-[24px] py-[16px]">
<div class="mb-[16px] flex flex-wrap items-center justify-end">
<div class="h-full px-[24px] py-[16px]">
<div class="mb-[16px]">
<MsAdvanceFilter
v-model:keyword="keyword"
:filter-config-list="filterConfigList"
:row-count="filterRowCount"
:count="props.modulesCount[props.activeFolder] || 0"
:name="moduleNamePath"
:not-show-input-search="showType !== 'list'"
:search-placeholder="t('caseManagement.caseReview.searchPlaceholder')"
@keyword-search="(val, filter) => searchCase(filter)"
@adv-search="searchCase"
@refresh="searchCase"
@refresh="refresh"
>
<!-- <template #right>
<div class="flex items-center">
<a-radio-group v-model:model-value="showType" type="button" class="case-show-type">
<a-radio value="list" class="show-type-icon p-[2px]">
<MsIcon type="icon-icon_view-list_outlined" />
</a-radio>
<a-radio value="mind" class="show-type-icon p-[2px]">
<MsIcon type="icon-icon_mindnote_outlined" />
</a-radio>
</a-radio-group>
<template v-if="showType !== 'list'" #nameRight>
<div v-if="reviewPassRule === 'MULTIPLE'" class="ml-[16px]">
<a-switch v-model:model-value="onlyMineStatus" size="small" class="mr-[4px]" type="line" />
{{ t('caseManagement.caseReview.myReviewStatus') }}
</div>
</template> -->
<span class="ml-[16px] !text-[rgb(var(--warning-6))]">
{{ t('caseManagement.caseReview.cannotReviewTip') }}
</span>
</template>
<template #right>
<a-radio-group
v-model:model-value="showType"
type="button"
size="small"
class="list-show-type"
@change="handleShowTypeChange"
>
<a-radio value="list" class="show-type-icon !m-[2px]">
<MsIcon :size="14" type="icon-icon_view-list_outlined" />
</a-radio>
<a-radio value="minder" class="show-type-icon !m-[2px]">
<MsIcon :size="14" type="icon-icon_mindnote_outlined" />
</a-radio>
</a-radio-group>
</template>
</MsAdvanceFilter>
</div>
<ms-base-table
v-bind="propsRes"
:action-config="batchActions"
no-disable
filter-icon-align-left
v-on="propsEvent"
@batch-action="handleTableBatch"
>
<template #[FilterSlotNameEnum.CASE_MANAGEMENT_REVIEW_RESULT]="{ filterContent }">
<a-tag :color="reviewResultMap[filterContent.value as ReviewResult].color" class="px-[4px]" size="small">
{{ t(reviewResultMap[filterContent.value as ReviewResult].label) }}
</a-tag>
</template>
<template #[FilterSlotNameEnum.CASE_MANAGEMENT_CASE_LEVEL]="{ filterContent }">
<caseLevel :case-level="filterContent.text" />
</template>
<template #num="{ record }">
<a-tooltip :content="record.num">
<a-button type="text" class="px-0 !text-[14px] !leading-[22px]" @click="review(record)">
<div class="one-line-text max-w-[168px]">{{ record.num }}</div>
</a-button>
</a-tooltip>
</template>
<template #caseLevel="{ record }">
<span class="text-[var(--color-text-2)]"> <caseLevel :case-level="record.caseLevel" /></span>
</template>
<template #reviewNames="{ record }">
<MsTagGroup
v-if="record.showModuleTree"
:tag-list="record.reviewNames"
is-string-tag
:show-num="1"
theme="outline"
@click="record.showModuleTree = false"
/>
<MsSelect
v-else
v-model:model-value="record.reviewers"
v-model:loading="dialogLoading"
:max-tag-count="1"
class="w-full"
:options="reviewersOptions"
:search-keys="['label']"
allow-search
:multiple="true"
:placeholder="t('project.messageManagement.receiverPlaceholder')"
@change="() => changeReviewer(record)"
>
</MsSelect>
</template>
<template #status="{ record }">
<div class="flex items-center gap-[4px]">
<MsIcon
:type="reviewResultMap[record.status as ReviewResult].icon"
:style="{
<!-- 表格 -->
<template v-if="showType === 'list'">
<ms-base-table
v-bind="propsRes"
:action-config="batchActions"
no-disable
filter-icon-align-left
v-on="propsEvent"
@batch-action="handleTableBatch"
>
<template #[FilterSlotNameEnum.CASE_MANAGEMENT_REVIEW_RESULT]="{ filterContent }">
<a-tag :color="reviewResultMap[filterContent.value as ReviewResult].color" class="px-[4px]" size="small">
{{ t(reviewResultMap[filterContent.value as ReviewResult].label) }}
</a-tag>
</template>
<template #[FilterSlotNameEnum.CASE_MANAGEMENT_CASE_LEVEL]="{ filterContent }">
<caseLevel :case-level="filterContent.text" />
</template>
<template #num="{ record }">
<a-tooltip :content="record.num">
<a-button type="text" class="px-0 !text-[14px] !leading-[22px]" @click="review(record)">
<div class="one-line-text max-w-[168px]">{{ record.num }}</div>
</a-button>
</a-tooltip>
</template>
<template #caseLevel="{ record }">
<span class="text-[var(--color-text-2)]"> <caseLevel :case-level="record.caseLevel" /></span>
</template>
<template #reviewNames="{ record }">
<MsTagGroup
v-if="record.showModuleTree"
:tag-list="record.reviewNames"
is-string-tag
:show-num="1"
theme="outline"
@click="record.showModuleTree = false"
/>
<MsSelect
v-else
v-model:model-value="record.reviewers"
v-model:loading="dialogLoading"
:max-tag-count="1"
class="w-full"
:options="reviewersOptions"
:search-keys="['label']"
allow-search
:multiple="true"
:placeholder="t('project.messageManagement.receiverPlaceholder')"
@change="() => changeReviewer(record)"
>
</MsSelect>
</template>
<template #status="{ record }">
<div class="flex items-center gap-[4px]">
<MsIcon
:type="reviewResultMap[record.status as ReviewResult].icon"
:style="{
color: reviewResultMap[record.status as ReviewResult].color
}"
/>
{{ t(reviewResultMap[record.status as ReviewResult].label) }}
</div>
</template>
<template #action="{ record }">
<MsButton v-permission="['CASE_REVIEW:READ+REVIEW']" type="text" class="!mr-0" @click="review(record)">
{{ t('caseManagement.caseReview.review') }}
</MsButton>
<a-divider direction="vertical" :margin="8"></a-divider>
<MsPopconfirm
:title="t('caseManagement.caseReview.disassociateTip')"
:sub-title-tip="t('caseManagement.caseReview.disassociateTipContent')"
:ok-text="t('common.confirm')"
:loading="disassociateLoading"
type="error"
@confirm="(val, done) => handleDisassociateReviewCase(record, done)"
>
<MsButton v-permission="['CASE_REVIEW:READ+RELEVANCE']" type="text" class="!mr-0">
{{ t('caseManagement.caseReview.disassociate') }}
/>
{{ t(reviewResultMap[record.status as ReviewResult].label) }}
</div>
</template>
<template #action="{ record }">
<MsButton v-permission="['CASE_REVIEW:READ+REVIEW']" type="text" class="!mr-0" @click="review(record)">
{{ t('caseManagement.caseReview.review') }}
</MsButton>
</MsPopconfirm>
</template>
<template v-if="keyword.trim() === ''" #empty>
<div class="flex w-full items-center justify-center p-[8px] text-[var(--color-text-4)]">
{{ t('caseManagement.caseReview.tableNoData') }}
<MsButton v-permission="['FUNCTIONAL_CASE:READ+ADD']" class="ml-[8px]" @click="emit('link')">
{{ t('caseManagement.featureCase.linkCase') }}
</MsButton>
</div>
</template>
</ms-base-table>
<a-divider direction="vertical" :margin="8"></a-divider>
<MsPopconfirm
:title="t('caseManagement.caseReview.disassociateTip')"
:sub-title-tip="t('caseManagement.caseReview.disassociateTipContent')"
:ok-text="t('common.confirm')"
:loading="disassociateLoading"
type="error"
@confirm="(val, done) => handleDisassociateReviewCase(record, done)"
>
<MsButton v-permission="['CASE_REVIEW:READ+RELEVANCE']" type="text" class="!mr-0">
{{ t('caseManagement.caseReview.disassociate') }}
</MsButton>
</MsPopconfirm>
</template>
<template v-if="keyword.trim() === ''" #empty>
<div class="flex w-full items-center justify-center p-[8px] text-[var(--color-text-4)]">
{{ t('caseManagement.caseReview.tableNoData') }}
<MsButton v-permission="['FUNCTIONAL_CASE:READ+ADD']" class="ml-[8px]" @click="emit('link')">
{{ t('caseManagement.featureCase.linkCase') }}
</MsButton>
</div>
</template>
</ms-base-table>
</template>
<!-- 脑图 -->
<div v-else class="h-[calc(100%-48px)] border-t border-[var(--color-text-n8)]">
<MsCaseReviewMinder
ref="msCaseReviewMinderRef"
:module-id="props.activeFolder"
:view-flag="props.onlyMine"
:view-status-flag="onlyMineStatus"
:module-tree="props.moduleTree"
:modules-count="props.modulesCount"
:pass-rate="props.passRate"
:review-pass-rule="props.reviewPassRule"
/>
</div>
<a-modal
v-model:visible="dialogVisible"
class="p-[4px]"
@ -277,6 +309,7 @@
import MsTagGroup from '@/components/pure/ms-tag/ms-tag-group.vue';
import { MsFileItem } from '@/components/pure/ms-upload/types';
import caseLevel from '@/components/business/ms-case-associate/caseLevel.vue';
import MsCaseReviewMinder from '@/components/business/ms-minders/caseReviewMinder/index.vue';
import MsSelect from '@/components/business/ms-select';
import {
@ -296,6 +329,7 @@
import useTableStore from '@/hooks/useTableStore';
import useAppStore from '@/store/modules/app';
import useUserStore from '@/store/modules/user';
import { findNodeByKey } from '@/utils';
import { hasAnyPermission } from '@/utils/permission';
import { ReviewCaseItem, ReviewItem, ReviewPassRule, ReviewResult } from '@/models/caseManagement/caseReview';
@ -312,11 +346,13 @@
});
const props = defineProps<{
activeFolder: string | number;
activeFolder: string;
onlyMine: boolean;
reviewPassRule: ReviewPassRule; //
offspringIds: string[]; // id
moduleTree: ModuleTreeNode[];
modulesCount: Record<string, number>; //
passRate: string;
}>();
const emit = defineEmits(['init', 'refresh', 'link']);
@ -327,11 +363,20 @@
const userStore = useUserStore();
const { t } = useI18n();
const { openModal } = useModal();
const keyword = ref('');
// const showType = ref<'list' | 'mind'>('list');
const filterRowCount = ref(0);
const filterConfigList = ref<FilterFormItem[]>([]);
const tableParams = ref<Record<string, any>>({});
const onlyMineStatus = ref(false);
const showType = ref<'list' | 'minder'>('list');
const msCaseReviewMinderRef = ref<InstanceType<typeof MsCaseReviewMinder>>();
const moduleNamePath = computed(() => {
return props.activeFolder === 'all'
? t('caseManagement.featureCase.allCase')
: findNodeByKey<Record<string, any>>(props.moduleTree, props.activeFolder, 'id')?.name;
});
const hasOperationPermission = computed(() =>
hasAnyPermission(['CASE_REVIEW:READ+REVIEW', 'CASE_REVIEW:READ+RELEVANCE'])
@ -491,20 +536,41 @@
searchCase();
});
function refresh() {
if (showType.value === 'list') {
searchCase();
} else {
msCaseReviewMinderRef.value?.initNodeCases();
emit('init', { moduleIds: [props.activeFolder], projectId: appStore.currentProjectId, pageSize: 10, current: 1 });
}
}
watch(
() => props.onlyMine,
() => {
searchCase();
refresh();
}
);
watch(
() => props.activeFolder,
() => {
searchCase();
if (showType.value === 'list') {
searchCase();
}
}
);
function handleShowTypeChange(val: string | number | boolean) {
if (val === 'minder') {
keyword.value = '';
//
emit('init', { moduleIds: [props.activeFolder], projectId: appStore.currentProjectId, pageSize: 10, current: 1 });
} else {
searchCase();
}
}
const batchParams = ref<BatchApiParams>({
selectIds: [],
selectAll: false,
@ -889,7 +955,7 @@
});
defineExpose({
searchCase,
refresh,
resetSelector,
});
await getCaseLevelFields();
@ -928,4 +994,10 @@
}
}
}
.list-show-type {
padding: 0;
:deep(.arco-radio-button-content) {
padding: 4px 6px;
}
}
</style>

View File

@ -120,6 +120,8 @@
:only-mine="onlyMine"
:review-pass-rule="reviewDetail.reviewPassRule"
:offspring-ids="offspringIds"
:modules-count="modulesCount"
:pass-rate="reviewDetail.status === 'PREPARED' ? '-' : `${reviewDetail.passRate}%`"
:module-tree="moduleTree"
@init="initModulesCount"
@refresh="handleRefresh"
@ -262,7 +264,7 @@
Message.success(t('caseManagement.caseReview.associateSuccess'));
await initDetail();
folderTreeRef.value?.initModules();
caseTableRef.value?.searchCase();
caseTableRef.value?.refresh();
} catch (error) {
// eslint-disable-next-line no-console
console.log(error);

View File

@ -5,6 +5,7 @@ export default {
'caseManagement.caseReview.searchPlaceholder': 'Search by ID or name',
'caseManagement.caseReview.list.searchPlaceholder': 'Search by ID, name, or tag',
'caseManagement.caseReview.archive': 'Archive',
'caseManagement.caseReview.cannotReviewTip': 'Tips: Non reviewers cannot review',
'caseManagement.caseReview.tableNoData': 'No data yet, please',
'caseManagement.caseReview.tableNoDataNoPermission': 'No data yet',
'caseManagement.caseReview.name': 'Review name',

View File

@ -5,6 +5,7 @@ export default {
'caseManagement.caseReview.searchPlaceholder': '通过 ID/名称搜索',
'caseManagement.caseReview.list.searchPlaceholder': '通过 ID/名称/标签搜索',
'caseManagement.caseReview.archive': '归档',
'caseManagement.caseReview.cannotReviewTip': 'Tips:非评审人不可评审',
'caseManagement.caseReview.tableNoData': '暂无数据,请',
'caseManagement.caseReview.tableNoDataNoPermission': '暂无数据',
'caseManagement.caseReview.name': '评审名称',