mirror of
https://gitee.com/dromara/go-view.git
synced 2025-02-24 16:22:57 +08:00
Merge branch 'dev' into dev-commet
This commit is contained in:
commit
d701411547
@ -20,7 +20,7 @@ GoView 是一个高效的拖拽式低代码数据可视化开发平台,将图
|
|||||||
|
|
||||||
### 🤯 后端项目
|
### 🤯 后端项目
|
||||||
|
|
||||||
后端项目gitee地址:[https://gitee.com/MTrun/go-view-serve](https://gitee.com/MTrun/go-view-serve)
|
后端项目 gitee 地址:[https://gitee.com/MTrun/go-view-serve](https://gitee.com/MTrun/go-view-serve)
|
||||||
|
|
||||||
接口说明地址:[https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3#3e053622-1e76-43f9-a039-756aee822dbb](https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3#3e053622-1e76-43f9-a039-756aee822dbb)
|
接口说明地址:[https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3#3e053622-1e76-43f9-a039-756aee822dbb](https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3#3e053622-1e76-43f9-a039-756aee822dbb)
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ GoView 是一个高效的拖拽式低代码数据可视化开发平台,将图
|
|||||||
| 名称 | 版本 | 名称 | 版本 |
|
| 名称 | 版本 | 名称 | 版本 |
|
||||||
| ------------------- | ----- | ----------- | ------ |
|
| ------------------- | ----- | ----------- | ------ |
|
||||||
| Vue | 3.2.x | TypeScript4 | 4.6.x |
|
| Vue | 3.2.x | TypeScript4 | 4.6.x |
|
||||||
| Vite | 2.9.x | NaiveUI | 2.27.x |
|
| Vite | 4.2.x | NaiveUI | 2.34.x |
|
||||||
| ECharts | 5.3.x | Pinia | 2.0.x |
|
| ECharts | 5.3.x | Pinia | 2.0.x |
|
||||||
| 详见 `package.json` | 😁 | 🥰 | 🤗 |
|
| 详见 `package.json` | 😁 | 🥰 | 🤗 |
|
||||||
|
|
||||||
@ -61,7 +61,7 @@ GoView 是一个高效的拖拽式低代码数据可视化开发平台,将图
|
|||||||
|
|
||||||
| 名称 | 版本 | 名称 | 版本 |
|
| 名称 | 版本 | 名称 | 版本 |
|
||||||
| ---- | ------- | ------- | ----- |
|
| ---- | ------- | ------- | ----- |
|
||||||
| node | 16.14.x | npm | 8.5.x |
|
| node | 16.16.x | npm | 8.5.x |
|
||||||
| pnpm | 7.1.x | windows | 11 |
|
| pnpm | 7.1.x | windows | 11 |
|
||||||
|
|
||||||
已完成图表:
|
已完成图表:
|
||||||
|
@ -21,7 +21,7 @@ axiosInstance.interceptors.request.use(
|
|||||||
axiosInstance.interceptors.response.use(
|
axiosInstance.interceptors.response.use(
|
||||||
(res: AxiosResponse) => {
|
(res: AxiosResponse) => {
|
||||||
const { code } = res.data as { code: number }
|
const { code } = res.data as { code: number }
|
||||||
if (code === undefined || code === null) return Promise.resolve(res)
|
if (code === undefined || code === null) return Promise.resolve(res.data)
|
||||||
if (code === ResultEnum.DATA_SUCCESS) return Promise.resolve(res.data)
|
if (code === ResultEnum.DATA_SUCCESS) return Promise.resolve(res.data)
|
||||||
// 重定向
|
// 重定向
|
||||||
if (ErrorPageNameMap.get(code)) redirectErrorPage(code)
|
if (ErrorPageNameMap.get(code)) redirectErrorPage(code)
|
||||||
|
@ -76,10 +76,11 @@ export const useChartDataFetch = (
|
|||||||
if (res) {
|
if (res) {
|
||||||
try {
|
try {
|
||||||
const filter = targetComponent.filter
|
const filter = targetComponent.filter
|
||||||
echartsUpdateHandle(newFunctionHandle(res?.data, res, filter))
|
const { data } = res
|
||||||
|
echartsUpdateHandle(newFunctionHandle(data, res, filter))
|
||||||
// 更新回调函数
|
// 更新回调函数
|
||||||
if (updateCallback) {
|
if (updateCallback) {
|
||||||
updateCallback(newFunctionHandle(res?.data, res, filter))
|
updateCallback(newFunctionHandle(data, res, filter))
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error)
|
console.error(error)
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<collapse-item name="信息" :expanded="true">
|
<collapse-item name="信息" :expanded="true">
|
||||||
<setting-item-box name="文字" :alone="true">
|
<setting-item-box name="文字" :alone="true">
|
||||||
<setting-item>
|
<setting-item>
|
||||||
<n-input v-model:value="optionData.dataset" size="small"></n-input>
|
<n-input v-model:value="optionData.dataset" type="textarea" size="small"></n-input>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
<setting-item-box name="链接" :alone="true">
|
<setting-item-box name="链接" :alone="true">
|
||||||
@ -30,11 +30,7 @@
|
|||||||
<n-input-number v-model:value="optionData.fontSize" size="small" placeholder="字体大小"></n-input-number>
|
<n-input-number v-model:value="optionData.fontSize" size="small" placeholder="字体大小"></n-input-number>
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="字体粗细">
|
<setting-item name="字体粗细">
|
||||||
<n-select
|
<n-select v-model:value="optionData.fontWeight" size="small" :options="fontWeightOptions" />
|
||||||
v-model:value="optionData.fontWeight"
|
|
||||||
size="small"
|
|
||||||
:options="fontWeightOptions"
|
|
||||||
/>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
<setting-item name="X轴内边距">
|
<setting-item name="X轴内边距">
|
||||||
<n-input-number v-model:value="optionData.paddingX" size="small" placeholder="输入内边距"></n-input-number>
|
<n-input-number v-model:value="optionData.paddingX" size="small" placeholder="输入内边距"></n-input-number>
|
||||||
@ -87,9 +83,7 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { PropType } from 'vue'
|
import { PropType } from 'vue'
|
||||||
import { option, WritingModeEnum, WritingModeObject,
|
import { option, WritingModeEnum, WritingModeObject, FontWeightEnum, FontWeightObject } from './config'
|
||||||
FontWeightEnum,
|
|
||||||
FontWeightObject, } from './config'
|
|
||||||
import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
|
import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
optionData: {
|
optionData: {
|
||||||
@ -117,13 +111,13 @@ const verticalOptions = [
|
|||||||
const fontWeightOptions = [
|
const fontWeightOptions = [
|
||||||
{
|
{
|
||||||
label: FontWeightEnum.NORMAL,
|
label: FontWeightEnum.NORMAL,
|
||||||
value: FontWeightObject[FontWeightEnum.NORMAL],
|
value: FontWeightObject[FontWeightEnum.NORMAL]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: FontWeightEnum.BOLD,
|
label: FontWeightEnum.BOLD,
|
||||||
value: FontWeightObject[FontWeightEnum.BOLD],
|
value: FontWeightObject[FontWeightEnum.BOLD]
|
||||||
},
|
}
|
||||||
];
|
]
|
||||||
const handleLinkClick = () => {
|
const handleLinkClick = () => {
|
||||||
window.open(props.optionData.linkHead + props.optionData.link)
|
window.open(props.optionData.linkHead + props.optionData.link)
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="go-text-box">
|
<div class="go-text-box">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<span style="cursor: pointer" v-if="link" @click="click">{{ option.dataset }}</span>
|
<span style="cursor: pointer; white-space: pre-wrap" v-if="link" @click="click"></span>
|
||||||
<span v-else>{{ option.dataset }}</span>
|
<span style="white-space: pre-wrap" v-else>{{ option.dataset }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
1
src/packages/index.d.ts
vendored
1
src/packages/index.d.ts
vendored
@ -140,6 +140,7 @@ export interface CreateComponentType extends PublicConfigType, requestConfig {
|
|||||||
key: string
|
key: string
|
||||||
chartConfig: ConfigType
|
chartConfig: ConfigType
|
||||||
option: GlobalThemeJsonType
|
option: GlobalThemeJsonType
|
||||||
|
groupList?: Array<CreateComponentType>
|
||||||
}
|
}
|
||||||
|
|
||||||
// 组件成组实例类
|
// 组件成组实例类
|
||||||
|
@ -2212,9 +2212,9 @@
|
|||||||
"pinyin": "tengluozi"
|
"pinyin": "tengluozi"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"CMYK": [57, 62, 16, 2],
|
"CMYK": [34, 39, 0, 24],
|
||||||
"RGB": [128, 109, 158],
|
"RGB": [128, 118, 195],
|
||||||
"hex": "#806d9e",
|
"hex": "#8076c3",
|
||||||
"name": "槿紫",
|
"name": "槿紫",
|
||||||
"pinyin": "jinzi"
|
"pinyin": "jinzi"
|
||||||
},
|
},
|
||||||
|
@ -55,7 +55,11 @@ export const useChartLayoutStore = defineStore({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
setItem<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(key: T, value: K): void {
|
setItem<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(
|
||||||
|
key: T,
|
||||||
|
value: K,
|
||||||
|
computedScale = true
|
||||||
|
): void {
|
||||||
this.$patch(state => {
|
this.$patch(state => {
|
||||||
state[key] = value
|
state[key] = value
|
||||||
})
|
})
|
||||||
@ -64,9 +68,11 @@ export const useChartLayoutStore = defineStore({
|
|||||||
// 这里需要标记重置画布位置
|
// 这里需要标记重置画布位置
|
||||||
this.rePositionCanvas = true;
|
this.rePositionCanvas = true;
|
||||||
// 重新计算拖拽区域缩放比例
|
// 重新计算拖拽区域缩放比例
|
||||||
setTimeout(() => {
|
if (computedScale) {
|
||||||
chartEditStore.computedScale()
|
setTimeout(() => {
|
||||||
}, 500)
|
chartEditStore.computedScale()
|
||||||
|
}, 500)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
setItemUnHandle<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(key: T, value: K): void {
|
setItemUnHandle<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(key: T, value: K): void {
|
||||||
this.$patch(state => {
|
this.$patch(state => {
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
@update:value="clickItemHandle"
|
@update:value="clickItemHandle"
|
||||||
></n-menu>
|
></n-menu>
|
||||||
<div class="chart-content-list">
|
<div class="chart-content-list">
|
||||||
<n-scrollbar>
|
<n-scrollbar trigger="none">
|
||||||
<charts-item-box :menuOptions="packages.selectOptions"></charts-item-box>
|
<charts-item-box :menuOptions="packages.selectOptions"></charts-item-box>
|
||||||
</n-scrollbar>
|
</n-scrollbar>
|
||||||
</div>
|
</div>
|
||||||
@ -119,6 +119,7 @@ $menuWidth: 65px;
|
|||||||
@include fetch-bg-color('background-color2-shallow');
|
@include fetch-bg-color('background-color2-shallow');
|
||||||
}
|
}
|
||||||
.chart-content-list {
|
.chart-content-list {
|
||||||
|
width: 200px;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
@ -74,9 +74,9 @@ const clickItemHandle = (key: string, item: any) => {
|
|||||||
selectOptions.value = item
|
selectOptions.value = item
|
||||||
// 处理折叠
|
// 处理折叠
|
||||||
if (beforeSelect === key) {
|
if (beforeSelect === key) {
|
||||||
setItem(ChartLayoutStoreEnum.CHARTS, !getCharts.value)
|
setItem(ChartLayoutStoreEnum.CHARTS, !getCharts.value, false)
|
||||||
} else {
|
} else {
|
||||||
setItem(ChartLayoutStoreEnum.CHARTS, true)
|
setItem(ChartLayoutStoreEnum.CHARTS, true, false)
|
||||||
}
|
}
|
||||||
beforeSelect = key
|
beforeSelect = key
|
||||||
}
|
}
|
||||||
|
@ -130,8 +130,9 @@ const sendHandle = async () => {
|
|||||||
const res = await customizeHttp(toRaw(targetData.value.request), toRaw(chartEditStore.getRequestGlobalConfig))
|
const res = await customizeHttp(toRaw(targetData.value.request), toRaw(chartEditStore.getRequestGlobalConfig))
|
||||||
loading.value = false
|
loading.value = false
|
||||||
if (res) {
|
if (res) {
|
||||||
if (!res?.data && !targetData.value.filter) window['$message'].warning('您的数据不符合默认格式,请配置过滤器!')
|
const { data } = res
|
||||||
targetData.value.option.dataset = newFunctionHandle(res?.data, res, targetData.value.filter)
|
if (!data && !targetData.value.filter) window['$message'].warning('您的数据不符合默认格式,请配置过滤器!')
|
||||||
|
targetData.value.option.dataset = newFunctionHandle(data, res, targetData.value.filter)
|
||||||
showMatching.value = true
|
showMatching.value = true
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@
|
|||||||
<help-outline-icon></help-outline-icon>
|
<help-outline-icon></help-outline-icon>
|
||||||
</n-icon>
|
</n-icon>
|
||||||
</template>
|
</template>
|
||||||
<n-text>不支持「静态组件」和「分组」</n-text>
|
<n-text>不支持「静态组件」</n-text>
|
||||||
</n-tooltip>
|
</n-tooltip>
|
||||||
</template>
|
</template>
|
||||||
<n-select
|
<n-select
|
||||||
@ -169,7 +169,27 @@ const fnDimensionsAndSource = (interactOn: InteractEventOn | undefined) => {
|
|||||||
|
|
||||||
// 绑定组件列表
|
// 绑定组件列表
|
||||||
const fnEventsOptions = (): Array<SelectOption | SelectGroupOption> => {
|
const fnEventsOptions = (): Array<SelectOption | SelectGroupOption> => {
|
||||||
const filterOptionList = chartEditStore.componentList.filter(item => {
|
// 扁平化树形数据
|
||||||
|
const fnFlattern = (
|
||||||
|
data: Array<CreateComponentType | CreateComponentGroupType>
|
||||||
|
): Array<CreateComponentType | CreateComponentGroupType> => {
|
||||||
|
return data.reduce(
|
||||||
|
(
|
||||||
|
iter: Array<CreateComponentType | CreateComponentGroupType>,
|
||||||
|
val: CreateComponentType | CreateComponentGroupType
|
||||||
|
) => {
|
||||||
|
if (val.groupList && val.groupList.length > 0) {
|
||||||
|
iter.push(val)
|
||||||
|
} else {
|
||||||
|
iter.push(val)
|
||||||
|
}
|
||||||
|
return val.groupList ? [...iter, ...fnFlattern(val.groupList)] : iter
|
||||||
|
},
|
||||||
|
[]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const filterOptionList = fnFlattern(chartEditStore.componentList).filter(item => {
|
||||||
// 排除自己
|
// 排除自己
|
||||||
const isNotSelf = item.id !== targetData.value.id
|
const isNotSelf = item.id !== targetData.value.id
|
||||||
// 排除静态组件
|
// 排除静态组件
|
||||||
|
@ -23,6 +23,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, PropType } from 'vue'
|
import { computed, PropType } from 'vue'
|
||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
|
import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
|
||||||
|
|
||||||
import { useDesignStore } from '@/store/modules/designStore/designStore'
|
import { useDesignStore } from '@/store/modules/designStore/designStore'
|
||||||
import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d'
|
import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d'
|
||||||
import { useSizeStyle, usePointStyle } from '../../hooks/useStyle.hook'
|
import { useSizeStyle, usePointStyle } from '../../hooks/useStyle.hook'
|
||||||
@ -55,6 +57,9 @@ const themeColor = computed(() => {
|
|||||||
|
|
||||||
// 计算当前选中目标
|
// 计算当前选中目标
|
||||||
const hover = computed(() => {
|
const hover = computed(() => {
|
||||||
|
const isDrag = chartEditStore.getEditCanvas[EditCanvasTypeEnum.IS_DRAG]
|
||||||
|
if (isDrag) return false
|
||||||
|
|
||||||
if (props.item.status.lock) return false
|
if (props.item.status.lock) return false
|
||||||
return props.item.id === chartEditStore.getTargetChart.hoverId
|
return props.item.id === chartEditStore.getTargetChart.hoverId
|
||||||
})
|
})
|
||||||
|
@ -5,8 +5,9 @@ import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStor
|
|||||||
const chartEditStore = useChartEditStore()
|
const chartEditStore = useChartEditStore()
|
||||||
|
|
||||||
// 布局处理
|
// 布局处理
|
||||||
export const useLayout = () => {
|
export const useLayout = (fn: () => Promise<void>) => {
|
||||||
onMounted(() => {
|
let removeScale: Function = () => { }
|
||||||
|
onMounted(async () => {
|
||||||
// 设置 Dom 值(ref 不生效先用 document)
|
// 设置 Dom 值(ref 不生效先用 document)
|
||||||
chartEditStore.setEditCanvas(
|
chartEditStore.setEditCanvas(
|
||||||
EditCanvasTypeEnum.EDIT_LAYOUT_DOM,
|
EditCanvasTypeEnum.EDIT_LAYOUT_DOM,
|
||||||
@ -17,13 +18,16 @@ export const useLayout = () => {
|
|||||||
document.getElementById('go-chart-edit-content')
|
document.getElementById('go-chart-edit-content')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// 获取数据
|
||||||
|
await fn()
|
||||||
// 监听初始化
|
// 监听初始化
|
||||||
const removeScale = chartEditStore.listenerScale()
|
removeScale = chartEditStore.listenerScale()
|
||||||
|
|
||||||
onUnmounted(() => {
|
})
|
||||||
chartEditStore.setEditCanvas(EditCanvasTypeEnum.EDIT_LAYOUT_DOM, null)
|
|
||||||
chartEditStore.setEditCanvas(EditCanvasTypeEnum.EDIT_CONTENT_DOM, null)
|
onUnmounted(() => {
|
||||||
removeScale()
|
chartEditStore.setEditCanvas(EditCanvasTypeEnum.EDIT_LAYOUT_DOM, null)
|
||||||
})
|
chartEditStore.setEditCanvas(EditCanvasTypeEnum.EDIT_CONTENT_DOM, null)
|
||||||
|
removeScale()
|
||||||
})
|
})
|
||||||
}
|
}
|
@ -109,10 +109,10 @@ const chartEditStore = useChartEditStore()
|
|||||||
const { handleContextMenu } = useContextMenu()
|
const { handleContextMenu } = useContextMenu()
|
||||||
|
|
||||||
// 编辑时注入scale变量,消除警告
|
// 编辑时注入scale变量,消除警告
|
||||||
provide(SCALE_KEY, null);
|
provide(SCALE_KEY, null)
|
||||||
|
|
||||||
// 布局处理
|
// 布局处理
|
||||||
useLayout()
|
useLayout(async () => {})
|
||||||
|
|
||||||
// 点击事件
|
// 点击事件
|
||||||
const { mouseenterHandle, mouseleaveHandle, mousedownHandle, mouseClickHandle } = useMouseHandle()
|
const { mouseenterHandle, mouseleaveHandle, mousedownHandle, mouseClickHandle } = useMouseHandle()
|
||||||
|
@ -185,6 +185,11 @@ export const useSync = () => {
|
|||||||
} else {
|
} else {
|
||||||
await create(comItem as CreateComponentType)
|
await create(comItem as CreateComponentType)
|
||||||
}
|
}
|
||||||
|
if (percentage === 100) {
|
||||||
|
// 清除历史记录
|
||||||
|
chartHistoryStore.clearBackStack()
|
||||||
|
chartHistoryStore.clearForwardStack()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 非组件(顺便排除脏数据)
|
// 非组件(顺便排除脏数据)
|
||||||
|
@ -131,20 +131,6 @@ const selectOptions = ref([
|
|||||||
key: 'preview',
|
key: 'preview',
|
||||||
icon: renderIcon(BrowsersOutlineIcon)
|
icon: renderIcon(BrowsersOutlineIcon)
|
||||||
},
|
},
|
||||||
{
|
|
||||||
label: renderLang('global.r_copy'),
|
|
||||||
key: 'copy',
|
|
||||||
icon: renderIcon(CopyIcon)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: renderLang('global.r_rename'),
|
|
||||||
key: 'rename',
|
|
||||||
icon: renderIcon(PencilIcon)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'divider',
|
|
||||||
key: 'd1'
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: props.cardData?.release
|
label: props.cardData?.release
|
||||||
? renderLang('global.r_unpublish')
|
? renderLang('global.r_unpublish')
|
||||||
@ -152,15 +138,6 @@ const selectOptions = ref([
|
|||||||
key: 'send',
|
key: 'send',
|
||||||
icon: renderIcon(SendIcon)
|
icon: renderIcon(SendIcon)
|
||||||
},
|
},
|
||||||
{
|
|
||||||
label: renderLang('global.r_download'),
|
|
||||||
key: 'download',
|
|
||||||
icon: renderIcon(DownloadIcon)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'divider',
|
|
||||||
key: 'd2'
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: renderLang('global.r_delete'),
|
label: renderLang('global.r_delete'),
|
||||||
key: 'delete',
|
key: 'delete',
|
||||||
|
Loading…
Reference in New Issue
Block a user