mirror of
https://github.com/jumpserver/lina.git
synced 2025-09-25 14:25:23 +00:00
Merge branch 'dev' of github.com:jumpserver/lina into dev
This commit is contained in:
@@ -270,7 +270,7 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
MFAConfirm() {
|
MFAConfirm() {
|
||||||
if (this.MFAInput.length !== 6) {
|
if (this.MFAInput.length !== 6) {
|
||||||
return this.$message.error(this.$t('common.updateErrorMsg'))
|
return this.$message.error(this.$t('common.MFAErrorMsg'))
|
||||||
}
|
}
|
||||||
this.$axios.post(
|
this.$axios.post(
|
||||||
`/api/v1/authentication/otp/verify/`, {
|
`/api/v1/authentication/otp/verify/`, {
|
||||||
|
@@ -223,6 +223,7 @@
|
|||||||
"disableSelected": "禁用所选",
|
"disableSelected": "禁用所选",
|
||||||
"fieldRequiredError": "这个字段是必填项",
|
"fieldRequiredError": "这个字段是必填项",
|
||||||
"getErrorMsg": "获取失败",
|
"getErrorMsg": "获取失败",
|
||||||
|
"MFAErrorMsg":"MFA错误,请检查",
|
||||||
"imExport": {
|
"imExport": {
|
||||||
"ExportAll": "导出所有",
|
"ExportAll": "导出所有",
|
||||||
"ExportOnlyFiltered": "仅导出搜索结果",
|
"ExportOnlyFiltered": "仅导出搜索结果",
|
||||||
@@ -334,7 +335,8 @@
|
|||||||
"totalVersions": "版本数量",
|
"totalVersions": "版本数量",
|
||||||
"version": "版本",
|
"version": "版本",
|
||||||
"versionDetail": "版本详情",
|
"versionDetail": "版本详情",
|
||||||
"versionRunExecution": "执行历史"
|
"versionRunExecution": "执行历史",
|
||||||
|
"Unkown": "未知"
|
||||||
},
|
},
|
||||||
"perms": {
|
"perms": {
|
||||||
"": "",
|
"": "",
|
||||||
|
@@ -191,6 +191,7 @@
|
|||||||
"RemoveSuccessMsg": "Remove success",
|
"RemoveSuccessMsg": "Remove success",
|
||||||
"Reset": "Reset",
|
"Reset": "Reset",
|
||||||
"Search": "Search",
|
"Search": "Search",
|
||||||
|
"MFAErrorMsg":"MFA Error,please check",
|
||||||
"Select": "Select",
|
"Select": "Select",
|
||||||
"SelectFile": "Select file",
|
"SelectFile": "Select file",
|
||||||
"Show": "Show",
|
"Show": "Show",
|
||||||
@@ -334,7 +335,8 @@
|
|||||||
"totalVersions": "Total versions",
|
"totalVersions": "Total versions",
|
||||||
"version": "Version",
|
"version": "Version",
|
||||||
"versionDetail": "Version detail",
|
"versionDetail": "Version detail",
|
||||||
"versionRunExecution": "Version run execution"
|
"versionRunExecution": "Version run execution",
|
||||||
|
"Unkown": "Unkown"
|
||||||
},
|
},
|
||||||
"perms": {
|
"perms": {
|
||||||
"": "",
|
"": "",
|
||||||
|
@@ -45,7 +45,7 @@ export default {
|
|||||||
callbacks: {
|
callbacks: {
|
||||||
change: function(val) {
|
change: function(val) {
|
||||||
this.$axios.patch(
|
this.$axios.patch(
|
||||||
`api/v1/assets/assets/${this.object.id}/`,
|
`/api/v1/assets/assets/${this.object.id}/`,
|
||||||
{ is_active: val }
|
{ is_active: val }
|
||||||
).then(res => {
|
).then(res => {
|
||||||
this.$message.success(this.$t('common.updateSuccessMsg'))
|
this.$message.success(this.$t('common.updateSuccessMsg'))
|
||||||
|
@@ -30,7 +30,7 @@ export default {
|
|||||||
name: 'Detail'
|
name: 'Detail'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
hasRightSide: this.hasRightSide
|
hasRightSide: this.$route.params.id > 7
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@@ -60,4 +60,10 @@ export default {
|
|||||||
.box-margin {
|
.box-margin {
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
.el-table::before{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.el-table >>> td{
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@@ -69,6 +69,7 @@ export default {
|
|||||||
that.iHasObjects = [...that.iHasObjects, ...objects]
|
that.iHasObjects = [...that.iHasObjects, ...objects]
|
||||||
that.$refs.select2.clearSelected()
|
that.$refs.select2.clearSelected()
|
||||||
// setTimeout(() => location.reload(), 300)
|
// setTimeout(() => location.reload(), 300)
|
||||||
|
this.$message.success(this.$t('common.updateSuccessMsg'))
|
||||||
},
|
},
|
||||||
onDeleteSuccess: (obj, that) => {
|
onDeleteSuccess: (obj, that) => {
|
||||||
const theRemoveIndex = that.iHasObjects.findIndex((v) => v.value === obj.value)
|
const theRemoveIndex = that.iHasObjects.findIndex((v) => v.value === obj.value)
|
||||||
|
@@ -4,8 +4,8 @@
|
|||||||
<DetailCard :title="cardTitle" :items="detailCardItems" />
|
<DetailCard :title="cardTitle" :items="detailCardItems" />
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="10">
|
<el-col :span="10">
|
||||||
<RunInfoCard type="primary" v-bind="RunSuccessConfig" />
|
<RunInfoCard v-for="config in RunSuccessConfigs" :key="config.host" type="info" v-bind="config" />
|
||||||
<RunInfoCard type="danger" style="margin-top: 15px" v-bind="RunFailedConfig" />
|
<RunInfoCard v-for="config in RunFailedConfigs" :key="config.host" type="danger" style="margin-top: 15px" v-bind="config" />
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</template>
|
</template>
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
import DetailCard from '@/components/DetailCard/index'
|
import DetailCard from '@/components/DetailCard/index'
|
||||||
import { toSafeLocalDateStr } from '@/utils/common'
|
import { toSafeLocalDateStr } from '@/utils/common'
|
||||||
import RunInfoCard from '../../RunInfoCard'
|
import RunInfoCard from '../../RunInfoCard'
|
||||||
|
import { toLastFailureDisplay, toLastSucessDisplay } from '../business'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'AdhocDetail',
|
name: 'AdhocDetail',
|
||||||
@@ -28,28 +29,35 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
const last_success = toLastSucessDisplay(this.object.latest_execution)
|
||||||
|
const last_failure = toLastFailureDisplay(this.object.latest_execution)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
RunSuccessConfig: {
|
RunSuccessConfigs: last_success.map(host => {
|
||||||
icon: 'fa-info',
|
return {
|
||||||
title: this.$t('ops.lastRunSuccessHosts'),
|
icon: 'fa-info',
|
||||||
content: {
|
title: this.$t('ops.lastRunSuccessHosts'),
|
||||||
hostname: 'linux',
|
content: {
|
||||||
result: 'api没有该数据,api没有该数据api没有该数据api没有该数据api没有该数据api没有该数据api没有该数据api没有该数据api没有该数据api没有该数据api没有该数据api没有该数据'
|
hostname: host,
|
||||||
|
result: ''
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
}),
|
||||||
RunFailedConfig: {
|
RunFailedConfigs: last_failure.map(([host, msg]) => {
|
||||||
icon: 'fa-info',
|
return {
|
||||||
title: this.$t('ops.lastRunFailedHosts'),
|
icon: 'fa-info',
|
||||||
content: {
|
title: this.$t('ops.lastRunFailedHosts'),
|
||||||
hostname: 'window',
|
content: {
|
||||||
result: 'api没有该数据api没有该数据api没有该数据api没有该数据api没有该数据api没有该数据api没有该数据api没有该数据'
|
hostname: host,
|
||||||
|
result: msg
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
cardTitle() {
|
cardTitle() {
|
||||||
return 'api 没有该数据'
|
return `${this.object.task_name}: ${this.object.short_id}`
|
||||||
},
|
},
|
||||||
detailCardItems() {
|
detailCardItems() {
|
||||||
return [
|
return [
|
||||||
@@ -80,7 +88,7 @@ export default {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: this.$t('common.createBy'),
|
key: this.$t('common.createBy'),
|
||||||
value: 'api 没有该数据'
|
value: this.object.created_by
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: this.$t('common.dateCreated'),
|
key: this.$t('common.dateCreated'),
|
||||||
@@ -88,27 +96,34 @@ export default {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: this.$t('ops.runTimes'),
|
key: this.$t('ops.runTimes'),
|
||||||
value: 'api 没有该数据'
|
value: this.object.run_times
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: this.$t('ops.lastRun'),
|
key: this.$t('ops.lastRun'),
|
||||||
value: 'api 没有该数据'
|
value: this.object.latest_execution.last_run
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: this.$t('ops.timeDelta'),
|
key: this.$t('ops.timeDelta'),
|
||||||
value: 'api 没有该数据'
|
value: this.object.latest_execution.timedelta
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: this.$t('ops.isFinished'),
|
key: this.$t('ops.isFinished'),
|
||||||
value: 'api 没有该数据'
|
value: this.toBooleanDisplay(this.object.latest_execution.is_finished)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: this.$t('ops.isSuccess'),
|
key: this.$t('ops.isSuccess'),
|
||||||
value: 'api 没有该数据'
|
value: this.toBooleanDisplay(this.object.latest_execution.is_success)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: this.$t('ops.tasks'),
|
key: this.$t('ops.tasks'),
|
||||||
value: 'api 没有该数据'
|
value: this.toContentsDisplay(this.object.tasks),
|
||||||
|
formatter(row, value) {
|
||||||
|
return (<div>{
|
||||||
|
value.map((content) => {
|
||||||
|
return <div>{ content }</div>
|
||||||
|
})}
|
||||||
|
</div>)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -122,6 +137,23 @@ export default {
|
|||||||
},
|
},
|
||||||
disPlayOptions(options) {
|
disPlayOptions(options) {
|
||||||
return options.replace(/:/g, '=').replace(/'/g, '').replace('{', '').replace('}', '')
|
return options.replace(/:/g, '=').replace(/'/g, '').replace('{', '').replace('}', '')
|
||||||
|
},
|
||||||
|
toContentsDisplay(contents) {
|
||||||
|
const lines = []
|
||||||
|
for (let i = 0; i < contents.length; i++) {
|
||||||
|
const content = contents[i]
|
||||||
|
lines.push(`${i}. ${content.name} ::: ${content.action.module}`)
|
||||||
|
}
|
||||||
|
return lines
|
||||||
|
},
|
||||||
|
toBooleanDisplay(value) {
|
||||||
|
if (value === true) {
|
||||||
|
return this.$t('ops.Yes')
|
||||||
|
} else if (value === false) {
|
||||||
|
return this.$t('ops.No')
|
||||||
|
} else {
|
||||||
|
return this.$t('ops.Unkown')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -4,8 +4,8 @@
|
|||||||
<DetailCard :title="cardTitle" :items="detailCardItems" />
|
<DetailCard :title="cardTitle" :items="detailCardItems" />
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="10">
|
<el-col :span="10">
|
||||||
<RunInfoCard type="primary" v-bind="RunSuccessConfig" />
|
<RunInfoCard v-for="config in RunSuccessConfigs" :key="config.host" type="info" v-bind="config" />
|
||||||
<RunInfoCard type="danger" style="margin-top: 15px" v-bind="RunFailedConfig" />
|
<RunInfoCard v-for="config in RunFailedConfigs" :key="config.host" type="danger" style="margin-top: 15px" v-bind="config" />
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</template>
|
</template>
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
import DetailCard from '@/components/DetailCard'
|
import DetailCard from '@/components/DetailCard'
|
||||||
import { toSafeLocalDateStr } from '@/utils/common'
|
import { toSafeLocalDateStr } from '@/utils/common'
|
||||||
import RunInfoCard from '../../RunInfoCard'
|
import RunInfoCard from '../../RunInfoCard'
|
||||||
|
import { toLastFailureDisplay, toLastSucessDisplay } from '../business'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'HistoryExecutionDetail',
|
name: 'HistoryExecutionDetail',
|
||||||
@@ -28,23 +29,30 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
const last_success = toLastSucessDisplay(this.object)
|
||||||
|
const last_failure = toLastFailureDisplay(this.object)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
RunSuccessConfig: {
|
RunSuccessConfigs: last_success.map(host => {
|
||||||
icon: 'fa-info',
|
return {
|
||||||
title: this.$t('ops.lastRunSuccessHosts'),
|
icon: 'fa-info',
|
||||||
content: {
|
title: this.$t('ops.lastRunSuccessHosts'),
|
||||||
hostname: 'linux',
|
content: {
|
||||||
result: 'api没有该数据==api没有该数据api没有该数据api没有该数据api没有该数据'
|
hostname: host,
|
||||||
|
result: ''
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
}),
|
||||||
RunFailedConfig: {
|
RunFailedConfigs: last_failure.map(([host, msg]) => {
|
||||||
icon: 'fa-info',
|
return {
|
||||||
title: this.$t('ops.lastRunFailedHosts'),
|
icon: 'fa-info',
|
||||||
content: {
|
title: this.$t('ops.lastRunFailedHosts'),
|
||||||
hostname: 'linux',
|
content: {
|
||||||
result: 'api没有该数据==api没有该数据api没有该数据api没有该数据api没有该数据'
|
hostname: host,
|
||||||
|
result: msg
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
<script type="text/jsx">
|
<script type="text/jsx">
|
||||||
import DetailCard from '@/components/DetailCard'
|
import DetailCard from '@/components/DetailCard'
|
||||||
import RunInfoCard from '../RunInfoCard/index'
|
import RunInfoCard from '../RunInfoCard/index'
|
||||||
|
import { toLastFailureDisplay, toLastSucessDisplay } from './business'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'TaskDetail',
|
name: 'TaskDetail',
|
||||||
@@ -27,21 +28,8 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
let last_success = this.object.last_success
|
const last_success = toLastSucessDisplay(this.object.latest_execution)
|
||||||
last_success.length || (last_success = [''])
|
const last_failure = toLastFailureDisplay(this.object.latest_execution)
|
||||||
|
|
||||||
let last_failure = []
|
|
||||||
for (const host in this.object.last_failure) {
|
|
||||||
const task = this.object.last_failure[host]
|
|
||||||
const msgs = []
|
|
||||||
for (const name in task) {
|
|
||||||
msgs.push(`${name} => ${task[name].msg}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
last_failure.push([host, msgs.join('\n')])
|
|
||||||
}
|
|
||||||
|
|
||||||
last_failure.length || (last_failure = [['', '']])
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
RunSuccessConfigs: last_success.map(host => {
|
RunSuccessConfigs: last_success.map(host => {
|
||||||
@@ -115,7 +103,14 @@ export default {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: this.$t('ops.contents'),
|
key: this.$t('ops.contents'),
|
||||||
value: 'api 没有该数据'
|
value: this.toContentsDisplay(this.object.contents),
|
||||||
|
formatter(row, value) {
|
||||||
|
return (<div>{
|
||||||
|
value.map((content) => {
|
||||||
|
return <div>{ content }</div>
|
||||||
|
})}
|
||||||
|
</div>)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: this.$t('ops.lastExecutionOutput'),
|
key: this.$t('ops.lastExecutionOutput'),
|
||||||
@@ -137,6 +132,14 @@ export default {
|
|||||||
return this.$t('ops.No')
|
return this.$t('ops.No')
|
||||||
}
|
}
|
||||||
return this.$t('ops.Yes')
|
return this.$t('ops.Yes')
|
||||||
|
},
|
||||||
|
toContentsDisplay(contents) {
|
||||||
|
const lines = []
|
||||||
|
for (let i = 0; i < contents.length; i++) {
|
||||||
|
const content = contents[i]
|
||||||
|
lines.push(`${i}. ${content.name} ::: ${content.action.module}`)
|
||||||
|
}
|
||||||
|
return lines
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
24
src/views/ops/TaskDetail/business.js
Normal file
24
src/views/ops/TaskDetail/business.js
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
export const toLastSucessDisplay = function(object) {
|
||||||
|
if (!object) return ['']
|
||||||
|
const last_success = object.last_success
|
||||||
|
last_success.length || last_success.push('')
|
||||||
|
return last_success
|
||||||
|
}
|
||||||
|
|
||||||
|
export const toLastFailureDisplay = function(object) {
|
||||||
|
if (!object) return [['', '']]
|
||||||
|
const last_failure = []
|
||||||
|
for (const host in object.last_failure) {
|
||||||
|
const task = object.last_failure[host]
|
||||||
|
const msgs = []
|
||||||
|
for (const name in task) {
|
||||||
|
msgs.push(`${name} => ${task[name].msg}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
last_failure.push([host, msgs.join('\n')])
|
||||||
|
}
|
||||||
|
|
||||||
|
last_failure.length || last_failure.push(['', ''])
|
||||||
|
return last_failure
|
||||||
|
}
|
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { GenericCreateUpdatePage } from '@/layout/components'
|
import { GenericCreateUpdatePage } from '@/layout/components'
|
||||||
|
import AssetPermissionFormActionField from './components/AssetPermissionFormActionField'
|
||||||
import AssetSelect from '@/components/AssetSelect'
|
import AssetSelect from '@/components/AssetSelect'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -89,14 +90,7 @@ export default {
|
|||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
label: this.$t('perms.Actions'),
|
label: this.$t('perms.Actions'),
|
||||||
type: 'checkbox-group',
|
component: AssetPermissionFormActionField
|
||||||
options: [
|
|
||||||
{ label: 'all', value: this.$t('perms.all') },
|
|
||||||
{ label: 'connect', value: this.$t('perms.connect') },
|
|
||||||
{ label: 'updownload', value: this.$t('perms.upDownload') },
|
|
||||||
{ label: 'upload_file', value: this.$t('perms.uploadFile') },
|
|
||||||
{ label: 'download_file', value: this.$t('perms.downloadFile') }
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
date_start: {
|
date_start: {
|
||||||
label: this.$t('common.dateStart')
|
label: this.$t('common.dateStart')
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-row :gutter="20">
|
<el-row :gutter="20">
|
||||||
<el-col :md="14" :sm="24">
|
<el-col :md="14" :sm="24">
|
||||||
<ListTable ref="ListTable" :table-config="tableConfig" :header-actions="headerActions" />
|
<ListTable ref="ListTable" :table-config="tableConfig" :header-actions="headerActions" class- />
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :md="10" :sm="24">
|
<el-col :md="10" :sm="24">
|
||||||
<AssetRelationCard type="primary" v-bind="assetRelationConfig" />
|
<AssetRelationCard type="primary" v-bind="assetRelationConfig" />
|
||||||
|
@@ -0,0 +1,67 @@
|
|||||||
|
<template>
|
||||||
|
<el-tree
|
||||||
|
:data="data"
|
||||||
|
show-checkbox
|
||||||
|
node-key="id"
|
||||||
|
:default-expand-all="true"
|
||||||
|
:default-checked-keys="value"
|
||||||
|
:props="defaultProps"
|
||||||
|
@check="handleCheckChange"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'AssetPermissionFormActionFiel',
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
type: Array,
|
||||||
|
default: () => ['all', 'connect', 'upload_file', 'download_file', 'updownload']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
defaultProps: {
|
||||||
|
children: 'children',
|
||||||
|
label: 'label'
|
||||||
|
},
|
||||||
|
data: [
|
||||||
|
{
|
||||||
|
id: 'all',
|
||||||
|
label: this.$t('perms.all'),
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
id: 'connect',
|
||||||
|
label: this.$t('perms.connect')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'updownload',
|
||||||
|
label: this.$t('perms.upDownload'),
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
id: 'upload_file',
|
||||||
|
label: this.$t('perms.uploadFile')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'download_file',
|
||||||
|
label: this.$t('perms.downloadFile')
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleCheckChange(data, obj) {
|
||||||
|
const checkedKeys = obj.checkedKeys
|
||||||
|
this.$emit('input', checkedKeys)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
Reference in New Issue
Block a user