Compare commits

...

39 Commits

Author SHA1 Message Date
jiangweidong
dff6824ddc fix: 优化手机号区号更新为空及展示问题 2023-04-10 17:13:55 +08:00
feng
cbbaf7f7ca fix: 创建资产添加账号模版 2023-04-10 10:29:19 +08:00
jiangweidong
fac0d3190b perf: 手机区号增加中国台湾地区 2023-04-10 10:28:11 +08:00
jiangweidong
ec4c7a0cca feat: 手机号支持选择区号 2023-04-10 10:28:11 +08:00
Bai
351e08d542 fix: 修复 LAN 账号保存 Platform 问题 2023-03-17 15:45:08 +08:00
“huailei000”
c6cf6571b6 perf: ldap导入用户列表-组织下拉框设置最大宽度 2023-03-16 16:44:36 +08:00
Bai
8ea990d070 fix: 修复创建资产添加账号模版报错问题 2023-03-16 16:44:36 +08:00
“huailei000”
f4a32170d5 perf: message 2023-03-16 16:44:36 +08:00
ibuler
073508675e perf: 添加默认的信息 2023-03-16 16:44:36 +08:00
Jiangjie.Bai
1d6ca0a93a Merge pull request #2924 from jumpserver/dev
v3.1.0 rc4
2023-03-15 19:46:31 +08:00
Jiangjie.Bai
36aea652d6 Merge pull request #2788 from jumpserver/dev
v3.0.0
2023-02-23 20:16:41 +08:00
Jiangjie.Bai
1a42ce90ab Merge pull request #2760 from jumpserver/dev
v3.0.0-rc-latest
2023-02-22 22:21:54 +08:00
Jiangjie.Bai
31a401b55d Merge pull request #2463 from jumpserver/dev
v3.0.0-rc4
2023-01-31 18:55:34 +08:00
Jiangjie.Bai
582a84178d Merge pull request #2187 from jumpserver/dev
v2.28.0
2022-11-17 17:44:19 +08:00
Jiangjie.Bai
9b9f7c936c Merge pull request #2184 from jumpserver/dev
v2.28.0-rc5
2022-11-17 14:18:15 +08:00
Jiangjie.Bai
2a6100957f Merge pull request #2182 from jumpserver/dev
v2.28.0-rc4
2022-11-16 21:08:55 +08:00
Jiangjie.Bai
16606d6a27 Merge pull request #2176 from jumpserver/dev
v2.28.0-rc2
2022-11-14 10:01:05 +08:00
Jiangjie.Bai
0a612f50e6 Merge pull request #2164 from jumpserver/dev
v2.28.0-rc1
2022-11-10 17:45:47 +08:00
Jiangjie.Bai
fe36fa9390 Merge pull request #2117 from jumpserver/dev
v2.27.0-rc4
2022-10-18 21:02:10 +08:00
Jiangjie.Bai
ba109900ec Merge pull request #2113 from jumpserver/dev
v2.27.0-rc3
2022-10-18 11:20:57 +08:00
Jiangjie.Bai
ec7768267f Merge pull request #2105 from jumpserver/dev
v2.27.0-rc2
2022-10-14 11:01:32 +08:00
Jiangjie.Bai
cc58b374ab Merge pull request #2101 from jumpserver/dev
v2.27.0-rc1
2022-10-13 17:44:53 +08:00
Jiangjie.Bai
04ffbb8fd6 Merge pull request #2097 from jumpserver/dev
v2.27.0-rc1
2022-10-13 15:14:40 +08:00
Jiangjie.Bai
49880f6739 Merge pull request #2059 from jumpserver/dev
v2.26.0
2022-09-15 17:49:44 +08:00
Jiangjie.Bai
e6f98d58c4 Merge pull request #2057 from jumpserver/dev
v2.26.0-rc4
2022-09-15 16:18:03 +08:00
Jiangjie.Bai
fd1f16d43c Merge pull request #2050 from jumpserver/dev
v2.26.0-rc2
2022-09-13 17:41:39 +08:00
Jiangjie.Bai
968b2415b1 Merge pull request #2043 from jumpserver/dev
v2.26.0-rc1
2022-09-08 15:46:44 +08:00
Jiangjie.Bai
776090d6ba Merge pull request #2001 from jumpserver/dev
v2.25.0
2022-08-18 16:12:45 +08:00
Jiangjie.Bai
3a37952288 Merge pull request #1996 from jumpserver/dev
v2.25.0-rc4
2022-08-17 16:53:23 +08:00
Jiangjie.Bai
62b8fc0e3b Merge pull request #1994 from jumpserver/dev
v2.25.0-rc3
2022-08-16 19:08:23 +08:00
Jiangjie.Bai
b2028869cb Merge pull request #1986 from jumpserver/dev
v2.25.0-rc2
2022-08-12 18:06:56 +08:00
Jiangjie.Bai
5277a725f8 Merge pull request #1973 from jumpserver/dev
v2.25.0-rc1
2022-08-11 14:11:59 +08:00
Jiangjie.Bai
f137788c1a Merge pull request #1957 from jumpserver/dev
v2.24.0-rc5
2022-07-20 19:06:03 +08:00
Jiangjie.Bai
f7d17c8de7 Merge pull request #1954 from jumpserver/dev
v2.24.0-rc4
2022-07-19 16:18:13 +08:00
Jiangjie.Bai
feea70b0be Merge pull request #1944 from jumpserver/dev
v2.24.0-rc3
2022-07-18 12:05:42 +08:00
Jiangjie.Bai
04696ef3d6 Merge pull request #1940 from jumpserver/dev
v2.24.0-rc2
2022-07-15 18:07:37 +08:00
Jiangjie.Bai
1731f4f788 Merge pull request #1934 from jumpserver/dev
v2.24.0-rc1
2022-07-14 18:27:51 +08:00
Jiangjie.Bai
6f25d93909 Merge pull request #1931 from jumpserver/dev
v2.24.0-rc1
2022-07-14 17:51:58 +08:00
Jiangjie.Bai
46461ec324 Merge pull request #1925 from jumpserver/dev
v2.24.0-rc1
2022-07-14 15:12:15 +08:00
19 changed files with 143 additions and 19 deletions

View File

@@ -0,0 +1,80 @@
<template>
<div>
<el-input v-model="rawValue.phone" :placeholder="$tc('users.inputPhone')" @input="OnInputChange">
<el-select
slot="prepend"
:value="rawValue.code"
:placeholder="$tc('common.Select')"
style="width: 90px;"
@change="OnChange"
>
<el-option
v-for="country in countries"
:key="country.value"
:label="country.value"
:value="country.value"
style="width: 200px;"
>
<span style="float: left">{{ country.name }}</span>
<span style="float: right; font-size: 13px">{{ country.value }}</span>
</el-option>
</el-select>
</el-input>
</div>
</template>
<script>
export default {
name: 'PhoneInput',
props: {
value: {
type: [Object, String],
default: () => ({ 'code': '', 'phone': '' })
}
},
data() {
return {
rawValue: {},
countries: [
{ name: 'China(中国)', value: '+86' },
{ name: 'HongKong(中国香港)', value: '+852' },
{ name: 'Macao(中国澳门)', value: '+853' },
{ name: 'Taiwan(中国台湾)', value: '+886' },
{ name: 'America(America)', value: '+1' },
{ name: 'Russia(Россия)', value: '+7' },
{ name: 'France(français)', value: '+33' },
{ name: 'Britain(Britain)', value: '+44' },
{ name: 'Germany(Deutschland)', value: '+49' },
{ name: 'Japan(日本)', value: '+81' },
{ name: 'Korea(한국)', value: '+82' },
{ name: 'India(भारत)', value: '+91' }
]
}
},
computed: {
fullPhone() {
if (!this.rawValue.phone) {
return ''
}
return `${this.rawValue.code} ${this.rawValue.phone}`
}
},
mounted() {
this.rawValue = this.value || { code: '+86', phone: '' }
this.$emit('input', this.fullPhone)
},
methods: {
OnChange(countryCode) {
this.rawValue.code = countryCode
this.OnInputChange()
},
OnInputChange() {
this.$emit('input', this.fullPhone)
}
}
}
</script>
<style lang="scss" scoped>
</style>

View File

@@ -54,7 +54,9 @@ export default {
sftp_home: '/tmp',
username_selector: '#username',
password_selector: '#password',
submit_selector: '.btn-submit'
submit_selector: '.btn-submit',
security: 'any',
console: false
},
loading: true,
form: {},

View File

@@ -4,6 +4,7 @@ import Select2 from './Select2'
import TagInput from './TagInput'
import Switcher from './Switcher'
import UploadKey from './UploadKey'
import PhoneInput from './PhoneInput'
import JsonEditor from './JsonEditor'
import UploadField from './UploadField'
import UpdateToken from './UpdateToken'
@@ -22,6 +23,7 @@ export default {
TagInput,
UploadKey,
JsonEditor,
PhoneInput,
UpdateToken,
UploadField,
UserPassword,
@@ -40,6 +42,7 @@ export {
TagInput,
UploadKey,
JsonEditor,
PhoneInput,
UpdateToken,
UploadField,
UserPassword,

View File

@@ -1685,6 +1685,7 @@
"users": {
"Login": "Users login",
"InviteSuccess": "Invite success",
"inputPhone": "Please enter your mobile phone number",
"FileEncryptionPassword": "File encryption password",
"OrgRoles": "Org roles",
"RoleUsers": "Role users",

View File

@@ -1673,6 +1673,7 @@
"users": {
"Login": "ユーザー登録",
"InviteSuccess": "成功招待",
"inputPhone": "携帯電話の番号をお願いします",
"FileEncryptionPassword": "ファイル暗号化パスワード",
"RoleUsers": "承認されたユーザー",
"RoleInfo": "ロール情報",

View File

@@ -1676,6 +1676,7 @@
"Login": "用户登录",
"InviteSuccess": "邀请成功",
"FileEncryptionPassword": "文件加密密码",
"inputPhone": "请输入手机号码",
"RoleUsers": "授权用户",
"RoleInfo": "角色信息",
"RolePerms": "角色权限",

View File

@@ -19,7 +19,7 @@ import VueLogger from 'vuejs-logger'
import loggerOptions from './utils/logger'
import ECharts from 'vue-echarts'
import service from '@/utils/request'
import { Message } from '@/utils/Message'
import { message } from '@/utils/message'
import xss from '@/utils/xss'
/**
@@ -60,7 +60,7 @@ Vue.prototype.$axios = service
window._ = require('lodash')
// Vue.set(Vue.prototype, '_', _)
Vue.prototype.$message = Message
Vue.prototype.$message = message
Vue.prototype.$xss = xss

View File

@@ -2,7 +2,7 @@
import { Message as elMessage } from 'element-ui'
let messageDom = null
const Message = (options) => {
const message = (options) => {
// 判断弹窗是否已存在, 若存在则关闭
if (messageDom) messageDom.close()
messageDom = elMessage(options)
@@ -10,11 +10,11 @@ const Message = (options) => {
const typeArray = ['success', 'error', 'warning', 'info']
typeArray.forEach(type => {
Message[type] = options => {
message[type] = options => {
if (typeof options === 'string') options = { message: options }
options.type = type
return Message(options)
return message(options)
}
})
export { Message }
export { message }

View File

@@ -4,7 +4,7 @@ import { getTokenFromCookie } from '@/utils/auth'
import { getErrorResponseMsg } from '@/utils/common'
import { refreshSessionIdAge } from '@/api/users'
import { MessageBox } from 'element-ui'
import { Message } from '@/utils/Message'
import { message } from '@/utils/message'
import store from '@/store'
import axiosRetry from 'axios-retry'
import router from '@/router'
@@ -93,7 +93,7 @@ export function flashErrorMsg({ response, error }) {
if (!response.config.disableFlashErrorMsg) {
const responseErrorMsg = getErrorResponseMsg(error)
const msg = responseErrorMsg || error.message
Message({
message({
message: msg,
type: 'error',
duration: 5 * 1000

View File

@@ -3,7 +3,7 @@ import store from '@/store'
import router, { resetRouter } from '@/router'
import Vue from 'vue'
import VueCookie from 'vue-cookie'
import { Message } from '@/utils/Message'
import { message } from '@/utils/message'
import orgUtil from '@/utils/org'
import orgs from '@/api/orgs'
import { getPropView, isViewHasOrgs } from '@/utils/jms'
@@ -119,7 +119,7 @@ export async function generatePageRoutes({ to, from, next }) {
} catch (error) {
// remove token and go to login page to re-login
// await store.dispatch('user/resetToken')
Message.error(error || 'Has Error')
message.error(error || 'Has Error')
Vue.$log.error('Error occur: ', error)
}
}

View File

@@ -17,7 +17,7 @@ import { ActionsFormatter } from '@/components/TableFormatters'
import ViewSecret from '@/components/AccountListTable/ViewSecret'
export default {
name: 'AccountBackupPlanList',
name: 'AccountTemplateList',
components: {
GenericListPage,
ViewSecret

View File

@@ -80,7 +80,7 @@ export default {
}
},
data() {
const protocols = this.asset.protocols.map(i => i.name).toString()
const protocols = this.asset?.protocols?.map(i => i.name).toString() || ''
return {
isShowCreate: false,
accountsSelected: [],
@@ -141,6 +141,7 @@ export default {
const newAddAccounts = this.accountsSelected.filter(i => {
if (!hasIdAccounts.includes(i.id)) {
i.template = true
i.secret_type = i.secret_type.value
return i
}
})

View File

@@ -79,6 +79,17 @@ export default {
},
password: {
rules: this.$route.params.id ? [] : [RequiredChange]
},
platform: {
el: {
multiple: false,
ajax: {
url: `/api/v1/assets/platforms/`,
transformOption: (item) => {
return { label: item.name, value: item.id }
}
}
}
}
}
},

View File

@@ -3,7 +3,7 @@ import ProtocolSelector from '@/components/FormFields/ProtocolSelector'
import AssetAccounts from '@/views/assets/Asset/AssetCreateUpdate/components/AssetAccounts'
import rules from '@/components/DataForm/rules'
import { Select2 } from '@/components/FormFields'
import { Message } from '@/utils/Message'
import { message } from '@/utils/message'
export const filterSelectValues = (values) => {
if (!values) return
@@ -19,7 +19,7 @@ export const filterSelectValues = (values) => {
const inputValue = { name, value }
selects.push(inputValue)
} else {
Message.error(i18n.t('assets.LabelInputFormatValidation'))
message.error(i18n.t('assets.LabelInputFormatValidation'))
}
}
})

View File

@@ -5,6 +5,7 @@
<script>
import { GenericCreateUpdatePage } from '@/layout/components'
import { Required } from '@/components/DataForm/rules'
import { PhoneInput } from '@/components/FormFields'
export default {
name: 'ProfileUpdate',
@@ -36,6 +37,9 @@ export default {
email: {
disabled: true
},
phone: {
component: PhoneInput
},
mfa_level: {
hidden: (formValue) => {
return formValue.mfa_level === 2

View File

@@ -9,6 +9,7 @@
<script>
import GenericCreateUpdateForm from '@/layout/components/GenericCreateUpdateForm'
import { PhoneInput } from '@/components/FormFields'
import { IBox } from '@/components'
export default {
@@ -40,6 +41,9 @@ export default {
},
email: {
disabled: true
},
phone: {
component: PhoneInput
}
},
submitMethod() {

View File

@@ -18,7 +18,7 @@
<div slot="footer">
<span class="org-select">
<span class="label">{{ $tc('common.ImportOrg') }}</span>
<Select2 ref="select2" v-model="select2.value" v-bind="select2" />
<Select2 ref="select2" v-model="select2.value" v-bind="select2" popper-class="select-org-dropdown" />
</span>
<el-button type="primary" size="small" :loading="dialogLdapUserImportLoginStatus" @click="importUserClick">{{ $t('common.Import') }}</el-button>
<el-button
@@ -157,6 +157,12 @@ export default {
}
</script>
<style>
.el-select-dropdown.select-org-dropdown {
max-width: 300px!important;
}
</style>
<style scoped lang="scss">
.org-select {
float: left;

View File

@@ -4,7 +4,7 @@
<script>
import { GenericCreateUpdatePage } from '@/layout/components'
import UserPassword from '@/components/FormFields/UserPassword'
import { UserPassword, PhoneInput } from '@/components/FormFields'
import rules from '@/components/DataForm/rules'
import { mapGetters } from 'vuex'
@@ -151,6 +151,9 @@ export default {
},
value: []
}
},
phone: {
component: PhoneInput
}
},
submitMethod() {

View File

@@ -176,8 +176,15 @@ export default {
return <img src={this.object.avatar_url} alt='' height='50'/>
}
},
'name', 'username', 'email', 'phone', 'wecom_id',
'dingtalk_id', 'feishu_id',
'id', 'name', 'username', 'email',
{
key: this.$t('users.Phone'),
formatter: () => {
const phoneObj = this.object.phone
return <div>{phoneObj?.code} {phoneObj?.phone}</div>
}
},
'wecom_id', 'dingtalk_id', 'feishu_id',
{
key: this.$t('users.Role'),
formatter: (item, val) => {