[Update] 暂时注释

This commit is contained in:
ibuler
2020-05-13 16:45:51 +08:00
12 changed files with 142 additions and 78 deletions

View File

@@ -16,17 +16,12 @@ module.exports = {
}, },
settings: { settings: {
'vue-i18n': { 'vue-i18n': {
localeDir: './src/i18n/langs/*/*.json' // extention is glob formatting! localeDir: './src/i18n/langs/*.json' // extention is glob formatting!
} }
}, },
// add your custom rules here // add your custom rules here
// it is base on https://github.com/vuejs/eslint-config-vue // it is base on https://github.com/vuejs/eslint-config-vue
rules: { rules: {
// Optional.
'vue-i18n/no-dynamic-keys': 'error',
'vue-i18n/no-unused-keys': ['error', {
extensions: ['.js', '.vue']
}],
'vue/max-attributes-per-line': [2, { 'vue/max-attributes-per-line': [2, {
'singleline': 10, 'singleline': 10,
'multiline': { 'multiline': {

View File

@@ -97,7 +97,6 @@
], ],
"husky": { "husky": {
"hooks": { "hooks": {
"pre-commit": "lint-staged"
} }
}, },
"lint-staged": { "lint-staged": {

View File

@@ -3,7 +3,7 @@ export default {
name: 'ItemValue', name: 'ItemValue',
props: { props: {
value: { value: {
type: [String, Function], type: [String, Function, Array],
default: '' default: ''
}, },
item: { item: {
@@ -11,7 +11,8 @@ export default {
default: () => ({}) default: () => ({})
}, },
callback: { callback: {
type: Function type: Function,
default: () => ({})
} }
}, },

View File

@@ -147,6 +147,7 @@
"show": "显示", "show": "显示",
"QuickUpdate": "快速更新", "QuickUpdate": "快速更新",
"Activate": "激活", "Activate": "激活",
"DateCreate": "创建日期",
"actions": { "actions": {
"exportRange": "导出范围", "exportRange": "导出范围",
"exportAll": "导出全部", "exportAll": "导出全部",
@@ -186,7 +187,10 @@
"Command filter": "命令过滤器", "Command filter": "命令过滤器",
"confirm": "确认", "confirm": "确认",
"import": "导入", "import": "导入",
"IsValid": "合法" "IsValid": "合法",
"Open": "打开",
"Close": "关闭",
"DateCreated": "创建日期"
}, },
"applications": { "applications": {
"applications": "应用管理", "applications": "应用管理",
@@ -663,7 +667,11 @@
"MyTickets": "我的工单", "MyTickets": "我的工单",
"AssignedMe": "待处理", "AssignedMe": "待处理",
"Assignees": "待处理人", "Assignees": "待处理人",
"Assignee": "处理人" "Assignee": "处理人",
"Accept": "接受",
"Reject": "拒绝",
"Close": "关闭",
"Comment": "备注"
}, },
"users": { "users": {
"Account": "账户", "Account": "账户",
@@ -757,4 +765,4 @@
"settings": { "settings": {
"setting": "" "setting": ""
} }
} }

View File

@@ -69,10 +69,10 @@
"SystemUserCreate": "创建系统用户", "SystemUserCreate": "创建系统用户",
"SystemUserUpdate": "更新系统用户", "SystemUserUpdate": "更新系统用户",
"": "", "": "",
"DatabaseApp": "", "DatabaseApp": "Database apps",
"DatabaseAppDetail": "", "DatabaseAppDetail": "Database app detail",
"RemoteApp": "", "RemoteApp": "Remote apps",
"RemoteAppDetail": "" "RemoteAppDetail": "Remote app detail"
}, },
"common": { "common": {
"Other": "Other", "Other": "Other",
@@ -105,6 +105,7 @@
"BasicInfo": "Basic info", "BasicInfo": "Basic info",
"quickUpdate": "Quick update", "quickUpdate": "Quick update",
"MoreActions": "Actions", "MoreActions": "Actions",
"DateCreated": "Date created",
"nav": { "nav": {
"Help": "Help", "Help": "Help",
"Docs": "Docs", "Docs": "Docs",
@@ -144,12 +145,14 @@
"cancel": "" "cancel": ""
}, },
"Auth": "", "Auth": "",
"Command filter": "", "Command filter": "Command filter",
"Others": "", "Others": "",
"updateFailedMsg": "", "updateFailedMsg": "",
"confirm": "", "confirm": "Confirm",
"import": "", "import": "Import",
"IsValid": "" "IsValid": "Is valid",
"Open": "Open",
"Close": "Close"
}, },
"applications": { "applications": {
"applications": "Applications", "applications": "Applications",
@@ -737,6 +740,10 @@
"MyTickets": "", "MyTickets": "",
"AssignedMe": "", "AssignedMe": "",
"title": "", "title": "",
"date": "" "date": "",
"Accept": "",
"Reject": "",
"Close": "",
"Comment": ""
} }
} }

View File

@@ -105,3 +105,8 @@ export function param2Obj(url) {
'"}' '"}'
) )
} }
// 将标准时间转换成时间戳
export function getDateTimeStamp(dateStr) {
return Date.parse(dateStr.replace(/-/gi, '/'))
}

View File

@@ -7,24 +7,24 @@
<el-avatar :src="imageUrl" class="header-avatar" /> <el-avatar :src="imageUrl" class="header-avatar" />
</a> </a>
<div class="media-body "> <div class="media-body ">
<strong>{{ object.user_display }}</strong> <small class="text-muted"> {{ object.date_created }}</small> <strong>{{ object.user_display }}</strong> <small class="text-muted"> {{ formatTime(object.date_created) }}</small>
<br> <br>
<small class="text-muted">{{ object.date_created }} </small> <small class="text-muted">{{ toSafeLocalDateStr(object.date_created) }} </small>
<div style="padding-top: 10px"> <div style="padding-top: 10px">
<span v-html="object.body" /> <span v-html="object.body" />
</div> </div>
</div> </div>
</div> </div>
<template v-if="object.status === 'closed'"> <template v-if="comments">
<div v-for="item in comments" :key="item.user_display + item.body"> <div v-for="item in comments" :key="item.user_display + item.body">
<div class="feed-element"> <div class="feed-element">
<a href="#" class="pull-left"> <a href="#" class="pull-left">
<el-avatar :src="imageUrl" class="header-avatar" /> <el-avatar :src="imageUrl" class="header-avatar" />
</a> </a>
<div class="media-body "> <div class="media-body ">
<strong>{{ item.user_display }}</strong> <small class="text-muted">{{ item.date_created }}</small> <strong>{{ item.user_display }}</strong> <small class="text-muted">{{ formatTime(item.date_created) }}</small>
<br> <br>
<small class="text-muted">{{ item.date_created }}</small> <small class="text-muted">{{ toSafeLocalDateStr(item.date_created) }}</small>
<div style="padding-top: 10px"> <div style="padding-top: 10px">
{{ item.body }} {{ item.body }}
</div> </div>
@@ -32,15 +32,17 @@
</div> </div>
</div> </div>
</template> </template>
<el-form ref="comments" :model="form" label-width="80px" style="padding-top: 20px"> <el-form ref="comments" :model="form" label-width="45px" style="padding-top: 20px">
<el-form-item label="审批备注"> <el-form-item label="回复">
<el-input v-model="form.comments" type="textarea" :autosize="{ minRows: 4 }" /> <el-input v-model="form.comments" :autosize="{ minRows: 4 }" type="textarea" />
</el-form-item> </el-form-item>
<el-form-item style="float: right"> <el-form-item style="float: right">
<el-button type="primary" size="small" :disabled="object.status === 'closed'" @click="handleApprove"><i class="fa fa-check" />同意</el-button> <template v-if="hasActionPerm">
<el-button type="warning" size="small" :disabled="object.status === 'closed'" @click="handleReject"><i class="fa fa-ban" />拒绝</el-button> <el-button :disabled="object.status === 'closed'" @click="handleApprove" type="primary" size="small"><i class="fa fa-check" />{{ $t('tickets.Accept') }}</el-button>
<el-button type="danger" size="small" :disabled="object.status === 'closed'" @click="handleClosed"><i class="fa fa-times" />关闭</el-button> <el-button :disabled="object.status === 'closed'" @click="handleReject" type="warning" size="small"><i class="fa fa-ban" />{{ $t('tickets.Reject') }}</el-button>
<el-button type="info" size="small" :disabled="object.status === 'closed'" @click="handleComment"><i class="fa fa-pencil" />备注</el-button> </template>
<el-button :disabled="object.status === 'closed'" @click="handleClosed" type="danger" size="small"><i class="fa fa-times" />{{ $t('tickets.Close') }}</el-button>
<el-button :disabled="object.status === 'closed'" @click="handleComment" type="info" size="small"><i class="fa fa-pencil" />{{ $t('tickets.Comment') }}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
@@ -50,6 +52,8 @@
<script> <script>
import { DetailCard } from '@/components' import { DetailCard } from '@/components'
import { formatTime, getDateTimeStamp } from '@/utils/index'
import { toSafeLocalDateStr } from '@/utils/common'
export default { export default {
name: 'TicketDetail', name: 'TicketDetail',
@@ -64,12 +68,11 @@ export default {
}, },
data() { data() {
return { return {
title: '登录复核a-2(a-2)',
imageUrl: require('@/assets/img/admin.png'), imageUrl: require('@/assets/img/admin.png'),
form: { form: {
comments: '' comments: ''
}, },
comments: [] comments: ''
} }
}, },
computed: { computed: {
@@ -77,6 +80,7 @@ export default {
return this.object.title return this.object.title
}, },
detailCardItems() { detailCardItems() {
const vm = this
return [ return [
{ {
key: this.$t('tickets.user'), key: this.$t('tickets.user'),
@@ -88,7 +92,15 @@ export default {
}, },
{ {
key: this.$t('tickets.status'), key: this.$t('tickets.status'),
value: this.object.status value: this.object.status,
callback: function(row, data) {
const open = vm.$t('common.Open')
const close = vm.$t('common.Close')
if (data === 'open') {
return <el-button type='primary' size='mini'>{open}</el-button>
}
return <el-button type='danger' size='mini'>{close}</el-button>
}
}, },
{ {
key: this.$t('tickets.Assignees'), key: this.$t('tickets.Assignees'),
@@ -96,33 +108,78 @@ export default {
}, },
{ {
key: this.$t('tickets.Assignee'), key: this.$t('tickets.Assignee'),
value: '需要处理' value: this.comments,
callback: function(row, data) {
if (data.length !== 0) {
return <span>{data[0].user_display}</span>
}
return <span></span>
}
}, },
{ {
key: this.$t('common.dateCreated'), key: this.$t('common.DateCreated'),
value: this.object.date_created value: toSafeLocalDateStr(this.object.date_created)
} }
] ]
},
hasActionPerm() {
return this.object.assignees.indexOf(this.$store.state.users.profile.id) !== -1
} }
}, },
mounted() { mounted() {
const url = `/api/v1/tickets/tickets/${this.object.id}/comments/` const url = `/api/v1/tickets/tickets/${this.object.id}/comments/`
this.$axios.get(url).then(res => { this.$axios.get(url).then(res => {
this.comments = res this.comments = res
}).catch(err => this.$message.error(this.$t(err))) }).catch(err => {
this.$message.error(err)
})
}, },
methods: { methods: {
formatTime(dateStr) {
return formatTime(getDateTimeStamp(dateStr))
},
toSafeLocalDateStr(dataStr) {
return toSafeLocalDateStr(dataStr)
},
reloadPage() {
window.location.reload()
},
createComment(successCallback) {
const commentText = this.form.comments
const ticketId = this.object.id
const commentUrl = `/api/v1/tickets/tickets/${ticketId}/comments/`
if (!commentText) { return }
const body = {
body: commentText,
ticket: ticketId
}
this.$axios.post(commentUrl, body).then(res => {
if (successCallback) {
successCallback()
} else {
this.reloadPage()
}
})
},
handleApprove() { handleApprove() {
console.log('点击同意=====================') this.createComment(function() {})
const url = `/api/v1/tickets/tickets/${this.object.id}/`
const data = { action: 'approve' }
this.$axios.patch(url, data).then(res => this.reloadPage()).catch(err => this.$message.error(err))
}, },
handleReject() { handleReject() {
console.log('点击拒绝=====================') this.createComment(function() {})
const url = `/api/v1/tickets/tickets/${this.object.id}/`
const data = { action: 'reject' }
this.$axios.patch(url, data).then(res => this.reloadPage()).catch(err => this.$message.error(err))
}, },
handleClosed() { handleClosed() {
console.log('点击关闭=====================') const url = `/api/v1/tickets/tickets/${this.object.id}/`
const data = { status: 'closed' }
this.$axios.patch(url, data).then(res => this.reloadPage()).catch(err => this.$message.error(err))
}, },
handleComment() { handleComment() {
console.log('点击备注=====================') this.createComment()
} }
} }
} }
@@ -131,6 +188,7 @@ export default {
<style scoped> <style scoped>
.feed-activity-list { .feed-activity-list {
padding-top: 20px; padding-top: 20px;
line-height: 1.5;
} }
.feed-activity-list .feed-element { .feed-activity-list .feed-element {
border-bottom: 1px solid #e7eaec; border-bottom: 1px solid #e7eaec;
@@ -142,10 +200,7 @@ export default {
padding-top: 15px; padding-top: 15px;
padding-bottom: 15px; padding-bottom: 15px;
} }
.feed-element,
.feed-element .media {
margin-top: 15px;
}
.feed-element, .feed-element,
.media-body { .media-body {
overflow: hidden; overflow: hidden;
@@ -157,21 +212,6 @@ export default {
width: 38px; width: 38px;
height: 38px; height: 38px;
} }
.feed-element .well {
border: 1px solid #e7eaec;
box-shadow: none;
margin-top: 10px;
margin-bottom: 5px;
padding: 10px 20px;
font-size: 11px;
line-height: 16px;
}
.feed-element .actions {
margin-top: 10px;
}
.feed-element .photos {
margin: 10px 0;
}
.text-muted { .text-muted {
color: #888888; color: #888888;
} }

View File

@@ -1,6 +1,6 @@
<template> <template>
<GenericDetailPage :object.sync="ticket" :active-menu.sync="config.activeMenu" v-bind="config" v-on="$listeners"> <GenericDetailPage :object.sync="ticket" :active-menu.sync="config.activeMenu" v-bind="config" v-on="$listeners">
<component :is="config.activeMenu" :object="ticket" /> <component v-bind:is="config.activeMenu" :object="ticket" />
</GenericDetailPage> </GenericDetailPage>
</template> </template>
@@ -16,7 +16,7 @@ export default {
}, },
data() { data() {
return { return {
ticket: {}, ticket: { title: '', user_display: '', type_display: '', status: '', assignees_display: '', date_created: '' },
config: { config: {
activeMenu: 'TicketDetail', activeMenu: 'TicketDetail',
submenu: [ submenu: [
@@ -24,9 +24,15 @@ export default {
title: '工单详情', title: '工单详情',
name: 'TicketDetail' name: 'TicketDetail'
} }
] ],
getObjectName: this.getObjectName
} }
} }
},
methods: {
getObjectName() {
return this.ticket.user_display
}
} }
} }
</script> </script>

View File

@@ -9,7 +9,7 @@ export default [
path: 'tickets/:id', path: 'tickets/:id',
name: 'TicketDetail', name: 'TicketDetail',
component: () => import('@/views/tickets/TicketDetail/index'), component: () => import('@/views/tickets/TicketDetail/index'),
meta: { title: 'TicketDetail' }, meta: { title: 'TicketDetail', activeMenu: '/tickets/tickets' },
hidden: true hidden: true
} }
] ]

View File

@@ -1,22 +1,23 @@
<template> <template>
<GenericDetailPage :object.sync="group" :active-menu.sync="config.activeMenu" v-bind="config" v-on="$listeners"> <GenericDetailPage :object.sync="group" :active-menu.sync="config.activeMenu" v-bind="config" v-on="$listeners">
<keep-alive> <keep-alive>
<component :is="config.activeMenu" :object="group" /> <component v-bind:is="config.activeMenu" :object="group" />
</keep-alive> </keep-alive>
</GenericDetailPage> </GenericDetailPage>
</template> </template>
<script> <script>
import { GenericDetailPage, TabPage } from '@/layout/components' import { GenericDetailPage } from '@/layout/components'
import GroupGrantedAssets from './GroupGrantedAssets' import GroupGrantedAssets from './GroupGrantedAssets'
import GroupInfo from './GroupInfo' import GroupInfo from './GroupInfo'
export default { export default {
components: { components: {
GenericDetailPage, GenericDetailPage,
// eslint-disable-next-line vue/no-unused-components
GroupGrantedAssets, GroupGrantedAssets,
GroupInfo, // eslint-disable-next-line vue/no-unused-components
TabPage GroupInfo
}, },
data() { data() {
return { return {

View File

@@ -4,8 +4,8 @@
<DetailCard :items="detailItems" /> <DetailCard :items="detailItems" />
</el-col> </el-col>
<el-col :md="10" :sm="24"> <el-col :md="10" :sm="24">
<QuickActions type="primary" :actions="quickActions" /> <QuickActions :actions="quickActions" type="primary" />
<RelationCard type="info" style="margin-top: 15px" v-bind="relationConfig" /> <RelationCard v-bind="relationConfig" type="info" style="margin-top: 15px" />
</el-col> </el-col>
</el-row> </el-row>
</template> </template>
@@ -245,6 +245,9 @@ export default {
this.relationConfig.hasObjectsId = iNew.users this.relationConfig.hasObjectsId = iNew.users
} }
}, },
mounted() {
console.log(this.object)
},
methods: { methods: {
} }
} }

View File

@@ -1,13 +1,13 @@
<template> <template>
<GenericDetailPage :object.sync="user" :active-menu.sync="config.activeMenu" v-bind="config" v-on="$listeners"> <GenericDetailPage :object.sync="user" :active-menu.sync="config.activeMenu" v-bind="config" v-on="$listeners">
<keep-alive> <keep-alive>
<component :is="config.activeMenu" :object="user" /> <component v-bind:is="config.activeMenu" :object="user" />
</keep-alive> </keep-alive>
</GenericDetailPage> </GenericDetailPage>
</template> </template>
<script> <script>
import { GenericDetailPage, TabPage } from '@/layout/components' import { GenericDetailPage } from '@/layout/components'
import UserAssetPermissionRules from './UserAssetPermissionRules' import UserAssetPermissionRules from './UserAssetPermissionRules'
import UserGrantedAssets from './UserGrantedAssets' import UserGrantedAssets from './UserGrantedAssets'
import UserGrantedRemoteApps from './UserGrantedRemoteApps' import UserGrantedRemoteApps from './UserGrantedRemoteApps'
@@ -25,8 +25,7 @@ export default {
UserGrantedRemoteApps, UserGrantedRemoteApps,
UserRemoteAppPermissionRules, UserRemoteAppPermissionRules,
UserGrantedDatabases, UserGrantedDatabases,
UserDatabasePermissionRules, UserDatabasePermissionRules
TabPage
}, },
data() { data() {
return { return {