fix(组件): 更多按钮点击无反应修复&部分页面优化
This commit is contained in:
parent
f1981d1baa
commit
522a2e389e
|
@ -1,7 +1,7 @@
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: iconfont; /* Project id 3462279 */
|
font-family: iconfont; /* Project id 3462279 */
|
||||||
src: url('iconfont.woff2?t=1706424798592') format('woff2'), url('iconfont.woff?t=1706424798592') format('woff'),
|
src: url('iconfont.woff2?t=1709115886161') format('woff2'), url('iconfont.woff?t=1709115886161') format('woff'),
|
||||||
url('iconfont.ttf?t=1706424798592') format('truetype'), url('iconfont.svg?t=1706424798592#iconfont') format('svg');
|
url('iconfont.ttf?t=1709115886161') format('truetype'), url('iconfont.svg?t=1709115886161#iconfont') format('svg');
|
||||||
}
|
}
|
||||||
.iconfont {
|
.iconfont {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
@ -10,6 +10,24 @@
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
}
|
}
|
||||||
|
.icon-icon_unlink::before {
|
||||||
|
content: '\e7a1';
|
||||||
|
}
|
||||||
|
.icon-icon_unloading::before {
|
||||||
|
content: '\e7a2';
|
||||||
|
}
|
||||||
|
.icon-icon_form_one::before {
|
||||||
|
content: '\e7a0';
|
||||||
|
}
|
||||||
|
.icon-icon_aiming::before {
|
||||||
|
content: '\e79e';
|
||||||
|
}
|
||||||
|
.icon-icon_frame_select::before {
|
||||||
|
content: '\e79f';
|
||||||
|
}
|
||||||
|
.icon-icon_lower_branch::before {
|
||||||
|
content: '\e79d';
|
||||||
|
}
|
||||||
.icon-icon_swich::before {
|
.icon-icon_swich::before {
|
||||||
content: '\e79c';
|
content: '\e79c';
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -5,6 +5,48 @@
|
||||||
"css_prefix_text": "icon-",
|
"css_prefix_text": "icon-",
|
||||||
"description": "DE、MS项目icon管理",
|
"description": "DE、MS项目icon管理",
|
||||||
"glyphs": [
|
"glyphs": [
|
||||||
|
{
|
||||||
|
"icon_id": "39371890",
|
||||||
|
"name": "icon_unlink",
|
||||||
|
"font_class": "icon_unlink",
|
||||||
|
"unicode": "e7a1",
|
||||||
|
"unicode_decimal": 59297
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "39371889",
|
||||||
|
"name": "icon_unloading",
|
||||||
|
"font_class": "icon_unloading",
|
||||||
|
"unicode": "e7a2",
|
||||||
|
"unicode_decimal": 59298
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "39144507",
|
||||||
|
"name": "icon_form_one",
|
||||||
|
"font_class": "icon_form_one",
|
||||||
|
"unicode": "e7a0",
|
||||||
|
"unicode_decimal": 59296
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "39143243",
|
||||||
|
"name": "icon_aiming",
|
||||||
|
"font_class": "icon_aiming",
|
||||||
|
"unicode": "e79e",
|
||||||
|
"unicode_decimal": 59294
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "39143242",
|
||||||
|
"name": "icon_frame_select",
|
||||||
|
"font_class": "icon_frame_select",
|
||||||
|
"unicode": "e79f",
|
||||||
|
"unicode_decimal": 59295
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "39142606",
|
||||||
|
"name": "icon_lower_branch",
|
||||||
|
"font_class": "icon_lower_branch",
|
||||||
|
"unicode": "e79d",
|
||||||
|
"unicode_decimal": 59293
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"icon_id": "39108518",
|
"icon_id": "39108518",
|
||||||
"name": "icon_swich",
|
"name": "icon_swich",
|
||||||
|
|
|
@ -14,6 +14,18 @@
|
||||||
/>
|
/>
|
||||||
<missing-glyph />
|
<missing-glyph />
|
||||||
|
|
||||||
|
<glyph glyph-name="icon_unlink" unicode="" d="M699.690667 481.664l173.952-173.994667c83.413333-83.370667 88.490667-210.602667 4.053333-291.2-84.309333-80.469333-207.573333-76.629333-289.706667 5.504l-173.994666 173.994667a44.757333 44.757333 0 0 0 63.232 63.274667l173.994666-173.994667c48.298667-48.298667 116.138667-50.432 164.693334-4.053333 46.506667 44.373333 43.733333 113.92-5.546667 163.2l-173.952 173.994666a44.757333 44.757333 0 0 0 63.274667 63.274667z m-122.88-93.738667l87.04-87.04a44.757333 44.757333 0 0 0-63.317334-63.232l-86.997333 86.997334a44.757333 44.757333 0 0 0 63.274667 63.274666zM390.954667 790.741333l173.994666-173.994666a44.757333 44.757333 0 1 0-63.274666-63.274667L327.68 727.466667c-46.890667 46.933333-120.32 48.426667-163.925333 4.778666C120.106667 688.64 121.6 615.253333 168.533333 568.32l173.994667-173.994667a44.757333 44.757333 0 1 0-63.274667-63.274666L105.258667 505.045333C24.021333 586.282667 21.290667 716.373333 100.48 795.52 179.626667 874.709333 309.717333 871.978667 390.954667 790.741333zM373.845333 590.933333L460.8 503.893333a44.757333 44.757333 0 0 0-63.274667-63.274666l-87.04 87.04a44.757333 44.757333 0 1 0 63.317334 63.232z" horiz-adv-x="1024" />
|
||||||
|
|
||||||
|
<glyph glyph-name="icon_unloading" unicode="" d="M896 298.666667a42.666667 42.666667 0 0 0 42.666667-42.666667v-170.666667a42.666667 42.666667 0 0 0-42.666667-42.666666h-238.293333l33.792-33.834667a42.666667 42.666667 0 0 0 3.541333-56.32l-3.541333-4.010667a42.666667 42.666667 0 0 0-60.330667 0l-106.666667 106.666667-3.114666 3.498667a42.794667 42.794667 0 0 0-0.298667 0.341333l3.413333-3.84A43.008 43.008 0 0 0 512 84.48 42.666667 42.666667 0 0 0 512 85.333333v0.768c0 1.024 0.085333 2.048 0.170667 3.029334L512 85.333333a43.008 43.008 0 0 0 9.088 26.325334c1.066667 1.322667 2.176 2.645333 3.413333 3.84l106.666667 106.666666a42.666667 42.666667 0 0 0 60.330667-60.330666l-33.834667-33.834667H853.333333v128a42.666667 42.666667 0 0 0 37.674667 42.368L896 298.666667zM384 810.666667a42.666667 42.666667 0 0 0 32.768-15.36L510.72 682.666667H853.333333a85.333333 85.333333 0 0 0 85.12-78.933334L938.666667 597.333333v-192a42.666667 42.666667 0 0 0-85.333334 0V597.333333h-362.666666a42.666667 42.666667 0 0 0-32.768 15.36L363.946667 725.333333H128v-682.666666h320a42.666667 42.666667 0 0 0 0-85.333334H128a85.333333 85.333333 0 0 0-85.333333 85.333334V725.333333a85.333333 85.333333 0 0 0 85.333333 85.333334h256z" horiz-adv-x="1024" />
|
||||||
|
|
||||||
|
<glyph glyph-name="icon_form_one" unicode="" d="M192-42.666667A106.666667 106.666667 0 0 0 85.333333 64v640A106.666667 106.666667 0 0 0 192 810.666667h640A106.666667 106.666667 0 0 0 938.666667 704v-640a106.666667 106.666667 0 0 0-106.666667-106.666667h-640zM597.333333 554.666667H170.666667v-490.666667a21.333333 21.333333 0 0 1 21.333333-21.333333H597.333333V554.666667z m256 0h-170.666666v-512h149.333333a21.333333 21.333333 0 0 1 21.333333 21.333333V554.666667z m-256 170.666666H192a21.333333 21.333333 0 0 1-21.333333-21.333333V640h426.666666V725.333333z m234.666667 0H682.666667v-85.333333h170.666666V704a21.333333 21.333333 0 0 1-21.333333 21.333333z" horiz-adv-x="1024" />
|
||||||
|
|
||||||
|
<glyph glyph-name="icon_aiming" unicode="" d="M512 853.333333c259.2 0 469.333333-210.133333 469.333333-469.333333s-210.133333-469.333333-469.333333-469.333333S42.666667 124.8 42.666667 384 252.8 853.333333 512 853.333333z m42.666667-87.68V661.333333a42.666667 42.666667 0 0 0-85.333334 0V765.653333A384.170667 384.170667 0 0 1 130.346667 426.666667H234.666667a42.666667 42.666667 0 0 0 0-85.333334H130.346667A384.170667 384.170667 0 0 1 469.333333 2.304V106.666667a42.666667 42.666667 0 0 0 85.333334 0v-104.32a384.170667 384.170667 0 0 1 338.986666 338.944L768 341.333333a42.666667 42.666667 0 0 0 0 85.333334h125.653333a384.170667 384.170667 0 0 1-338.944 338.986666z" horiz-adv-x="1024" />
|
||||||
|
|
||||||
|
<glyph glyph-name="icon_frame_select" unicode="" d="M298.666667 810.666667a42.666667 42.666667 0 0 0 42.666666-42.666667v-42.666667h341.333334V768a42.666667 42.666667 0 0 0 42.666666 42.666667h170.666667a42.666667 42.666667 0 0 0 42.666667-42.666667v-170.666667a42.666667 42.666667 0 0 0-42.666667-42.666666h-42.666667v-341.333334h42.666667a42.666667 42.666667 0 0 0 42.666667-42.666666v-170.666667a42.666667 42.666667 0 0 0-42.666667-42.666667h-170.666667a42.666667 42.666667 0 0 0-42.666666 42.666667v42.666667H341.333333v-42.666667a42.666667 42.666667 0 0 0-42.666666-42.666667H128a42.666667 42.666667 0 0 0-42.666667 42.666667v170.666667a42.666667 42.666667 0 0 0 42.666667 42.666666h42.666667V554.666667H128a42.666667 42.666667 0 0 0-42.666667 42.666666V768a42.666667 42.666667 0 0 0 42.666667 42.666667h170.666667z m554.666666-682.666667h-85.333333v-85.333333h85.333333v85.333333zM256 128H170.666667v-85.333333h85.333333v85.333333zM682.666667 640H341.333333v-42.666667a42.666667 42.666667 0 0 0-42.666666-42.666666H256v-341.333334h42.666667a42.666667 42.666667 0 0 0 42.666666-42.666666v-42.666667h341.333334v42.666667a42.666667 42.666667 0 0 0 42.666666 42.666666h42.666667V554.666667h-42.666667a42.666667 42.666667 0 0 0-42.666666 42.666666V640zM256 725.333333H170.666667v-85.333333h85.333333V725.333333z m597.333333 0h-85.333333v-85.333333h85.333333V725.333333z" horiz-adv-x="1024" />
|
||||||
|
|
||||||
|
<glyph glyph-name="icon_lower_branch" unicode="" d="M132.736 554.666667C106.538667 554.666667 85.333333 572.288 85.333333 594.048V771.285333C85.333333 793.045333 106.538667 810.666667 132.736 810.666667h331.861333c26.197333 0 47.402667-17.621333 47.402667-39.381334v-177.237333c0-21.76-21.205333-39.381333-47.402667-39.381333H341.333333v-85.290667L597.333333 469.333333v-85.333333l-256 0.042667v-256L597.333333 128v-85.333333l-256 0.042666C294.186667 42.666667 256 80.853333 256 128V554.666667H132.736z m284.458667 177.237333H180.138667v-98.474667h237.056V731.904zM900.693333 554.666667c20.949333 0 37.930667-17.621333 37.930667-39.381334v-177.237333c0-21.76-16.981333-39.381333-37.930667-39.381333H635.306667c-20.949333 0-37.930667 17.621333-37.930667 39.381333V515.285333c0 21.76 16.981333 39.381333 37.930667 39.381334h265.472z m-37.930666-78.762667h-189.610667v-98.474667h189.610667V475.904z m37.973333-262.570667c20.906667 0 37.888-17.621333 37.888-39.381333v-177.237333c0-21.76-16.981333-39.381333-37.930667-39.381334H635.306667c-20.949333 0-37.930667 17.621333-37.930667 39.381334v177.237333c0 21.76 16.981333 39.381333 37.930667 39.381333h265.472z m-37.973333-78.762666h-189.610667v-98.474667h189.610667v98.474667z" horiz-adv-x="1024" />
|
||||||
|
|
||||||
<glyph glyph-name="icon_swich" unicode="" d="M670.165333 798.165333l256-256c1.536-1.493333 2.901333-3.114667 4.138667-4.778666l3.029333-4.693334 2.304-4.864 1.493334-4.48 1.28-6.314666L938.666667 512l-0.128-3.2-0.725334-5.376-1.28-4.736-1.877333-4.736-2.218667-4.181333-2.858666-4.096-3.413334-3.84a43.050667 43.050667 0 0 0-4.778666-4.138667l-4.693334-3.029333-4.864-2.304-4.48-1.493334-6.357333-1.28L896 469.333333H128a42.666667 42.666667 0 1 0 0 85.333334h664.96l-183.125333 183.168a42.666667 42.666667 0 1 0 60.330666 60.330666zM913.066667 341.333333a42.666667 42.666667 0 0 0 0-85.333333H248.064l183.168-183.168a42.666667 42.666667 0 0 0-60.373333-60.330667l-256 256a43.008 43.008 0 0 0-4.096 4.778667l-3.072 4.693333-2.261334 4.864-1.237333 3.498667-1.152 4.864-0.597333 5.12L102.357333 298.666667l0.128 3.2 0.554667 4.266666 0.512 2.517334 1.877333 5.845333 1.578667 3.541333 1.578667 2.858667 2.858666 4.096 3.413334 3.84 2.346666 2.133333 4.010667 3.114667 3.157333 1.92 6.101334 2.773333 3.2 1.024 3.925333 0.853334 3.584 0.512L145.066667 341.333333h768z" horiz-adv-x="1024" />
|
<glyph glyph-name="icon_swich" unicode="" d="M670.165333 798.165333l256-256c1.536-1.493333 2.901333-3.114667 4.138667-4.778666l3.029333-4.693334 2.304-4.864 1.493334-4.48 1.28-6.314666L938.666667 512l-0.128-3.2-0.725334-5.376-1.28-4.736-1.877333-4.736-2.218667-4.181333-2.858666-4.096-3.413334-3.84a43.050667 43.050667 0 0 0-4.778666-4.138667l-4.693334-3.029333-4.864-2.304-4.48-1.493334-6.357333-1.28L896 469.333333H128a42.666667 42.666667 0 1 0 0 85.333334h664.96l-183.125333 183.168a42.666667 42.666667 0 1 0 60.330666 60.330666zM913.066667 341.333333a42.666667 42.666667 0 0 0 0-85.333333H248.064l183.168-183.168a42.666667 42.666667 0 0 0-60.373333-60.330667l-256 256a43.008 43.008 0 0 0-4.096 4.778667l-3.072 4.693333-2.261334 4.864-1.237333 3.498667-1.152 4.864-0.597333 5.12L102.357333 298.666667l0.128 3.2 0.554667 4.266666 0.512 2.517334 1.877333 5.845333 1.578667 3.541333 1.578667 2.858667 2.858666 4.096 3.413334 3.84 2.346666 2.133333 4.010667 3.114667 3.157333 1.92 6.101334 2.773333 3.2 1.024 3.925333 0.853334 3.584 0.512L145.066667 341.333333h768z" horiz-adv-x="1024" />
|
||||||
|
|
||||||
<glyph glyph-name="icon_split_turn-down_arrow" unicode="" d="M832-86.528a43.434667 43.434667 0 0 0-6.357333 0.426667l-2.218667 0.426666a40.106667 40.106667 0 0 0-13.653333 5.376 44.16 44.16 0 0 0-3.157334 2.133334l-0.938666 0.725333a43.349333 43.349333 0 0 0-3.84 3.413333l-106.666667 106.666667a42.666667 42.666667 0 0 0 60.330667 60.330667l33.834666-33.834667v195.669333a128 128 0 0 1-120.490666 127.786667l-7.509334 0.213333h-341.333333v-323.626666l33.834667 33.792a42.666667 42.666667 0 0 0 56.32 3.541333l4.010666-3.541333a42.666667 42.666667 0 0 0 0-60.330667l-106.666666-106.666667a42.666667 42.666667 0 0 0-60.330667 0l-106.666667 106.666667a42.666667 42.666667 0 0 0 60.330667 60.330667l33.834667-33.834667V560.853333A149.418667 149.418667 0 0 0 277.333333 853.333333a149.333333 149.333333 0 0 0 42.666667-292.48v-92.714666h341.333333a213.333333 213.333333 0 0 0 213.333334-213.333334v-195.626666l33.834666 33.792a42.666667 42.666667 0 0 0 56.32 3.541333l4.010667-3.541333a42.666667 42.666667 0 0 0 0-60.330667l-106.666667-106.666667-3.328-2.901333-1.450666-1.237333a43.946667 43.946667 0 0 0-16.810667-7.509334l-2.261333-0.426666-2.773334-0.256h-0.085333l-0.512-0.042667 0.469333 0.042667-3.413333-0.170667zM277.333333 768a64 64 0 1 1 0-128 64 64 0 0 1 0 128z" horiz-adv-x="1024" />
|
<glyph glyph-name="icon_split_turn-down_arrow" unicode="" d="M832-86.528a43.434667 43.434667 0 0 0-6.357333 0.426667l-2.218667 0.426666a40.106667 40.106667 0 0 0-13.653333 5.376 44.16 44.16 0 0 0-3.157334 2.133334l-0.938666 0.725333a43.349333 43.349333 0 0 0-3.84 3.413333l-106.666667 106.666667a42.666667 42.666667 0 0 0 60.330667 60.330667l33.834666-33.834667v195.669333a128 128 0 0 1-120.490666 127.786667l-7.509334 0.213333h-341.333333v-323.626666l33.834667 33.792a42.666667 42.666667 0 0 0 56.32 3.541333l4.010666-3.541333a42.666667 42.666667 0 0 0 0-60.330667l-106.666666-106.666667a42.666667 42.666667 0 0 0-60.330667 0l-106.666667 106.666667a42.666667 42.666667 0 0 0 60.330667 60.330667l33.834667-33.834667V560.853333A149.418667 149.418667 0 0 0 277.333333 853.333333a149.333333 149.333333 0 0 0 42.666667-292.48v-92.714666h341.333333a213.333333 213.333333 0 0 0 213.333334-213.333334v-195.626666l33.834666 33.792a42.666667 42.666667 0 0 0 56.32 3.541333l4.010667-3.541333a42.666667 42.666667 0 0 0 0-60.330667l-106.666667-106.666667-3.328-2.901333-1.450666-1.237333a43.946667 43.946667 0 0 0-16.810667-7.509334l-2.261333-0.426666-2.773334-0.256h-0.085333l-0.512-0.042667 0.469333 0.042667-3.413333-0.170667zM277.333333 768a64 64 0 1 1 0-128 64 64 0 0 1 0 128z" horiz-adv-x="1024" />
|
||||||
|
|
Before Width: | Height: | Size: 430 KiB After Width: | Height: | Size: 436 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -19,7 +19,13 @@
|
||||||
<icon-upload class="mr-[8px]" />{{ t('ms.add.attachment.localUpload') }}
|
<icon-upload class="mr-[8px]" />{{ t('ms.add.attachment.localUpload') }}
|
||||||
</a-button>
|
</a-button>
|
||||||
</MsUpload>
|
</MsUpload>
|
||||||
<a-button size="small" type="text" class="ms-add-attachment-dropdown-btn" @click="emit('linkFile')">
|
<a-button
|
||||||
|
v-permission="['PROJECT_FILE_MANAGEMENT:READ']"
|
||||||
|
size="small"
|
||||||
|
type="text"
|
||||||
|
class="ms-add-attachment-dropdown-btn"
|
||||||
|
@click="emit('linkFile')"
|
||||||
|
>
|
||||||
<MsIcon type="icon-icon_link-copy_outlined" class="mr-[8px]" size="16" />
|
<MsIcon type="icon-icon_link-copy_outlined" class="mr-[8px]" size="16" />
|
||||||
{{ t('ms.add.attachment.associateFile') }}
|
{{ t('ms.add.attachment.associateFile') }}
|
||||||
</a-button>
|
</a-button>
|
||||||
|
@ -28,6 +34,7 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import MsIcon from '@/components/pure/ms-icon-font/index.vue';
|
||||||
import MsUpload from '@/components/pure/ms-upload/index.vue';
|
import MsUpload from '@/components/pure/ms-upload/index.vue';
|
||||||
import { MsFileItem } from '@/components/pure/ms-upload/types';
|
import { MsFileItem } from '@/components/pure/ms-upload/types';
|
||||||
|
|
||||||
|
|
|
@ -77,10 +77,17 @@
|
||||||
<MsButton type="text" @click="clearDeletedFiles">{{ t('ms.add.attachment.quickClear') }}</MsButton>
|
<MsButton type="text" @click="clearDeletedFiles">{{ t('ms.add.attachment.quickClear') }}</MsButton>
|
||||||
</div>
|
</div>
|
||||||
<div class="file-list">
|
<div class="file-list">
|
||||||
<div v-for="file of alreadyDeleteFiles" :key="file.value">
|
<div v-for="file of alreadyDeleteFiles" :key="file.value" class="file-list-item">
|
||||||
<MsTag size="small" max-width="100%" closable @close="handleClose(file)">
|
<a-tooltip :content="file.name" :mouse-enter-delay="300">
|
||||||
{{ file.label }}
|
<MsTag size="small" max-width="100%">
|
||||||
</MsTag>
|
{{ file.name }}
|
||||||
|
</MsTag>
|
||||||
|
</a-tooltip>
|
||||||
|
<a-tooltip :content="t('ms.add.attachment.remove')">
|
||||||
|
<MsButton type="text" status="secondary" @click="handleClose(file)">
|
||||||
|
<MsIcon type="icon-icon_unlink" class="hover:text-[rgb(var(--primary-5))]" size="16" />
|
||||||
|
</MsButton>
|
||||||
|
</a-tooltip>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -89,10 +96,34 @@
|
||||||
{{ t('ms.add.attachment.other') }}
|
{{ t('ms.add.attachment.other') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="file-list">
|
<div class="file-list">
|
||||||
<div v-for="file of otherFiles" :key="file.value">
|
<div v-for="file of otherFiles" :key="file.value" class="file-list-item">
|
||||||
<MsTag size="small" max-width="100%" closable @close="handleClose(file)">
|
<a-tooltip :content="file.name" :mouse-enter-delay="300">
|
||||||
{{ file.label }}
|
<MsTag size="small" max-width="100%">
|
||||||
</MsTag>
|
{{ file.name }}
|
||||||
|
</MsTag>
|
||||||
|
</a-tooltip>
|
||||||
|
<div v-if="file.local === true" class="flex items-center">
|
||||||
|
<a-tooltip :content="t('ms.add.attachment.saveAs')">
|
||||||
|
<MsButton type="text" status="secondary" class="!mr-0" @click="handleClose(file)">
|
||||||
|
<MsIcon type="icon-icon_unloading" class="hover:text-[rgb(var(--primary-5))]" size="16" />
|
||||||
|
</MsButton>
|
||||||
|
</a-tooltip>
|
||||||
|
<a-divider direction="vertical" :margin="4"></a-divider>
|
||||||
|
<a-tooltip :content="t('ms.add.attachment.remove')">
|
||||||
|
<MsButton type="text" status="secondary" @click="handleClose(file)">
|
||||||
|
<MsIcon
|
||||||
|
type="icon-icon_delete-trash_outlined"
|
||||||
|
class="hover:text-[rgb(var(--primary-5))]"
|
||||||
|
size="16"
|
||||||
|
/>
|
||||||
|
</MsButton>
|
||||||
|
</a-tooltip>
|
||||||
|
</div>
|
||||||
|
<a-tooltip v-else :content="t('ms.add.attachment.cancelAssociate')">
|
||||||
|
<MsButton type="text" status="secondary" @click="handleClose(file)">
|
||||||
|
<MsIcon type="icon-icon_unlink" class="hover:text-[rgb(var(--primary-5))]" size="16" />
|
||||||
|
</MsButton>
|
||||||
|
</a-tooltip>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -129,6 +160,7 @@
|
||||||
import { TagData } from '@arco-design/web-vue';
|
import { TagData } from '@arco-design/web-vue';
|
||||||
|
|
||||||
import MsButton from '@/components/pure/ms-button/index.vue';
|
import MsButton from '@/components/pure/ms-button/index.vue';
|
||||||
|
import MsIcon from '@/components/pure/ms-icon-font/index.vue';
|
||||||
import MsTag, { Size } from '@/components/pure/ms-tag/ms-tag.vue';
|
import MsTag, { Size } from '@/components/pure/ms-tag/ms-tag.vue';
|
||||||
import MsTagsInput from '@/components/pure/ms-tags-input/index.vue';
|
import MsTagsInput from '@/components/pure/ms-tags-input/index.vue';
|
||||||
import type { MsFileItem } from '@/components/pure/ms-upload/types';
|
import type { MsFileItem } from '@/components/pure/ms-upload/types';
|
||||||
|
@ -215,6 +247,7 @@
|
||||||
...item,
|
...item,
|
||||||
value: item?.uid || '',
|
value: item?.uid || '',
|
||||||
label: item?.name || '',
|
label: item?.name || '',
|
||||||
|
local: true,
|
||||||
}));
|
}));
|
||||||
} else {
|
} else {
|
||||||
inputFileName.value = fileItem.name || '';
|
inputFileName.value = fileItem.name || '';
|
||||||
|
@ -305,7 +338,12 @@
|
||||||
.ms-scroll-bar();
|
.ms-scroll-bar();
|
||||||
|
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
max-height: 100px;
|
max-height: 200px;
|
||||||
|
.file-list-item {
|
||||||
|
@apply flex items-center justify-between;
|
||||||
|
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
:deep(.arco-input-tag-has-prefix) {
|
:deep(.arco-input-tag-has-prefix) {
|
||||||
padding-left: 4px;
|
padding-left: 4px;
|
||||||
|
|
|
@ -4,4 +4,7 @@ export default {
|
||||||
'ms.add.attachment.alreadyDelete': 'Deleted files',
|
'ms.add.attachment.alreadyDelete': 'Deleted files',
|
||||||
'ms.add.attachment.other': 'Other files',
|
'ms.add.attachment.other': 'Other files',
|
||||||
'ms.add.attachment.quickClear': 'Clear',
|
'ms.add.attachment.quickClear': 'Clear',
|
||||||
|
'ms.add.attachment.remove': 'Remove',
|
||||||
|
'ms.add.attachment.cancelAssociate': 'Disassociate',
|
||||||
|
'ms.add.attachment.saveAs': 'Save',
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,4 +4,7 @@ export default {
|
||||||
'ms.add.attachment.alreadyDelete': '已被删除文件',
|
'ms.add.attachment.alreadyDelete': '已被删除文件',
|
||||||
'ms.add.attachment.other': '其他文件',
|
'ms.add.attachment.other': '其他文件',
|
||||||
'ms.add.attachment.quickClear': '一键移除',
|
'ms.add.attachment.quickClear': '一键移除',
|
||||||
|
'ms.add.attachment.remove': '移除',
|
||||||
|
'ms.add.attachment.cancelAssociate': '取消关联',
|
||||||
|
'ms.add.attachment.saveAs': '转存',
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,13 +6,13 @@
|
||||||
@select="selectHandler"
|
@select="selectHandler"
|
||||||
@popup-visible-change="visibleChange"
|
@popup-visible-change="visibleChange"
|
||||||
>
|
>
|
||||||
<div :class="['ms-more-action-trigger-content', visible ? 'ms-more-action-trigger-content--focus' : '']">
|
<slot>
|
||||||
<slot>
|
<div :class="['ms-more-action-trigger-content', visible ? 'ms-more-action-trigger-content--focus' : '']">
|
||||||
<MsButton type="text" size="mini" class="more-icon-btn">
|
<MsButton type="text" size="mini" class="more-icon-btn">
|
||||||
<MsIcon type="icon-icon_more_outlined" size="16" class="text-[var(--color-text-4)]" />
|
<MsIcon type="icon-icon_more_outlined" size="16" class="text-[var(--color-text-4)]" />
|
||||||
</MsButton>
|
</MsButton>
|
||||||
</slot>
|
</div>
|
||||||
</div>
|
</slot>
|
||||||
<template #content>
|
<template #content>
|
||||||
<template v-for="item of props.list">
|
<template v-for="item of props.list">
|
||||||
<a-divider
|
<a-divider
|
||||||
|
|
|
@ -35,11 +35,27 @@ export const pathMap: PathMapItem[] = [
|
||||||
level: MENU_LEVEL[2],
|
level: MENU_LEVEL[2],
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
key: 'API_TEST_DEBUG', // 接口测试-接口调试
|
key: 'API_TEST_DEBUG_MANAGEMENT', // 接口测试-接口调试
|
||||||
locale: 'menu.apiTest.debug',
|
locale: 'menu.apiTest.debug',
|
||||||
route: RouteEnum.API_TEST_DEBUG,
|
route: RouteEnum.API_TEST_DEBUG_MANAGEMENT,
|
||||||
permission: [],
|
permission: [],
|
||||||
level: MENU_LEVEL[2],
|
level: MENU_LEVEL[2],
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
key: 'API_TEST_DEBUG_MANAGEMENT_MODULE', // 接口测试-接口调试-模块
|
||||||
|
locale: 'common.module',
|
||||||
|
route: RouteEnum.API_TEST_DEBUG_MANAGEMENT,
|
||||||
|
permission: [],
|
||||||
|
level: MENU_LEVEL[2],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'API_TEST_DEBUG_MANAGEMENT_DEBUG', // 接口测试-接口调试-调试
|
||||||
|
locale: 'menu.apiTest.debug.debug',
|
||||||
|
route: RouteEnum.API_TEST_DEBUG_MANAGEMENT,
|
||||||
|
permission: [],
|
||||||
|
level: MENU_LEVEL[2],
|
||||||
|
},
|
||||||
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'API_TEST_MANAGEMENT', // 接口测试-接口管理
|
key: 'API_TEST_MANAGEMENT', // 接口测试-接口管理
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
export enum ApiTestRouteEnum {
|
export enum ApiTestRouteEnum {
|
||||||
API_TEST = 'apiTest',
|
API_TEST = 'apiTest',
|
||||||
API_TEST_DEBUG = 'apiTestDebug',
|
API_TEST_DEBUG_MANAGEMENT = 'apiTestDebug',
|
||||||
API_TEST_MANAGEMENT = 'apiTestManagement',
|
API_TEST_MANAGEMENT = 'apiTestManagement',
|
||||||
API_TEST_REPORT = 'apiTestReport',
|
API_TEST_REPORT = 'apiTestReport',
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,9 +71,36 @@ export default function usePathMap() {
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过 key 查找对应的 locale 路径
|
||||||
|
*/
|
||||||
|
const findLocalePath = (targetKey: string) => {
|
||||||
|
function getLocalePathArr(trees: PathMapItem[], path: string[] = []): string[] {
|
||||||
|
for (let i = 0; i < trees.length; i++) {
|
||||||
|
const node = trees[i];
|
||||||
|
const newPathArr = [...path, node.locale];
|
||||||
|
|
||||||
|
if (node.key === targetKey) {
|
||||||
|
return newPathArr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetKey.startsWith(node.key) && node.children) {
|
||||||
|
const result = getLocalePathArr(node.children, newPathArr);
|
||||||
|
if (result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return getLocalePathArr(pathMap);
|
||||||
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
getPathMapByLevel,
|
getPathMapByLevel,
|
||||||
jumpRouteByMapKey,
|
jumpRouteByMapKey,
|
||||||
getRouteLevelByKey,
|
getRouteLevelByKey,
|
||||||
|
findLocalePath,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,4 +121,5 @@ export default {
|
||||||
'common.stay': 'Stay',
|
'common.stay': 'Stay',
|
||||||
'common.apply': 'Apply',
|
'common.apply': 'Apply',
|
||||||
'common.stop': 'Stop',
|
'common.stop': 'Stop',
|
||||||
|
'common.module': 'Module',
|
||||||
};
|
};
|
||||||
|
|
|
@ -25,6 +25,7 @@ export default {
|
||||||
'menu.caseManagement': 'Case Management',
|
'menu.caseManagement': 'Case Management',
|
||||||
'menu.apiTest': 'API Test',
|
'menu.apiTest': 'API Test',
|
||||||
'menu.apiTest.debug': 'API debug',
|
'menu.apiTest.debug': 'API debug',
|
||||||
|
'menu.apiTest.debug.debug': 'Debug',
|
||||||
'menu.apiTest.management': 'API Management',
|
'menu.apiTest.management': 'API Management',
|
||||||
'menu.apiTest.report': 'API Report',
|
'menu.apiTest.report': 'API Report',
|
||||||
'menu.uiTest': 'UI Test',
|
'menu.uiTest': 'UI Test',
|
||||||
|
|
|
@ -124,4 +124,5 @@ export default {
|
||||||
'common.stay': '留下',
|
'common.stay': '留下',
|
||||||
'common.apply': '应用',
|
'common.apply': '应用',
|
||||||
'common.stop': '停止',
|
'common.stop': '停止',
|
||||||
|
'common.module': '模块',
|
||||||
};
|
};
|
||||||
|
|
|
@ -25,6 +25,7 @@ export default {
|
||||||
'menu.caseManagement': '用例管理',
|
'menu.caseManagement': '用例管理',
|
||||||
'menu.apiTest': '接口测试',
|
'menu.apiTest': '接口测试',
|
||||||
'menu.apiTest.debug': '接口调试',
|
'menu.apiTest.debug': '接口调试',
|
||||||
|
'menu.apiTest.debug.debug': '调试',
|
||||||
'menu.apiTest.management': '接口管理',
|
'menu.apiTest.management': '接口管理',
|
||||||
'menu.apiTest.report': '接口报告',
|
'menu.apiTest.report': '接口报告',
|
||||||
'menu.uiTest': 'UI测试',
|
'menu.uiTest': 'UI测试',
|
||||||
|
|
|
@ -25,7 +25,7 @@ const ApiTest: AppRouteRecordRaw = {
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: 'debug',
|
path: 'debug',
|
||||||
name: ApiTestRouteEnum.API_TEST_DEBUG,
|
name: ApiTestRouteEnum.API_TEST_DEBUG_MANAGEMENT,
|
||||||
component: () => import('@/views/api-test/debug/index.vue'),
|
component: () => import('@/views/api-test/debug/index.vue'),
|
||||||
meta: {
|
meta: {
|
||||||
locale: 'menu.apiTest.debug',
|
locale: 'menu.apiTest.debug',
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
/>
|
/>
|
||||||
<template #content>
|
<template #content>
|
||||||
<div>{{ t('apiTestDebug.batchAddParamsTip1') }}</div>
|
<div>{{ t('apiTestDebug.batchAddParamsTip1') }}</div>
|
||||||
<div>{{ t('apiTestDebug.batchAddParamsTip2') }}</div>
|
<div v-if="!props.noParamType">{{ t('apiTestDebug.batchAddParamsTip2') }}</div>
|
||||||
<div>{{ t('apiTestDebug.batchAddParamsTip3') }}</div>
|
<div>{{ t('apiTestDebug.batchAddParamsTip3') }}</div>
|
||||||
</template>
|
</template>
|
||||||
</a-tooltip>
|
</a-tooltip>
|
||||||
|
@ -48,10 +48,16 @@
|
||||||
|
|
||||||
import { useI18n } from '@/hooks/useI18n';
|
import { useI18n } from '@/hooks/useI18n';
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = withDefaults(
|
||||||
params: Record<string, any>[];
|
defineProps<{
|
||||||
defaultParamItem?: Record<string, any>; // 默认参数项
|
params: Record<string, any>[];
|
||||||
}>();
|
defaultParamItem?: Record<string, any>; // 默认参数项
|
||||||
|
noParamType?: boolean; // 是否有参数类型
|
||||||
|
}>(),
|
||||||
|
{
|
||||||
|
noParamType: false,
|
||||||
|
}
|
||||||
|
);
|
||||||
const emit = defineEmits<{
|
const emit = defineEmits<{
|
||||||
(e: 'apply', resultArr: (Record<string, any> | null)[]): void;
|
(e: 'apply', resultArr: (Record<string, any> | null)[]): void;
|
||||||
}>();
|
}>();
|
||||||
|
|
|
@ -972,7 +972,7 @@
|
||||||
@apply invisible;
|
@apply invisible;
|
||||||
}
|
}
|
||||||
.arco-select-view-value {
|
.arco-select-view-value {
|
||||||
color: var(--color-text-brand);
|
color: var(--color-text-1);
|
||||||
}
|
}
|
||||||
.arco-select {
|
.arco-select {
|
||||||
border-color: transparent !important;
|
border-color: transparent !important;
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
<batchAddKeyVal
|
<batchAddKeyVal
|
||||||
:params="innerParams"
|
:params="innerParams"
|
||||||
:default-param-item="defaultHeaderParamsItem"
|
:default-param-item="defaultHeaderParamsItem"
|
||||||
|
no-param-type
|
||||||
@apply="handleBatchParamApply"
|
@apply="handleBatchParamApply"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
<div class="ml-[16px]">
|
<div class="ml-[16px]">
|
||||||
<a-dropdown-button
|
<a-dropdown-button
|
||||||
v-if="!requestVModel.executeLoading"
|
v-if="!requestVModel.executeLoading"
|
||||||
|
v-permission="[props.permissionMap.execute]"
|
||||||
:disabled="requestVModel.executeLoading || (isHttpProtocol && !requestVModel.url)"
|
:disabled="requestVModel.executeLoading || (isHttpProtocol && !requestVModel.url)"
|
||||||
class="exec-btn"
|
class="exec-btn"
|
||||||
@click="() => execute(isPriorityLocalExec ? 'localExec' : 'serverExec')"
|
@click="() => execute(isPriorityLocalExec ? 'localExec' : 'serverExec')"
|
||||||
|
@ -70,6 +71,7 @@
|
||||||
<a-button v-else type="primary" class="mr-[12px]" @click="stopDebug">{{ t('common.stop') }}</a-button>
|
<a-button v-else type="primary" class="mr-[12px]" @click="stopDebug">{{ t('common.stop') }}</a-button>
|
||||||
<a-dropdown
|
<a-dropdown
|
||||||
v-if="props.isDefinition"
|
v-if="props.isDefinition"
|
||||||
|
v-permission="[props.permissionMap.create, props.permissionMap.update]"
|
||||||
:loading="saveLoading || (isHttpProtocol && !requestVModel.url)"
|
:loading="saveLoading || (isHttpProtocol && !requestVModel.url)"
|
||||||
@select="handleSelect"
|
@select="handleSelect"
|
||||||
>
|
>
|
||||||
|
@ -83,6 +85,7 @@
|
||||||
</a-dropdown>
|
</a-dropdown>
|
||||||
<a-button
|
<a-button
|
||||||
v-else
|
v-else
|
||||||
|
v-permission="[props.permissionMap.create, props.permissionMap.update]"
|
||||||
type="secondary"
|
type="secondary"
|
||||||
:disabled="isHttpProtocol && !requestVModel.url"
|
:disabled="isHttpProtocol && !requestVModel.url"
|
||||||
:loading="saveLoading"
|
:loading="saveLoading"
|
||||||
|
@ -289,6 +292,7 @@
|
||||||
import { filterTree, getGenerateId, parseQueryParams } from '@/utils';
|
import { filterTree, getGenerateId, parseQueryParams } from '@/utils';
|
||||||
import { scrollIntoView } from '@/utils/dom';
|
import { scrollIntoView } from '@/utils/dom';
|
||||||
import { registerCatchSaveShortcut, removeCatchSaveShortcut } from '@/utils/event';
|
import { registerCatchSaveShortcut, removeCatchSaveShortcut } from '@/utils/event';
|
||||||
|
import { hasAnyPermission } from '@/utils/permission';
|
||||||
|
|
||||||
import { PluginConfig } from '@/models/apiTest/common';
|
import { PluginConfig } from '@/models/apiTest/common';
|
||||||
import { ExecuteHTTPRequestFullParams } from '@/models/apiTest/debug';
|
import { ExecuteHTTPRequestFullParams } from '@/models/apiTest/debug';
|
||||||
|
@ -333,6 +337,11 @@
|
||||||
createApi: (...args) => Promise<any>; // 创建接口
|
createApi: (...args) => Promise<any>; // 创建接口
|
||||||
updateApi: (...args) => Promise<any>; // 更新接口
|
updateApi: (...args) => Promise<any>; // 更新接口
|
||||||
uploadTempFileApi?: (...args) => Promise<any>; // 上传临时文件接口
|
uploadTempFileApi?: (...args) => Promise<any>; // 上传临时文件接口
|
||||||
|
permissionMap: {
|
||||||
|
execute: string;
|
||||||
|
create: string;
|
||||||
|
update: string;
|
||||||
|
};
|
||||||
}>();
|
}>();
|
||||||
const emit = defineEmits(['addDone']);
|
const emit = defineEmits(['addDone']);
|
||||||
|
|
||||||
|
@ -892,29 +901,33 @@
|
||||||
|
|
||||||
async function handleSaveShortcut() {
|
async function handleSaveShortcut() {
|
||||||
if (!requestVModel.value.isNew) {
|
if (!requestVModel.value.isNew) {
|
||||||
// 更新接口不需要弹窗,直接更新保存
|
if (hasAnyPermission([props.permissionMap.update])) {
|
||||||
updateDebug();
|
// 更新接口不需要弹窗,直接更新保存
|
||||||
|
updateDebug();
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
if (hasAnyPermission([props.permissionMap.create])) {
|
||||||
if (!isHttpProtocol.value) {
|
try {
|
||||||
// 插件需要校验动态表单
|
if (!isHttpProtocol.value) {
|
||||||
await fApi.value?.validate();
|
// 插件需要校验动态表单
|
||||||
|
await fApi.value?.validate();
|
||||||
|
}
|
||||||
|
saveModalForm.value = {
|
||||||
|
name: requestVModel.value.name || '',
|
||||||
|
path: requestVModel.value.url || '',
|
||||||
|
moduleId: 'root',
|
||||||
|
};
|
||||||
|
saveModalVisible.value = true;
|
||||||
|
} catch (error) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(error);
|
||||||
|
// 校验不通过则不进行保存
|
||||||
|
requestVModel.value.activeTab = RequestComposition.PLUGIN;
|
||||||
|
nextTick(() => {
|
||||||
|
scrollIntoView(document.querySelector('.arco-form-item-message'), { block: 'center' });
|
||||||
|
});
|
||||||
}
|
}
|
||||||
saveModalForm.value = {
|
|
||||||
name: requestVModel.value.name || '',
|
|
||||||
path: requestVModel.value.url || '',
|
|
||||||
moduleId: 'root',
|
|
||||||
};
|
|
||||||
saveModalVisible.value = true;
|
|
||||||
} catch (error) {
|
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.log(error);
|
|
||||||
// 校验不通过则不进行保存
|
|
||||||
requestVModel.value.activeTab = RequestComposition.PLUGIN;
|
|
||||||
nextTick(() => {
|
|
||||||
scrollIntoView(document.querySelector('.arco-form-item-message'), { block: 'center' });
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -139,7 +139,6 @@
|
||||||
: tabMoreActionList
|
: tabMoreActionList
|
||||||
"
|
"
|
||||||
class="response-more-action"
|
class="response-more-action"
|
||||||
icon-mode="hide"
|
|
||||||
@select="(e) => handleMoreActionSelect(e, tab as ResponseItem)"
|
@select="(e) => handleMoreActionSelect(e, tab as ResponseItem)"
|
||||||
/>
|
/>
|
||||||
<popConfirm
|
<popConfirm
|
||||||
|
|
|
@ -3,10 +3,16 @@
|
||||||
<div class="mb-[8px] flex items-center gap-[8px]">
|
<div class="mb-[8px] flex items-center gap-[8px]">
|
||||||
<a-input v-model:model-value="moduleKeyword" :placeholder="t('apiTestDebug.searchTip')" allow-clear />
|
<a-input v-model:model-value="moduleKeyword" :placeholder="t('apiTestDebug.searchTip')" allow-clear />
|
||||||
<a-dropdown @select="handleSelect">
|
<a-dropdown @select="handleSelect">
|
||||||
<a-button type="primary">{{ t('apiTestDebug.newApi') }}</a-button>
|
<a-button v-permission="['PROJECT_API_DEBUG:READ+ADD', 'PROJECT_API_DEBUG:READ+IMPORT']" type="primary">
|
||||||
|
{{ t('apiTestDebug.newApi') }}
|
||||||
|
</a-button>
|
||||||
<template #content>
|
<template #content>
|
||||||
<a-doption value="newApi">{{ t('apiTestDebug.newApi') }}</a-doption>
|
<a-doption v-permission="['PROJECT_API_DEBUG:READ+ADD']" value="newApi">
|
||||||
<a-doption value="import">{{ t('apiTestDebug.importApi') }}</a-doption>
|
{{ t('apiTestDebug.newApi') }}
|
||||||
|
</a-doption>
|
||||||
|
<a-doption v-permission="['PROJECT_API_DEBUG:READ+IMPORT']" value="import">
|
||||||
|
{{ t('apiTestDebug.importApi') }}
|
||||||
|
</a-doption>
|
||||||
</template>
|
</template>
|
||||||
</a-dropdown>
|
</a-dropdown>
|
||||||
</div>
|
</div>
|
||||||
|
@ -23,7 +29,7 @@
|
||||||
</MsButton>
|
</MsButton>
|
||||||
</a-tooltip>
|
</a-tooltip>
|
||||||
<popConfirm mode="add" :all-names="rootModulesName" parent-id="NONE" @add-finish="initModules">
|
<popConfirm mode="add" :all-names="rootModulesName" parent-id="NONE" @add-finish="initModules">
|
||||||
<MsButton type="icon" class="!mr-0 p-[2px]">
|
<MsButton v-permission="['PROJECT_API_DEBUG:READ+ADD']" type="icon" class="!mr-0 p-[2px]">
|
||||||
<MsIcon
|
<MsIcon
|
||||||
type="icon-icon_create_planarity"
|
type="icon-icon_create_planarity"
|
||||||
size="18"
|
size="18"
|
||||||
|
@ -56,7 +62,7 @@
|
||||||
children: 'children',
|
children: 'children',
|
||||||
count: 'count',
|
count: 'count',
|
||||||
}"
|
}"
|
||||||
:draggable="true"
|
:draggable="hasAnyPermission(['PROJECT_API_DEBUG:READ+UPDATE'])"
|
||||||
:selectable="nodeSelectable"
|
:selectable="nodeSelectable"
|
||||||
block-node
|
block-node
|
||||||
title-tooltip-position="left"
|
title-tooltip-position="left"
|
||||||
|
@ -82,6 +88,7 @@
|
||||||
<template #extra="nodeData">
|
<template #extra="nodeData">
|
||||||
<popConfirm
|
<popConfirm
|
||||||
v-if="nodeData.id !== 'root'"
|
v-if="nodeData.id !== 'root'"
|
||||||
|
v-permission="['PROJECT_API_DEBUG:READ+UPDATE']"
|
||||||
mode="rename"
|
mode="rename"
|
||||||
:parent-id="nodeData.id"
|
:parent-id="nodeData.id"
|
||||||
:node-id="nodeData.id"
|
:node-id="nodeData.id"
|
||||||
|
@ -96,6 +103,7 @@
|
||||||
<!-- 默认模块的 id 是root,默认模块不可编辑、不可添加子模块;API不可添加子模块 -->
|
<!-- 默认模块的 id 是root,默认模块不可编辑、不可添加子模块;API不可添加子模块 -->
|
||||||
<popConfirm
|
<popConfirm
|
||||||
v-if="nodeData.id !== 'root' && nodeData.type !== 'API'"
|
v-if="nodeData.id !== 'root' && nodeData.type !== 'API'"
|
||||||
|
v-permission="['PROJECT_API_DEBUG:READ+ADD']"
|
||||||
mode="add"
|
mode="add"
|
||||||
:all-names="(nodeData.children || []).map((e: ModuleTreeNode) => e.name || '')"
|
:all-names="(nodeData.children || []).map((e: ModuleTreeNode) => e.name || '')"
|
||||||
:parent-id="nodeData.id"
|
:parent-id="nodeData.id"
|
||||||
|
@ -137,6 +145,7 @@
|
||||||
import useModal from '@/hooks/useModal';
|
import useModal from '@/hooks/useModal';
|
||||||
import useAppStore from '@/store/modules/app';
|
import useAppStore from '@/store/modules/app';
|
||||||
import { mapTree } from '@/utils';
|
import { mapTree } from '@/utils';
|
||||||
|
import { hasAnyPermission } from '@/utils/permission';
|
||||||
|
|
||||||
import { ModuleTreeNode } from '@/models/common';
|
import { ModuleTreeNode } from '@/models/common';
|
||||||
|
|
||||||
|
@ -206,11 +215,13 @@
|
||||||
{
|
{
|
||||||
label: 'common.rename',
|
label: 'common.rename',
|
||||||
eventTag: 'rename',
|
eventTag: 'rename',
|
||||||
|
permission: ['PROJECT_API_DEBUG:READ+UPDATE'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'common.delete',
|
label: 'common.delete',
|
||||||
eventTag: 'delete',
|
eventTag: 'delete',
|
||||||
danger: true,
|
danger: true,
|
||||||
|
permission: ['PROJECT_API_DEBUG:READ+DELETE'],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
const renamePopVisible = ref(false);
|
const renamePopVisible = ref(false);
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
v-model:active-tab="activeDebug"
|
v-model:active-tab="activeDebug"
|
||||||
v-model:tabs="debugTabs"
|
v-model:tabs="debugTabs"
|
||||||
:limit="10"
|
:limit="10"
|
||||||
|
:readonly="!hasAnyPermission(['PROJECT_API_DEBUG:READ+ADD'])"
|
||||||
at-least-one
|
at-least-one
|
||||||
@add="addDebugTab"
|
@add="addDebugTab"
|
||||||
>
|
>
|
||||||
|
@ -40,6 +41,11 @@
|
||||||
:execute-api="executeDebug"
|
:execute-api="executeDebug"
|
||||||
:local-execute-api="localExecuteApiDebug"
|
:local-execute-api="localExecuteApiDebug"
|
||||||
:upload-temp-file-api="uploadTempFile"
|
:upload-temp-file-api="uploadTempFile"
|
||||||
|
:permission-map="{
|
||||||
|
execute: 'PROJECT_API_DEBUG:READ+EXECUTE',
|
||||||
|
update: 'PROJECT_API_DEBUG:READ+UPDATE',
|
||||||
|
create: 'PROJECT_API_DEBUG:READ+ADD',
|
||||||
|
}"
|
||||||
@add-done="handleDebugAddDone"
|
@add-done="handleDebugAddDone"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -105,6 +111,7 @@
|
||||||
import { useI18n } from '@/hooks/useI18n';
|
import { useI18n } from '@/hooks/useI18n';
|
||||||
import useModal from '@/hooks/useModal';
|
import useModal from '@/hooks/useModal';
|
||||||
import { parseCurlScript } from '@/utils';
|
import { parseCurlScript } from '@/utils';
|
||||||
|
import { hasAnyPermission } from '@/utils/permission';
|
||||||
|
|
||||||
import { ExecuteBody } from '@/models/apiTest/debug';
|
import { ExecuteBody } from '@/models/apiTest/debug';
|
||||||
import { ModuleTreeNode } from '@/models/common';
|
import { ModuleTreeNode } from '@/models/common';
|
||||||
|
@ -352,7 +359,11 @@
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
let isLeaving = false;
|
let isLeaving = false;
|
||||||
onBeforeRouteLeave((to, from, next) => {
|
onBeforeRouteLeave((to, from, next) => {
|
||||||
if (!isLeaving && debugTabs.value.some((tab) => tab.unSaved)) {
|
if (
|
||||||
|
!isLeaving &&
|
||||||
|
debugTabs.value.some((tab) => tab.unSaved) &&
|
||||||
|
hasAnyPermission(['PROJECT_API_DEBUG:READ+ADD', 'PROJECT_API_DEBUG:READ+UPDATE'])
|
||||||
|
) {
|
||||||
isLeaving = true;
|
isLeaving = true;
|
||||||
// 如果有未保存的调试则提示用户
|
// 如果有未保存的调试则提示用户
|
||||||
openModal({
|
openModal({
|
||||||
|
|
|
@ -25,6 +25,11 @@
|
||||||
:update-api="updateDebug"
|
:update-api="updateDebug"
|
||||||
:execute-api="executeDebug"
|
:execute-api="executeDebug"
|
||||||
:local-execute-api="localExecuteApiDebug"
|
:local-execute-api="localExecuteApiDebug"
|
||||||
|
:permission-map="{
|
||||||
|
execute: 'PROJECT_API_DEFINITION:READ+EXECUTE',
|
||||||
|
update: 'PROJECT_API_DEFINITION:READ+UPDATE',
|
||||||
|
create: 'PROJECT_API_DEFINITION:READ+ADD',
|
||||||
|
}"
|
||||||
is-definition
|
is-definition
|
||||||
@add-done="emit('addDone')"
|
@add-done="emit('addDone')"
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
:default-expand-all="isExpandAll"
|
:default-expand-all="isExpandAll"
|
||||||
:expand-all="isExpandAll"
|
:expand-all="isExpandAll"
|
||||||
:empty-text="t('caseManagement.caseReview.noReviews')"
|
:empty-text="t('caseManagement.caseReview.noReviews')"
|
||||||
:draggable="!props.isModal"
|
:draggable="!props.isModal && hasAnyPermission(['CASE_REVIEW:READ+UPDATE'])"
|
||||||
:virtual-list-props="virtualListProps"
|
:virtual-list-props="virtualListProps"
|
||||||
:field-names="{
|
:field-names="{
|
||||||
title: 'name',
|
title: 'name',
|
||||||
|
@ -66,6 +66,7 @@
|
||||||
<!-- 默认模块的 id 是root,默认模块不可编辑、不可添加子模块 -->
|
<!-- 默认模块的 id 是root,默认模块不可编辑、不可添加子模块 -->
|
||||||
<popConfirm
|
<popConfirm
|
||||||
v-if="nodeData.id !== 'root'"
|
v-if="nodeData.id !== 'root'"
|
||||||
|
v-permission="['CASE_REVIEW:READ+ADD']"
|
||||||
mode="add"
|
mode="add"
|
||||||
:all-names="(nodeData.children || []).map((e: ModuleTreeNode) => e.name || '')"
|
:all-names="(nodeData.children || []).map((e: ModuleTreeNode) => e.name || '')"
|
||||||
:parent-id="nodeData.id"
|
:parent-id="nodeData.id"
|
||||||
|
@ -78,6 +79,7 @@
|
||||||
</popConfirm>
|
</popConfirm>
|
||||||
<popConfirm
|
<popConfirm
|
||||||
v-if="nodeData.id !== 'root'"
|
v-if="nodeData.id !== 'root'"
|
||||||
|
v-permission="['CASE_REVIEW:READ+UPDATE']"
|
||||||
mode="rename"
|
mode="rename"
|
||||||
:parent-id="nodeData.id"
|
:parent-id="nodeData.id"
|
||||||
:node-id="nodeData.id"
|
:node-id="nodeData.id"
|
||||||
|
@ -110,6 +112,7 @@
|
||||||
import useModal from '@/hooks/useModal';
|
import useModal from '@/hooks/useModal';
|
||||||
import useAppStore from '@/store/modules/app';
|
import useAppStore from '@/store/modules/app';
|
||||||
import { mapTree } from '@/utils';
|
import { mapTree } from '@/utils';
|
||||||
|
import { hasAnyPermission } from '@/utils/permission';
|
||||||
|
|
||||||
import { ModuleTreeNode } from '@/models/common';
|
import { ModuleTreeNode } from '@/models/common';
|
||||||
|
|
||||||
|
@ -183,11 +186,13 @@
|
||||||
{
|
{
|
||||||
label: 'common.rename',
|
label: 'common.rename',
|
||||||
eventTag: 'rename',
|
eventTag: 'rename',
|
||||||
|
permission: ['CASE_REVIEW:READ+UPDATE'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'common.delete',
|
label: 'common.delete',
|
||||||
eventTag: 'delete',
|
eventTag: 'delete',
|
||||||
danger: true,
|
danger: true,
|
||||||
|
permission: ['CASE_REVIEW:READ+DELETE'],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
const renamePopVisible = ref(false);
|
const renamePopVisible = ref(false);
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
:node-more-actions="folderMoreActions"
|
:node-more-actions="folderMoreActions"
|
||||||
:expand-all="props.isExpandAll"
|
:expand-all="props.isExpandAll"
|
||||||
:empty-text="t('project.fileManagement.noFolder')"
|
:empty-text="t('project.fileManagement.noFolder')"
|
||||||
:draggable="!props.isModal"
|
:draggable="!props.isModal && hasAnyPermission(['PROJECT_FILE_MANAGEMENT:READ+UPDATE'])"
|
||||||
:virtual-list-props="virtualListProps"
|
:virtual-list-props="virtualListProps"
|
||||||
:field-names="{
|
:field-names="{
|
||||||
title: 'name',
|
title: 'name',
|
||||||
|
@ -40,6 +40,7 @@
|
||||||
<!-- 默认模块的 id 是root,默认模块不可编辑、不可添加子模块 -->
|
<!-- 默认模块的 id 是root,默认模块不可编辑、不可添加子模块 -->
|
||||||
<popConfirm
|
<popConfirm
|
||||||
v-if="nodeData.id !== 'root'"
|
v-if="nodeData.id !== 'root'"
|
||||||
|
v-permission="['PROJECT_FILE_MANAGEMENT:READ+ADD']"
|
||||||
mode="add"
|
mode="add"
|
||||||
:all-names="(nodeData.children || []).map((e: ModuleTreeNode) => e.name || '')"
|
:all-names="(nodeData.children || []).map((e: ModuleTreeNode) => e.name || '')"
|
||||||
:parent-id="nodeData.id"
|
:parent-id="nodeData.id"
|
||||||
|
@ -52,6 +53,7 @@
|
||||||
</popConfirm>
|
</popConfirm>
|
||||||
<popConfirm
|
<popConfirm
|
||||||
v-if="nodeData.id !== 'root'"
|
v-if="nodeData.id !== 'root'"
|
||||||
|
v-permission="['PROJECT_FILE_MANAGEMENT:READ+UPDATE']"
|
||||||
mode="rename"
|
mode="rename"
|
||||||
:parent-id="nodeData.id"
|
:parent-id="nodeData.id"
|
||||||
:node-id="nodeData.id"
|
:node-id="nodeData.id"
|
||||||
|
@ -84,6 +86,7 @@
|
||||||
import useModal from '@/hooks/useModal';
|
import useModal from '@/hooks/useModal';
|
||||||
import useAppStore from '@/store/modules/app';
|
import useAppStore from '@/store/modules/app';
|
||||||
import { mapTree } from '@/utils';
|
import { mapTree } from '@/utils';
|
||||||
|
import { hasAnyPermission } from '@/utils/permission';
|
||||||
|
|
||||||
import { ModuleTreeNode } from '@/models/common';
|
import { ModuleTreeNode } from '@/models/common';
|
||||||
|
|
||||||
|
@ -130,11 +133,13 @@
|
||||||
{
|
{
|
||||||
label: 'project.fileManagement.rename',
|
label: 'project.fileManagement.rename',
|
||||||
eventTag: 'rename',
|
eventTag: 'rename',
|
||||||
|
permission: ['PROJECT_FILE_MANAGEMENT:READ+UPDATE'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'project.fileManagement.delete',
|
label: 'project.fileManagement.delete',
|
||||||
eventTag: 'delete',
|
eventTag: 'delete',
|
||||||
danger: true,
|
danger: true,
|
||||||
|
permission: ['PROJECT_FILE_MANAGEMENT:READ+DELETE'],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
const renamePopVisible = ref(false);
|
const renamePopVisible = ref(false);
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
</MsButton>
|
</MsButton>
|
||||||
</a-tooltip>
|
</a-tooltip>
|
||||||
<a-dropdown trigger="click" @select="handleAddSelect">
|
<a-dropdown trigger="click" @select="handleAddSelect">
|
||||||
<MsButton type="icon" class="!mr-0 p-[2px]">
|
<MsButton v-permission="['PROJECT_FILE_MANAGEMENT:READ+ADD']" type="icon" class="!mr-0 p-[2px]">
|
||||||
<MsIcon
|
<MsIcon
|
||||||
type="icon-icon_create_planarity"
|
type="icon-icon_create_planarity"
|
||||||
size="18"
|
size="18"
|
||||||
|
@ -38,6 +38,7 @@
|
||||||
</template>
|
</template>
|
||||||
</a-dropdown>
|
</a-dropdown>
|
||||||
<popConfirm
|
<popConfirm
|
||||||
|
v-permission="['PROJECT_FILE_MANAGEMENT:READ+ADD']"
|
||||||
mode="add"
|
mode="add"
|
||||||
:all-names="rootModulesName"
|
:all-names="rootModulesName"
|
||||||
parent-id="none"
|
parent-id="none"
|
||||||
|
|
|
@ -72,6 +72,7 @@
|
||||||
:placeholder="t('system.log.operateTargetPlaceholder')"
|
:placeholder="t('system.log.operateTargetPlaceholder')"
|
||||||
:panel-width="100"
|
:panel-width="100"
|
||||||
strictly
|
strictly
|
||||||
|
label-path-mode
|
||||||
class="filter-item"
|
class="filter-item"
|
||||||
/>
|
/>
|
||||||
<a-input
|
<a-input
|
||||||
|
@ -122,7 +123,11 @@
|
||||||
</a-tooltip>
|
</a-tooltip>
|
||||||
</template>
|
</template>
|
||||||
<template #module="{ record }">
|
<template #module="{ record }">
|
||||||
{{ getModuleLocale(record.module) }}
|
<a-tooltip :content="getModuleLocale(record.module)">
|
||||||
|
<div class="one-line-text">
|
||||||
|
{{ getModuleLocale(record.module) }}
|
||||||
|
</div>
|
||||||
|
</a-tooltip>
|
||||||
</template>
|
</template>
|
||||||
<template #type="{ record }">
|
<template #type="{ record }">
|
||||||
{{ t(typeOptions.find((e) => e.value === record.type)?.label || '') }}
|
{{ t(typeOptions.find((e) => e.value === record.type)?.label || '') }}
|
||||||
|
@ -339,7 +344,7 @@
|
||||||
|
|
||||||
const moduleOptions = ref<CascaderOption[]>([]);
|
const moduleOptions = ref<CascaderOption[]>([]);
|
||||||
const moduleLocaleMap = ref<Record<string, string>>({});
|
const moduleLocaleMap = ref<Record<string, string>>({});
|
||||||
const { getPathMapByLevel, jumpRouteByMapKey } = usePathMap();
|
const { getPathMapByLevel, jumpRouteByMapKey, findLocalePath } = usePathMap();
|
||||||
|
|
||||||
function initModuleOptions() {
|
function initModuleOptions() {
|
||||||
moduleOptions.value = getPathMapByLevel(props.mode, (e) => {
|
moduleOptions.value = getPathMapByLevel(props.mode, (e) => {
|
||||||
|
@ -359,7 +364,9 @@
|
||||||
*/
|
*/
|
||||||
function getModuleLocale(module: string) {
|
function getModuleLocale(module: string) {
|
||||||
try {
|
try {
|
||||||
return t(moduleLocaleMap.value[module] || '') || module;
|
return findLocalePath(module)
|
||||||
|
.map((e) => t(e) || module)
|
||||||
|
.join('/');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return module;
|
return module;
|
||||||
}
|
}
|
||||||
|
@ -470,7 +477,7 @@
|
||||||
title: 'system.log.operateTarget',
|
title: 'system.log.operateTarget',
|
||||||
dataIndex: 'module',
|
dataIndex: 'module',
|
||||||
slotName: 'module',
|
slotName: 'module',
|
||||||
width: 100,
|
width: 150,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'system.log.operateType',
|
title: 'system.log.operateType',
|
||||||
|
@ -489,7 +496,7 @@
|
||||||
title: 'system.log.time',
|
title: 'system.log.time',
|
||||||
dataIndex: 'createTime',
|
dataIndex: 'createTime',
|
||||||
fixed: 'right',
|
fixed: 'right',
|
||||||
width: 100,
|
width: 120,
|
||||||
sortable: {
|
sortable: {
|
||||||
sortDirections: ['ascend', 'descend'],
|
sortDirections: ['ascend', 'descend'],
|
||||||
sorter: true,
|
sorter: true,
|
||||||
|
|
Loading…
Reference in New Issue