mirror of
https://github.com/jumpserver/lina.git
synced 2026-01-13 11:24:17 +00:00
merge pr@dev@refactor_tickets
This commit is contained in:
@@ -27,7 +27,7 @@ export default {
|
||||
createRoute: {
|
||||
type: [String, Object, Function],
|
||||
default: function() {
|
||||
return this.$route.name.replace('List', 'Create')
|
||||
return this.$route.name?.replace('List', 'Create')
|
||||
}
|
||||
},
|
||||
createInNewPage: {
|
||||
|
||||
@@ -690,6 +690,8 @@
|
||||
"AssetAccount": "资产账号",
|
||||
"ApplicationAccount": "应用账号",
|
||||
"Ticket":"工单",
|
||||
"MyTickets": "我的申请",
|
||||
"AssignedTicketList": "待我审批",
|
||||
"SessionDetail": "会话详情",
|
||||
"CommandConfirm": "命令复核",
|
||||
"AdminUserCreate": "创建管理用户",
|
||||
@@ -1132,8 +1134,8 @@
|
||||
"Assignee": "处理人",
|
||||
"Assignees": "待处理人",
|
||||
"Close": "关闭",
|
||||
"OpenStatus":"开启",
|
||||
"CloseStatus":"关闭",
|
||||
"OpenStatus":"审批中",
|
||||
"CloseStatus":"已完成",
|
||||
"Comment": "备注",
|
||||
"MyTickets": "我发起的",
|
||||
"RequestPerm":"授权申请",
|
||||
|
||||
@@ -89,7 +89,7 @@ export default {
|
||||
createSuccessNextRoute: {
|
||||
type: Object,
|
||||
default: function() {
|
||||
const routeName = this.$route.name.replace('Create', 'List')
|
||||
const routeName = this.$route.name?.replace('Create', 'List')
|
||||
return { name: routeName }
|
||||
}
|
||||
},
|
||||
@@ -97,15 +97,14 @@ export default {
|
||||
updateSuccessNextRoute: {
|
||||
type: Object,
|
||||
default: function() {
|
||||
const routeName = this.$route.name.replace('Update', 'List')
|
||||
const routeName = this.$route.name?.replace('Update', 'List')
|
||||
return { name: routeName }
|
||||
}
|
||||
},
|
||||
objectDetailRoute: {
|
||||
type: Object,
|
||||
default: function() {
|
||||
const routeName = this.$route.name
|
||||
.replace('Update', 'Detail')
|
||||
const routeName = this.$route.name?.replace('Update', 'Detail')
|
||||
.replace('Create', 'Detail')
|
||||
return { name: routeName }
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import i18n from '@/i18n/i18n'
|
||||
|
||||
export default {
|
||||
path: '/tickets',
|
||||
redirect: '/tickets/tickets',
|
||||
redirect: '/tickets/my-tickets',
|
||||
component: Layout,
|
||||
meta: {
|
||||
title: i18n.t('route.Tickets'),
|
||||
@@ -17,26 +17,40 @@ export default {
|
||||
permissions: ['tickets.view_ticket']
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: '/tickets/my-tickets',
|
||||
name: 'MyTicketList',
|
||||
component: () => import('@/views/tickets/MyTicketList'),
|
||||
meta: {
|
||||
title: i18n.t('route.MyTickets'),
|
||||
icon: 'file-text-o',
|
||||
showOrganization: false,
|
||||
permissions: []
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
path: '/tickets/assigned-tickets',
|
||||
name: 'AssignedTicketList',
|
||||
component: () => import('@/views/tickets/AssignedTicketList'),
|
||||
meta: {
|
||||
title: i18n.t('route.AssignedTicketList'),
|
||||
icon: 'check-square-o',
|
||||
showOrganization: false,
|
||||
permissions: []
|
||||
}
|
||||
},
|
||||
{
|
||||
path: '/tickets/tickets',
|
||||
redirect: '',
|
||||
component: empty,
|
||||
hidden: true,
|
||||
meta: {
|
||||
title: i18n.t('route.Tickets'),
|
||||
icon: 'file-text-o',
|
||||
showOrganization: false
|
||||
},
|
||||
children: [
|
||||
{
|
||||
path: '',
|
||||
name: 'TicketList',
|
||||
component: () => import('@/views/tickets'),
|
||||
meta: {
|
||||
title: i18n.t('route.Tickets'),
|
||||
icon: 'file-text-o',
|
||||
permissions: ['tickets.view_ticket']
|
||||
}
|
||||
},
|
||||
{
|
||||
path: 'request-asset-perm/create',
|
||||
name: 'RequestAssetPermTicketCreateUpdate',
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
<template>
|
||||
<TicketListTable :url="url" />
|
||||
<BaseTicketList :url="url" />
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import TicketListTable from './TicketListTable'
|
||||
import BaseTicketList from './BaseTicketList'
|
||||
import { mapGetters } from 'vuex'
|
||||
export default {
|
||||
name: 'AssignedTicketList',
|
||||
components: {
|
||||
TicketListTable
|
||||
BaseTicketList
|
||||
},
|
||||
computed: {
|
||||
url() {
|
||||
|
||||
@@ -1,15 +1,20 @@
|
||||
<template>
|
||||
<ListTable :table-config="ticketTableConfig" :header-actions="ticketActions" />
|
||||
<GenericListPage
|
||||
v-loading="loading"
|
||||
:table-config="ticketTableConfig"
|
||||
:header-actions="ticketActions"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script type="text/jsx">
|
||||
import ListTable from '@/components/ListTable'
|
||||
import { GenericListPage } from '@/layout/components'
|
||||
import { DetailFormatter } from '@/components/TableFormatters'
|
||||
import { toSafeLocalDateStr } from '@/utils/common'
|
||||
import { APPROVE, REJECT, CLOSED } from './const'
|
||||
import { APPROVE, REJECT } from './const'
|
||||
export default {
|
||||
name: 'TicketListTable',
|
||||
components: {
|
||||
ListTable
|
||||
GenericListPage
|
||||
},
|
||||
props: {
|
||||
url: {
|
||||
@@ -23,6 +28,7 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
loading: true,
|
||||
ticketTableConfig: {
|
||||
url: this.url,
|
||||
columns: [
|
||||
@@ -70,9 +76,9 @@ export default {
|
||||
sortable: 'custom',
|
||||
formatter: row => {
|
||||
if (row.status === 'open') {
|
||||
return <el-tag type='primary' size='mini'style='align-items:center; display: flex; justify-content:center;'> { this.$t('tickets.OpenStatus') }</el-tag>
|
||||
return <el-tag type='primary' size='mini'> { this.$t('tickets.OpenStatus') }</el-tag>
|
||||
} else {
|
||||
return <el-tag type='danger' size='mini'style='align-items:center; display: flex; justify-content:center;'> { this.$t('tickets.CloseStatus') }</el-tag>
|
||||
return <el-tag type='danger' size='mini'> { this.$t('tickets.CloseStatus') }</el-tag>
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -84,15 +90,26 @@ export default {
|
||||
sortable: 'custom',
|
||||
formatter: row => {
|
||||
if (row.status === 'open') {
|
||||
return <el-tag type='success' size='mini'style='align-items:center; display: flex; justify-content:center;'> { this.$t('tickets.Pending') }</el-tag>
|
||||
return <el-tag
|
||||
type='success'
|
||||
size='mini'
|
||||
>
|
||||
{ this.$t('tickets.Pending') }
|
||||
</el-tag>
|
||||
}
|
||||
switch (row.state) {
|
||||
case 'approved':
|
||||
return <el-tag type='primary' size='mini' style='align-items:center; display: flex; justify-content:center;'> { this.$t('tickets.Approved') }</el-tag>
|
||||
return <el-tag type='primary' size='mini'>
|
||||
{ this.$t('tickets.Approved') }
|
||||
</el-tag>
|
||||
case 'rejected':
|
||||
return <el-tag type='danger' size='mini' style='align-items:center; display: flex; justify-content:center;'> { this.$t('tickets.Rejected') }</el-tag>
|
||||
return <el-tag type='danger' size='mini'>
|
||||
{ this.$t('tickets.Rejected') }
|
||||
</el-tag>
|
||||
default :
|
||||
return <el-tag type='info' size='mini' style='align-items:center; display: flex; justify-content:center;'> { this.$t('tickets.Closed') }</el-tag>
|
||||
return <el-tag type='info' size='mini'>
|
||||
{ this.$t('tickets.Closed') }
|
||||
</el-tag>
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -138,10 +155,6 @@ export default {
|
||||
{
|
||||
value: REJECT,
|
||||
label: this.$t('tickets.Rejected')
|
||||
},
|
||||
{
|
||||
value: CLOSED,
|
||||
label: this.$t('tickets.Closed')
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -154,18 +167,27 @@ export default {
|
||||
{
|
||||
name: 'RequestAssetPerm',
|
||||
title: this.$t('tickets.RequestAssetPerm'),
|
||||
callback: () => this.$router.push({ name: 'RequestAssetPermTicketCreateUpdate' })
|
||||
callback: () => this.$router.push({
|
||||
name: 'RequestAssetPermTicketCreateUpdate'
|
||||
})
|
||||
},
|
||||
{
|
||||
name: 'RequestApplicationPerm',
|
||||
title: this.$t('tickets.RequestApplicationPerm'),
|
||||
callback: () => this.$router.push({ name: 'RequestApplicationPermTicketCreateUpdate' })
|
||||
callback: () => this.$router.push({
|
||||
name: 'RequestApplicationPermTicketCreateUpdate'
|
||||
})
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
setTimeout(() => {
|
||||
this.loading = false
|
||||
}, 500)
|
||||
},
|
||||
methods: {
|
||||
}
|
||||
}
|
||||
@@ -1,18 +1,17 @@
|
||||
<template>
|
||||
<TicketListTable :url="url" :has-more-actions="true" />
|
||||
<BaseTicketList :url="url" :has-more-actions="true" />
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import TicketListTable from './TicketListTable'
|
||||
import BaseTicketList from './BaseTicketList'
|
||||
import { mapGetters } from 'vuex'
|
||||
export default {
|
||||
name: 'MyTicketList',
|
||||
components: {
|
||||
TicketListTable
|
||||
BaseTicketList
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
|
||||
Reference in New Issue
Block a user