fix(组件): 更多按钮点击无反应修复&部分页面优化

This commit is contained in:
baiqi 2024-02-29 15:35:27 +08:00 committed by 刘瑞斌
parent f1981d1baa
commit 522a2e389e
32 changed files with 296 additions and 62 deletions

View File

@ -1,7 +1,7 @@
@font-face {
font-family: iconfont; /* Project id 3462279 */
src: url('iconfont.woff2?t=1706424798592') format('woff2'), url('iconfont.woff?t=1706424798592') format('woff'),
url('iconfont.ttf?t=1706424798592') format('truetype'), url('iconfont.svg?t=1706424798592#iconfont') format('svg');
src: url('iconfont.woff2?t=1709115886161') format('woff2'), url('iconfont.woff?t=1709115886161') format('woff'),
url('iconfont.ttf?t=1709115886161') format('truetype'), url('iconfont.svg?t=1709115886161#iconfont') format('svg');
}
.iconfont {
font-size: 16px;
@ -10,6 +10,24 @@
-webkit-font-smoothing: antialiased;
-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 {
content: '\e79c';
}

File diff suppressed because one or more lines are too long

View File

@ -5,6 +5,48 @@
"css_prefix_text": "icon-",
"description": "DE、MS项目icon管理",
"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",
"name": "icon_swich",

View File

@ -14,6 +14,18 @@
/>
<missing-glyph />
<glyph glyph-name="icon_unlink" unicode="&#59297;" 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="&#59298;" 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="&#59296;" 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="&#59294;" 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="&#59295;" 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="&#59293;" 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="&#59292;" 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="&#59291;" 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

View File

@ -19,7 +19,13 @@
<icon-upload class="mr-[8px]" />{{ t('ms.add.attachment.localUpload') }}
</a-button>
</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" />
{{ t('ms.add.attachment.associateFile') }}
</a-button>
@ -28,6 +34,7 @@
</template>
<script setup lang="ts">
import MsIcon from '@/components/pure/ms-icon-font/index.vue';
import MsUpload from '@/components/pure/ms-upload/index.vue';
import { MsFileItem } from '@/components/pure/ms-upload/types';

View File

@ -77,10 +77,17 @@
<MsButton type="text" @click="clearDeletedFiles">{{ t('ms.add.attachment.quickClear') }}</MsButton>
</div>
<div class="file-list">
<div v-for="file of alreadyDeleteFiles" :key="file.value">
<MsTag size="small" max-width="100%" closable @close="handleClose(file)">
{{ file.label }}
</MsTag>
<div v-for="file of alreadyDeleteFiles" :key="file.value" class="file-list-item">
<a-tooltip :content="file.name" :mouse-enter-delay="300">
<MsTag size="small" max-width="100%">
{{ 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>
</template>
@ -89,10 +96,34 @@
{{ t('ms.add.attachment.other') }}
</div>
<div class="file-list">
<div v-for="file of otherFiles" :key="file.value">
<MsTag size="small" max-width="100%" closable @close="handleClose(file)">
{{ file.label }}
</MsTag>
<div v-for="file of otherFiles" :key="file.value" class="file-list-item">
<a-tooltip :content="file.name" :mouse-enter-delay="300">
<MsTag size="small" max-width="100%">
{{ 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>
</template>
@ -129,6 +160,7 @@
import { TagData } from '@arco-design/web-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 MsTagsInput from '@/components/pure/ms-tags-input/index.vue';
import type { MsFileItem } from '@/components/pure/ms-upload/types';
@ -215,6 +247,7 @@
...item,
value: item?.uid || '',
label: item?.name || '',
local: true,
}));
} else {
inputFileName.value = fileItem.name || '';
@ -305,7 +338,12 @@
.ms-scroll-bar();
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) {
padding-left: 4px;

View File

@ -4,4 +4,7 @@ export default {
'ms.add.attachment.alreadyDelete': 'Deleted files',
'ms.add.attachment.other': 'Other files',
'ms.add.attachment.quickClear': 'Clear',
'ms.add.attachment.remove': 'Remove',
'ms.add.attachment.cancelAssociate': 'Disassociate',
'ms.add.attachment.saveAs': 'Save',
};

View File

@ -4,4 +4,7 @@ export default {
'ms.add.attachment.alreadyDelete': '已被删除文件',
'ms.add.attachment.other': '其他文件',
'ms.add.attachment.quickClear': '一键移除',
'ms.add.attachment.remove': '移除',
'ms.add.attachment.cancelAssociate': '取消关联',
'ms.add.attachment.saveAs': '转存',
};

View File

@ -6,13 +6,13 @@
@select="selectHandler"
@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">
<MsIcon type="icon-icon_more_outlined" size="16" class="text-[var(--color-text-4)]" />
</MsButton>
</slot>
</div>
</div>
</slot>
<template #content>
<template v-for="item of props.list">
<a-divider

View File

@ -35,11 +35,27 @@ export const pathMap: PathMapItem[] = [
level: MENU_LEVEL[2],
children: [
{
key: 'API_TEST_DEBUG', // 接口测试-接口调试
key: 'API_TEST_DEBUG_MANAGEMENT', // 接口测试-接口调试
locale: 'menu.apiTest.debug',
route: RouteEnum.API_TEST_DEBUG,
route: RouteEnum.API_TEST_DEBUG_MANAGEMENT,
permission: [],
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', // 接口测试-接口管理

View File

@ -1,6 +1,6 @@
export enum ApiTestRouteEnum {
API_TEST = 'apiTest',
API_TEST_DEBUG = 'apiTestDebug',
API_TEST_DEBUG_MANAGEMENT = 'apiTestDebug',
API_TEST_MANAGEMENT = 'apiTestManagement',
API_TEST_REPORT = 'apiTestReport',
}

View File

@ -71,9 +71,36 @@ export default function usePathMap() {
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 {
getPathMapByLevel,
jumpRouteByMapKey,
getRouteLevelByKey,
findLocalePath,
};
}

View File

@ -121,4 +121,5 @@ export default {
'common.stay': 'Stay',
'common.apply': 'Apply',
'common.stop': 'Stop',
'common.module': 'Module',
};

View File

@ -25,6 +25,7 @@ export default {
'menu.caseManagement': 'Case Management',
'menu.apiTest': 'API Test',
'menu.apiTest.debug': 'API debug',
'menu.apiTest.debug.debug': 'Debug',
'menu.apiTest.management': 'API Management',
'menu.apiTest.report': 'API Report',
'menu.uiTest': 'UI Test',

View File

@ -124,4 +124,5 @@ export default {
'common.stay': '留下',
'common.apply': '应用',
'common.stop': '停止',
'common.module': '模块',
};

View File

@ -25,6 +25,7 @@ export default {
'menu.caseManagement': '用例管理',
'menu.apiTest': '接口测试',
'menu.apiTest.debug': '接口调试',
'menu.apiTest.debug.debug': '调试',
'menu.apiTest.management': '接口管理',
'menu.apiTest.report': '接口报告',
'menu.uiTest': 'UI测试',

View File

@ -25,7 +25,7 @@ const ApiTest: AppRouteRecordRaw = {
children: [
{
path: 'debug',
name: ApiTestRouteEnum.API_TEST_DEBUG,
name: ApiTestRouteEnum.API_TEST_DEBUG_MANAGEMENT,
component: () => import('@/views/api-test/debug/index.vue'),
meta: {
locale: 'menu.apiTest.debug',

View File

@ -19,7 +19,7 @@
/>
<template #content>
<div>{{ t('apiTestDebug.batchAddParamsTip1') }}</div>
<div>{{ t('apiTestDebug.batchAddParamsTip2') }}</div>
<div v-if="!props.noParamType">{{ t('apiTestDebug.batchAddParamsTip2') }}</div>
<div>{{ t('apiTestDebug.batchAddParamsTip3') }}</div>
</template>
</a-tooltip>
@ -48,10 +48,16 @@
import { useI18n } from '@/hooks/useI18n';
const props = defineProps<{
params: Record<string, any>[];
defaultParamItem?: Record<string, any>; //
}>();
const props = withDefaults(
defineProps<{
params: Record<string, any>[];
defaultParamItem?: Record<string, any>; //
noParamType?: boolean; //
}>(),
{
noParamType: false,
}
);
const emit = defineEmits<{
(e: 'apply', resultArr: (Record<string, any> | null)[]): void;
}>();

View File

@ -972,7 +972,7 @@
@apply invisible;
}
.arco-select-view-value {
color: var(--color-text-brand);
color: var(--color-text-1);
}
.arco-select {
border-color: transparent !important;

View File

@ -3,6 +3,7 @@
<batchAddKeyVal
:params="innerParams"
:default-param-item="defaultHeaderParamsItem"
no-param-type
@apply="handleBatchParamApply"
/>
</div>

View File

@ -52,6 +52,7 @@
<div class="ml-[16px]">
<a-dropdown-button
v-if="!requestVModel.executeLoading"
v-permission="[props.permissionMap.execute]"
:disabled="requestVModel.executeLoading || (isHttpProtocol && !requestVModel.url)"
class="exec-btn"
@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-dropdown
v-if="props.isDefinition"
v-permission="[props.permissionMap.create, props.permissionMap.update]"
:loading="saveLoading || (isHttpProtocol && !requestVModel.url)"
@select="handleSelect"
>
@ -83,6 +85,7 @@
</a-dropdown>
<a-button
v-else
v-permission="[props.permissionMap.create, props.permissionMap.update]"
type="secondary"
:disabled="isHttpProtocol && !requestVModel.url"
:loading="saveLoading"
@ -289,6 +292,7 @@
import { filterTree, getGenerateId, parseQueryParams } from '@/utils';
import { scrollIntoView } from '@/utils/dom';
import { registerCatchSaveShortcut, removeCatchSaveShortcut } from '@/utils/event';
import { hasAnyPermission } from '@/utils/permission';
import { PluginConfig } from '@/models/apiTest/common';
import { ExecuteHTTPRequestFullParams } from '@/models/apiTest/debug';
@ -333,6 +337,11 @@
createApi: (...args) => Promise<any>; //
updateApi: (...args) => Promise<any>; //
uploadTempFileApi?: (...args) => Promise<any>; //
permissionMap: {
execute: string;
create: string;
update: string;
};
}>();
const emit = defineEmits(['addDone']);
@ -892,29 +901,33 @@
async function handleSaveShortcut() {
if (!requestVModel.value.isNew) {
//
updateDebug();
if (hasAnyPermission([props.permissionMap.update])) {
//
updateDebug();
}
return;
}
try {
if (!isHttpProtocol.value) {
//
await fApi.value?.validate();
if (hasAnyPermission([props.permissionMap.create])) {
try {
if (!isHttpProtocol.value) {
//
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' });
});
}
}

View File

@ -139,7 +139,6 @@
: tabMoreActionList
"
class="response-more-action"
icon-mode="hide"
@select="(e) => handleMoreActionSelect(e, tab as ResponseItem)"
/>
<popConfirm

View File

@ -3,10 +3,16 @@
<div class="mb-[8px] flex items-center gap-[8px]">
<a-input v-model:model-value="moduleKeyword" :placeholder="t('apiTestDebug.searchTip')" allow-clear />
<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>
<a-doption value="newApi">{{ t('apiTestDebug.newApi') }}</a-doption>
<a-doption value="import">{{ t('apiTestDebug.importApi') }}</a-doption>
<a-doption v-permission="['PROJECT_API_DEBUG:READ+ADD']" value="newApi">
{{ t('apiTestDebug.newApi') }}
</a-doption>
<a-doption v-permission="['PROJECT_API_DEBUG:READ+IMPORT']" value="import">
{{ t('apiTestDebug.importApi') }}
</a-doption>
</template>
</a-dropdown>
</div>
@ -23,7 +29,7 @@
</MsButton>
</a-tooltip>
<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
type="icon-icon_create_planarity"
size="18"
@ -56,7 +62,7 @@
children: 'children',
count: 'count',
}"
:draggable="true"
:draggable="hasAnyPermission(['PROJECT_API_DEBUG:READ+UPDATE'])"
:selectable="nodeSelectable"
block-node
title-tooltip-position="left"
@ -82,6 +88,7 @@
<template #extra="nodeData">
<popConfirm
v-if="nodeData.id !== 'root'"
v-permission="['PROJECT_API_DEBUG:READ+UPDATE']"
mode="rename"
:parent-id="nodeData.id"
:node-id="nodeData.id"
@ -96,6 +103,7 @@
<!-- 默认模块的 id 是root默认模块不可编辑不可添加子模块API不可添加子模块 -->
<popConfirm
v-if="nodeData.id !== 'root' && nodeData.type !== 'API'"
v-permission="['PROJECT_API_DEBUG:READ+ADD']"
mode="add"
:all-names="(nodeData.children || []).map((e: ModuleTreeNode) => e.name || '')"
:parent-id="nodeData.id"
@ -137,6 +145,7 @@
import useModal from '@/hooks/useModal';
import useAppStore from '@/store/modules/app';
import { mapTree } from '@/utils';
import { hasAnyPermission } from '@/utils/permission';
import { ModuleTreeNode } from '@/models/common';
@ -206,11 +215,13 @@
{
label: 'common.rename',
eventTag: 'rename',
permission: ['PROJECT_API_DEBUG:READ+UPDATE'],
},
{
label: 'common.delete',
eventTag: 'delete',
danger: true,
permission: ['PROJECT_API_DEBUG:READ+DELETE'],
},
];
const renamePopVisible = ref(false);

View File

@ -21,6 +21,7 @@
v-model:active-tab="activeDebug"
v-model:tabs="debugTabs"
:limit="10"
:readonly="!hasAnyPermission(['PROJECT_API_DEBUG:READ+ADD'])"
at-least-one
@add="addDebugTab"
>
@ -40,6 +41,11 @@
:execute-api="executeDebug"
:local-execute-api="localExecuteApiDebug"
: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"
/>
</div>
@ -105,6 +111,7 @@
import { useI18n } from '@/hooks/useI18n';
import useModal from '@/hooks/useModal';
import { parseCurlScript } from '@/utils';
import { hasAnyPermission } from '@/utils/permission';
import { ExecuteBody } from '@/models/apiTest/debug';
import { ModuleTreeNode } from '@/models/common';
@ -352,7 +359,11 @@
// eslint-disable-next-line @typescript-eslint/no-unused-vars
let isLeaving = false;
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;
//
openModal({

View File

@ -25,6 +25,11 @@
:update-api="updateDebug"
:execute-api="executeDebug"
: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
@add-done="emit('addDone')"
/>

View File

@ -41,7 +41,7 @@
:default-expand-all="isExpandAll"
:expand-all="isExpandAll"
:empty-text="t('caseManagement.caseReview.noReviews')"
:draggable="!props.isModal"
:draggable="!props.isModal && hasAnyPermission(['CASE_REVIEW:READ+UPDATE'])"
:virtual-list-props="virtualListProps"
:field-names="{
title: 'name',
@ -66,6 +66,7 @@
<!-- 默认模块的 id 是root默认模块不可编辑不可添加子模块 -->
<popConfirm
v-if="nodeData.id !== 'root'"
v-permission="['CASE_REVIEW:READ+ADD']"
mode="add"
:all-names="(nodeData.children || []).map((e: ModuleTreeNode) => e.name || '')"
:parent-id="nodeData.id"
@ -78,6 +79,7 @@
</popConfirm>
<popConfirm
v-if="nodeData.id !== 'root'"
v-permission="['CASE_REVIEW:READ+UPDATE']"
mode="rename"
:parent-id="nodeData.id"
:node-id="nodeData.id"
@ -110,6 +112,7 @@
import useModal from '@/hooks/useModal';
import useAppStore from '@/store/modules/app';
import { mapTree } from '@/utils';
import { hasAnyPermission } from '@/utils/permission';
import { ModuleTreeNode } from '@/models/common';
@ -183,11 +186,13 @@
{
label: 'common.rename',
eventTag: 'rename',
permission: ['CASE_REVIEW:READ+UPDATE'],
},
{
label: 'common.delete',
eventTag: 'delete',
danger: true,
permission: ['CASE_REVIEW:READ+DELETE'],
},
];
const renamePopVisible = ref(false);

View File

@ -15,7 +15,7 @@
:node-more-actions="folderMoreActions"
:expand-all="props.isExpandAll"
:empty-text="t('project.fileManagement.noFolder')"
:draggable="!props.isModal"
:draggable="!props.isModal && hasAnyPermission(['PROJECT_FILE_MANAGEMENT:READ+UPDATE'])"
:virtual-list-props="virtualListProps"
:field-names="{
title: 'name',
@ -40,6 +40,7 @@
<!-- 默认模块的 id 是root默认模块不可编辑不可添加子模块 -->
<popConfirm
v-if="nodeData.id !== 'root'"
v-permission="['PROJECT_FILE_MANAGEMENT:READ+ADD']"
mode="add"
:all-names="(nodeData.children || []).map((e: ModuleTreeNode) => e.name || '')"
:parent-id="nodeData.id"
@ -52,6 +53,7 @@
</popConfirm>
<popConfirm
v-if="nodeData.id !== 'root'"
v-permission="['PROJECT_FILE_MANAGEMENT:READ+UPDATE']"
mode="rename"
:parent-id="nodeData.id"
:node-id="nodeData.id"
@ -84,6 +86,7 @@
import useModal from '@/hooks/useModal';
import useAppStore from '@/store/modules/app';
import { mapTree } from '@/utils';
import { hasAnyPermission } from '@/utils/permission';
import { ModuleTreeNode } from '@/models/common';
@ -130,11 +133,13 @@
{
label: 'project.fileManagement.rename',
eventTag: 'rename',
permission: ['PROJECT_FILE_MANAGEMENT:READ+UPDATE'],
},
{
label: 'project.fileManagement.delete',
eventTag: 'delete',
danger: true,
permission: ['PROJECT_FILE_MANAGEMENT:READ+DELETE'],
},
];
const renamePopVisible = ref(false);

View File

@ -25,7 +25,7 @@
</MsButton>
</a-tooltip>
<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
type="icon-icon_create_planarity"
size="18"
@ -38,6 +38,7 @@
</template>
</a-dropdown>
<popConfirm
v-permission="['PROJECT_FILE_MANAGEMENT:READ+ADD']"
mode="add"
:all-names="rootModulesName"
parent-id="none"

View File

@ -72,6 +72,7 @@
:placeholder="t('system.log.operateTargetPlaceholder')"
:panel-width="100"
strictly
label-path-mode
class="filter-item"
/>
<a-input
@ -122,7 +123,11 @@
</a-tooltip>
</template>
<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 #type="{ record }">
{{ t(typeOptions.find((e) => e.value === record.type)?.label || '') }}
@ -339,7 +344,7 @@
const moduleOptions = ref<CascaderOption[]>([]);
const moduleLocaleMap = ref<Record<string, string>>({});
const { getPathMapByLevel, jumpRouteByMapKey } = usePathMap();
const { getPathMapByLevel, jumpRouteByMapKey, findLocalePath } = usePathMap();
function initModuleOptions() {
moduleOptions.value = getPathMapByLevel(props.mode, (e) => {
@ -359,7 +364,9 @@
*/
function getModuleLocale(module: string) {
try {
return t(moduleLocaleMap.value[module] || '') || module;
return findLocalePath(module)
.map((e) => t(e) || module)
.join('/');
} catch (error) {
return module;
}
@ -470,7 +477,7 @@
title: 'system.log.operateTarget',
dataIndex: 'module',
slotName: 'module',
width: 100,
width: 150,
},
{
title: 'system.log.operateType',
@ -489,7 +496,7 @@
title: 'system.log.time',
dataIndex: 'createTime',
fixed: 'right',
width: 100,
width: 120,
sortable: {
sortDirections: ['ascend', 'descend'],
sorter: true,