Files
lina/src/views/profile/ProfileInfo.vue
2023-01-30 11:37:57 +08:00

346 lines
9.9 KiB
Vue

<template>
<Page v-bind="$attrs">
<UserConfirmDialog
v-if="showPasswordDialog"
:url="confirmUrl"
:visible.sync="showPasswordDialog"
@UserConfirmDone="verifyDone"
@UserConfirmCancel="exit"
/>
<div>
<el-row :gutter="20">
<el-col :md="14" :sm="24">
<DetailCard :items="detailCardItems" />
</el-col>
<el-col :md="10" :sm="24">
<QuickActions
type="primary"
:title="$tc('users.AuthSettings')"
:actions="authQuickActions"
/>
<QuickActions
type="info"
style="margin-top: 15px"
:title="$tc('users.MessageSubscription')"
fa="fa-info-circle"
:actions="messageSubscriptionQuickActions"
/>
</el-col>
</el-row>
</div>
</Page>
</template>
<script type="text/jsx">
import Page from '@/layout/components/Page'
import DetailCard from '@/components/DetailCard'
import QuickActions from '@/components/QuickActions'
import UserConfirmDialog from '@/components/UserConfirmDialog'
import { toSafeLocalDateStr } from '@/utils/common'
import store from '@/store'
export default {
name: 'ProfileInfo',
components: {
Page,
DetailCard,
QuickActions,
UserConfirmDialog
},
props: {
object: {
type: Object,
default: () => store.state.users.profile
}
},
data() {
return {
url: `/api/v1/users/profile/`,
showPasswordDialog: false,
currentEdit: '',
authQuickActions: [
{
title: this.$t('users.setWeCom'),
attrs: {
type: 'primary',
label: this.$store.state.users.profile.is_wecom_bound ? this.$t('common.unbind') : this.$t('common.bind')
},
has: this.$store.getters.publicSettings.AUTH_WECOM,
callbacks: {
click: function() {
this.currentEdit = 'wecom'
this.showPasswordDialog = true
}.bind(this)
}
},
{
title: this.$t('users.setDingTalk'),
attrs: {
type: 'primary',
label: this.$store.state.users.profile.is_dingtalk_bound ? this.$t('common.unbind') : this.$t('common.bind')
},
has: this.$store.getters.publicSettings.AUTH_DINGTALK,
callbacks: {
click: function() {
this.currentEdit = 'dingtalk'
this.showPasswordDialog = true
}.bind(this)
}
},
{
title: this.$t('users.setFeiShu'),
attrs: {
type: 'primary',
label: this.$store.state.users.profile.is_feishu_bound ? this.$t('common.unbind') : this.$t('common.bind')
},
has: this.$store.getters.publicSettings.AUTH_FEISHU,
callbacks: {
click: function() {
this.currentEdit = 'feishu'
this.showPasswordDialog = true
}.bind(this)
}
},
{
title: this.$t('users.SetMFA'),
attrs: {
type: 'primary',
label: this.$t('common.Setting')
},
callbacks: {
click: function() {
window.location.href = `/core/auth/profile/mfa/`
}
}
},
{
title: this.$t('users.UpdatePassword'),
attrs: {
type: 'primary',
label: this.$t('common.Update'),
disabled: this.$store.state.users.profile.source.value !== 'local'
},
callbacks: {
click: function() {
this.$router.push({ name: 'ProfileSetting', query: { activeTab: 'PasswordUpdate' }})
}.bind(this)
}
},
{
title: this.$t('users.UpdateSSHKey'),
attrs: {
type: 'primary',
label: this.$t('common.Update'),
disabled: !this.$store.state.users.profile.can_public_key_auth
},
callbacks: {
click: function() {
this.$router.push({ name: 'ProfileSetting', query: { activeTab: 'SSHUpdate' }})
}.bind(this)
}
},
{
title: this.$t('users.ResetPublicKeyAndDownload'),
attrs: {
type: 'primary',
label: this.$t('common.Reset'),
disabled: !this.$store.state.users.profile.can_public_key_auth
},
callbacks: {
click: function() {
window.open(`/core/auth/profile/pubkey/generate/`, '_blank')
}
}
}
],
messageSubscriptionQuickActions: [
{
title: this.$t('notifications.SiteMessage'),
type: 'switch',
attrs: {
disabled: true,
name: 'site_msg',
model: this.object?.receive_backends.indexOf('site_msg') !== -1
},
callbacks: {
change: this.updateUserReceiveBackends
}
},
{
title: this.$t('setting.Email'),
type: 'switch',
attrs: {
name: 'email',
model: this.object?.receive_backends.indexOf('email') !== -1
},
callbacks: {
change: this.updateUserReceiveBackends
}
},
{
title: this.$t('setting.WeCom'),
type: 'switch',
attrs: {
name: 'wecom',
model: this.object?.receive_backends.indexOf('wecom') !== -1
},
has: this.$store.getters.publicSettings.AUTH_WECOM,
callbacks: {
change: this.updateUserReceiveBackends
}
},
{
title: this.$t('setting.DingTalk'),
type: 'switch',
attrs: {
name: 'dingtalk',
model: this.object?.receive_backends.indexOf('dingtalk') !== -1
},
has: this.$store.getters.publicSettings.AUTH_DINGTALK,
callbacks: {
change: this.updateUserReceiveBackends
}
},
{
title: this.$t('setting.FeiShu'),
type: 'switch',
attrs: {
name: 'feishu',
model: this.object?.receive_backends.indexOf('feishu') !== -1
},
has: this.$store.getters.publicSettings.AUTH_FEISHU,
callbacks: {
change: this.updateUserReceiveBackends
}
}
]
}
},
computed: {
detailCardItems() {
return [
{
value: this.object.username,
key: this.$t('users.Username')
},
{
value: this.object.name,
key: this.$t('users.Name')
},
{
value: this.object.system_roles_display,
key: this.$t('users.SystemRoles')
},
{
value: this.object.org_roles_display,
key: this.$t('users.OrgRoles')
},
{
value: this.object.email,
key: this.$t('users.Email')
},
{
value: `${this.object.is_active}`,
key: this.$t('users.IsActive')
},
{
value: this.object,
key: 'SSHKey',
formatter: (item, val) => {
const comment = val.public_key_comment
const md5 = val.public_key_hash_md5
return <span>{comment} <br/> {md5}</span>
}
},
{
value: this.object.mfa_level_display,
key: this.$t('users.MfaLevel')
},
{
value: this.object.source_display,
key: this.$t('users.Source')
},
{
value: toSafeLocalDateStr(this.object.date_joined),
key: (this.$t('users.DateJoined'))
},
{
value: toSafeLocalDateStr(this.object.last_login),
key: this.$t('users.DateLastLogin')
},
{
value: toSafeLocalDateStr(this.object.date_password_last_updated),
key: this.$t('users.DatePasswordLastUpdated')
},
{
value: toSafeLocalDateStr(this.object.date_expired),
key: this.$t('users.DateExpired')
},
{
value: this.object.groups_display,
key: this.$t('users.UserGroups')
},
{
value: this.object.comment,
key: this.$t('users.Comment')
}
]
},
confirmUrl() {
return '/api/v1/authentication/confirm-oauth/'
},
bindOrUNBindUrl() {
let url = ''
if (!this.object[`is_${this.currentEdit}_bound`]) {
url = `/core/auth/${this.currentEdit}/qr/bind/?redirect_url=${this.$route.fullPath}`
} else {
url = `/api/v1/authentication/${this.currentEdit}/qr/unbind/`
}
return url
}
},
methods: {
updateUserReceiveBackends(val) {
this.$axios.patch(
`/api/v1/notifications/user-msg-subscription/${this.object.id}/`,
{ 'receive_backends': this.getReceiveBackendList() }
).then(res => {
this.$message.success(this.$tc('common.updateSuccessMsg'))
this.$store.dispatch('users/getProfile', true)
}).catch(err => {
this.$message.error(this.$tc('common.updateErrorMsg' + ' ' + err))
})
},
getReceiveBackendList() {
const backendList = []
for (const backend of this.messageSubscriptionQuickActions) {
const name = backend.attrs.name
const enabled = backend.attrs.model
if (enabled) {
backendList.push(name)
}
}
return backendList
},
verifyDone() {
const url = this.bindOrUNBindUrl
if (!this.object[`is_${this.currentEdit}_bound`]) {
window.location.href = url
} else {
this.$axios.post(url).then(res => {
this.$message.success(this.$tc('common.updateSuccessMsg'))
this.$store.dispatch('users/getProfile')
})
}
this.showPasswordDialog = false
},
exit() {
this.$emit('update:visible', false)
}
}
}
</script>
<style lang='less' scoped>
</style>