Compare commits

..

97 Commits

Author SHA1 Message Date
Jiangjie Bai
a1d76b8ff0 Merge pull request #5314 from jumpserver/dev
v4.10.15
2026-01-22 16:34:12 +08:00
w940853815
1c527e9d77 perf: Translate ticket status 2026-01-22 14:31:25 +08:00
w940853815
eb9c9344eb perf: Translate quick filter 2026-01-22 11:22:15 +08:00
feng
6d8a931132 perf: Ticket action 2026-01-21 16:10:14 +08:00
w940853815
8cd3c5fa47 fix: Don't repeat the error message. 2026-01-21 15:51:17 +08:00
zhaojisen
ed770bd629 fix: Fix the icon display issue of the cloud synchronization card 2026-01-21 11:28:47 +08:00
feng
bdeded024d perf: Change secret execution detail remove recipients 2026-01-21 11:28:28 +08:00
w940853815
771ee96a1a fix: MFA display problem on user detail page 2026-01-20 16:48:59 +08:00
w940853815
dd9b40de20 fix: Ensure password is converted to string before encryption 2026-01-20 16:48:23 +08:00
zhaojisen
d360cadadb fix: Fix the issue where the current node asset cannot be displayed independently 2026-01-20 16:19:57 +08:00
fit2bot
86814693af fix: Fix the issue of detail navigation for account template settings (#5302) 2026-01-19 14:43:53 +08:00
Chenyang Shen
6ad0a49392 Merge pull request #5300 from jumpserver/pr@dev@feat_update_facelive_check
feat: update facelive license check
2026-01-14 16:21:23 +08:00
Jiangjie Bai
0fbdb3d94e Merge pull request #5293 from jumpserver/dev
v4.10.14
2025-12-18 17:23:42 +08:00
Jiangjie Bai
88e10b34cd Merge pull request #5279 from jumpserver/dev
v4.10.13-lts
2025-11-20 20:20:44 +08:00
Jiangjie Bai
f7830e9b85 Merge pull request #5239 from jumpserver/dev
v4.10.10
2025-10-16 17:29:18 +08:00
Bryan
16a92d10bc Merge pull request #5212 from jumpserver/dev
v4.10.8-lts
2025-09-18 16:49:05 +08:00
Bryan
7b568ec84f 1 2025-08-21 18:59:54 +08:00
Bryan
73d6bda8c3 Merge pull request #5092 from jumpserver/dev
merge: v4.10.4-lts
2025-07-17 15:04:47 +08:00
Bryan
3934b45367 Merge pull request #5064 from jumpserver/dev
v4.10.2
2025-06-19 20:13:12 +08:00
Bryan
0c5e84d1e3 Merge pull request #5010 from jumpserver/dev
v4.10.0
2025-05-15 17:12:07 +08:00
Bryan
18a3f42717 Merge pull request #4972 from jumpserver/dev
v4.9.0
2025-04-17 20:18:08 +08:00
Bryan
68030d98b2 Merge pull request #4890 from jumpserver/dev
v4.8.0
2025-03-20 18:44:31 +08:00
Bryan
a861f77609 Merge pull request #4659 from jumpserver/dev
v4.7.0
2025-02-20 10:20:32 +08:00
Bryan
e58ec6057c Merge pull request #4600 from jumpserver/dev
v4.6.0
2025-01-15 14:39:21 +08:00
Bryan
7ab20c5885 Merge pull request #4537 from jumpserver/dev
v4.5.0
2024-12-19 15:57:44 +08:00
Bryan
e47ddb5355 Merge pull request #4451 from jumpserver/dev
v4.4.0
2024-11-21 19:01:11 +08:00
Bryan
56aa3caa83 Merge pull request #4410 from jumpserver/dev
v4.3.0
2024-10-17 14:56:18 +08:00
Bryan
19b1dc0dbc Merge pull request #4367 from jumpserver/dev
merge: from dev to master
2024-09-19 19:36:42 +08:00
Bryan
77ef172a23 Merge pull request #4320 from jumpserver/dev
v4.1.0
2024-08-15 21:42:42 +08:00
Bryan
4596887bf1 Merge pull request #4178 from jumpserver/dev
v4.0.0
2024-07-03 19:06:07 +08:00
Bryan
0a3dc30c85 Merge pull request #4072 from jumpserver/dev
v3.10.11-lts
2024-06-19 16:04:12 +08:00
Bryan
51d24bc8e5 Merge pull request #3941 from jumpserver/dev
v3.10.10-lts
2024-05-16 16:05:04 +08:00
Bryan
1b15a4d043 Merge pull request #3871 from jumpserver/dev
v3.10.9 (dev to master)
2024-04-22 19:44:33 +08:00
Bryan
7d3f818242 Merge pull request #3864 from jumpserver/v3.10
v3.10.8
2024-04-18 17:58:05 +08:00
Bryan
4e26f18d77 Merge pull request #3862 from jumpserver/dev
v3.10.8
2024-04-18 17:17:36 +08:00
Bryan
b22613617a Revert "build(deps): bump follow-redirects from 1.15.3 to 1.15.4"
This reverts commit e971cbf4a8.
2024-03-27 16:16:07 +08:00
dependabot[bot]
e971cbf4a8 build(deps): bump follow-redirects from 1.15.3 to 1.15.4
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.3 to 1.15.4.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.3...v1.15.4)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-27 16:11:26 +08:00
wangruidong
4672abae35 fix: 刷新页面根据搜索条件过滤出对应的资源 2024-03-04 19:17:05 +08:00
Bryan
ba36d72602 Merge pull request #3761 from jumpserver/master
v3.10.4 (branch-v3.10)
2024-02-29 16:26:13 +08:00
Bryan
4bfbbba4c5 Merge pull request #3760 from jumpserver/dev
v3.10.4
2024-02-29 16:15:33 +08:00
Bryan
ea038ce43a Merge pull request #3697 from jumpserver/master
v3.10.2
2024-01-17 13:34:12 +00:00
Bryan
e16b19666c Merge pull request #3696 from jumpserver/dev
v3.10.2
2024-01-17 13:33:22 +00:00
Bryan
c7f5409eb6 Merge pull request #3694 from jumpserver/master
v3.10.2
2024-01-17 07:35:33 -04:00
Bryan
fdbd7d2222 Merge pull request #3693 from jumpserver/dev
v3.10.2
2024-01-17 07:24:50 -04:00
Bryan
ddbaeeafea Merge pull request #3668 from jumpserver/master
v3.10.1
2023-12-29 11:34:04 +05:00
Bryan
efb0e9dacb Merge pull request #3665 from jumpserver/dev
v3.10.1
2023-12-29 11:14:54 +05:00
huailei
f6f8301ad5 Revert "perf: 账号收集翻译"
This reverts commit 9a63ae63d4.
2023-12-22 15:25:31 +08:00
“huailei000”
9a63ae63d4 perf: 账号收集翻译 2023-12-22 11:31:45 +08:00
Bryan
1e007ccda3 Merge pull request #3642 from jumpserver/dev
v3.10
2023-12-21 15:15:52 +05:00
老广
d1d0b06b53 Merge pull request #3546 from jumpserver/dev
v3.9.0
2023-11-16 18:25:10 +08:00
Bryan
5fb70d2f24 Merge pull request #3450 from jumpserver/dev
v3.8.0
2023-10-19 03:33:53 -05:00
Bryan
b54a95430f Merge pull request #3404 from jumpserver/dev
v3.7.0
2023-09-21 17:04:42 +08:00
Bryan
4d8b4c45af Merge pull request #3355 from jumpserver/dev
v3.6.0
2023-08-17 14:00:33 +05:00
Bryan
a6d642df60 Merge pull request #3283 from jumpserver/dev
v3.5.0
2023-07-20 19:04:29 +08:00
Jiangjie.Bai
2e74f1522f Merge pull request #3222 from jumpserver/dev
v3.4.0
2023-06-15 14:51:36 +08:00
Jiangjie.Bai
fe615e0314 Merge pull request #3219 from jumpserver/dev
v3.4.0
2023-06-15 14:17:46 +08:00
Jiangjie.Bai
09f734e6fc Merge pull request #3135 from jumpserver/dev
v3.3.0
2023-05-18 19:18:11 +08:00
Jiangjie.Bai
3117046342 Merge pull request #3061 from jumpserver/dev
v3.2.0
2023-04-20 18:40:08 +08:00
Bai
b68aecb5cc fix: 批量更新资产平台help-text 2023-04-20 18:39:22 +08:00
Jiangjie.Bai
1c9b155d97 Merge pull request #3057 from jumpserver/dev
v3.2.0
2023-04-20 18:22:46 +08:00
Jiangjie.Bai
75b1be9864 Merge pull request #3019 from jumpserver/dev
v3.2.0 rc2
2023-04-14 19:01:37 +08:00
Jiangjie.Bai
615c3c1cf4 Merge pull request #3014 from jumpserver/dev
v3.2.0 rc1
2023-04-13 20:02:38 +08:00
Jiangjie.Bai
4d82231af4 Merge pull request #3012 from jumpserver/dev
v3.2.0 rc1
2023-04-13 19:22:38 +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
15 changed files with 111 additions and 60 deletions

View File

@@ -20,7 +20,7 @@
<script> <script>
import TreeTable from '../../Table/TreeTable/index.vue' import TreeTable from '../../Table/TreeTable/index.vue'
import { setRouterQuery, setUrlParam } from '@/utils/common/index' import { getShowCurrentAssetValue, setRouterQuery, setUrlParam } from '@/utils/common/index'
import $ from '@/utils/jquery-vendor' import $ from '@/utils/jquery-vendor'
export default { export default {
@@ -160,7 +160,7 @@ export default {
return str return str
}, },
decorateRMenu() { decorateRMenu() {
const show_current_asset = this.$cookie.get('show_current_asset') || '0' const show_current_asset = getShowCurrentAssetValue(this.$cookie)
if (show_current_asset === '1') { if (show_current_asset === '1') {
$('#m_show_asset_all_children_node').css('color', '#606266') $('#m_show_asset_all_children_node').css('color', '#606266')
$('#m_show_asset_only_current_node').css('color', 'green') $('#m_show_asset_only_current_node').css('color', 'green')
@@ -172,6 +172,7 @@ export default {
getAssetsUrl(treeNode) { getAssetsUrl(treeNode) {
let url = this.treeSetting?.url || this.url let url = this.treeSetting?.url || this.url
const showCurrentAsset = getShowCurrentAssetValue(this.$cookie)
const setParam = (param, value, delay) => { const setParam = (param, value, delay) => {
setTimeout(() => { setTimeout(() => {
@@ -183,10 +184,12 @@ export default {
const nodeId = treeNode.meta.data.id const nodeId = treeNode.meta.data.id
setParam('node_id', nodeId) setParam('node_id', nodeId)
setParam('asset_id', '') setParam('asset_id', '')
setParam('show_current_asset', showCurrentAsset)
} else if (treeNode.meta.type === 'asset') { } else if (treeNode.meta.type === 'asset') {
const assetId = treeNode.meta.data?.id || treeNode.id const assetId = treeNode.meta.data?.id || treeNode.id
setParam('node_id', '') setParam('node_id', '')
setParam('asset_id', assetId) setParam('asset_id', assetId)
setParam('show_current_asset', showCurrentAsset)
} else if (treeNode.meta.type === 'category') { } else if (treeNode.meta.type === 'category') {
setParam('category', treeNode.meta.category) setParam('category', treeNode.meta.category)
} else if (treeNode.meta.type === 'type') { } else if (treeNode.meta.type === 'type') {

View File

@@ -185,6 +185,7 @@ div.info-panel {
white-space: nowrap; white-space: nowrap;
width: 100%; width: 100%;
margin: unset; margin: unset;
text-align: start;
} }
.comment { .comment {
@@ -197,6 +198,7 @@ div.info-panel {
::v-deep { ::v-deep {
.el-avatar { .el-avatar {
background: #fff; background: #fff;
flex-shrink: 0;
} }
} }
} }

View File

@@ -111,7 +111,7 @@ export default {
{ {
name: 'actionFilter', name: 'actionFilter',
icon: 'filter', icon: 'filter',
tip: this.$t('Filter'), tip: this.$t('QuickFilter'),
has: this.hasQuickFilter, has: this.hasQuickFilter,
callback: this.handleFilterClick.bind(this) callback: this.handleFilterClick.bind(this)
}, },

View File

@@ -243,10 +243,12 @@ export default {
delete routeFilter.search delete routeFilter.search
} }
const asFilterTags = _.cloneDeep(this.filterTags) const asFilterTags = _.cloneDeep(this.filterTags)
this.filterTags = { setTimeout(() => {
...asFilterTags, this.filterTags = {
...routeFilter ...asFilterTags,
} ...routeFilter
}
}, 100)
}, },
getValueLabel(key, value) { getValueLabel(key, value) {
for (const field of this.options) { for (const field of this.options) {

View File

@@ -26,6 +26,7 @@
import DataZTree from '../DataZTree/index.vue' import DataZTree from '../DataZTree/index.vue'
import Icon from '@/components/Widgets/Icon' import Icon from '@/components/Widgets/Icon'
import $ from '@/utils/jquery-vendor' import $ from '@/utils/jquery-vendor'
import { getShowCurrentAssetValue } from '@/utils/common/index'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
export default { export default {
@@ -199,7 +200,7 @@ export default {
}, },
// Request URL: http://localhost/api/v1/assets/assets/?node_id=ID&show_current_asset=null&draw=2&limit=15&offset=0&_=1587022917769 // Request URL: http://localhost/api/v1/assets/assets/?node_id=ID&show_current_asset=null&draw=2&limit=15&offset=0&_=1587022917769
onSelected: function(event, treeNode) { onSelected: function(event, treeNode) {
const show_current_asset = this.$cookie.get('show_current_asset') || '0' const show_current_asset = getShowCurrentAssetValue(this.$cookie)
if (!this.setting.url) { if (!this.setting.url) {
return return
} }

View File

@@ -150,10 +150,11 @@ export function getErrorResponseMsg(error) {
} else if (typeof data === 'string') { } else if (typeof data === 'string') {
return data return data
} else if (_.isPlainObject(data)) { } else if (_.isPlainObject(data)) {
return Object.values(data) const msg = Object.values(data)
.map(item => getErrorResponseMsg(item)) .map(item => getErrorResponseMsg(item))
.filter(i => i) .filter(i => i)
.join('; ') // 错误信息不要重复提示
return [...new Set(msg)].join('; ')
} else { } else {
msg = error.toString() msg = error.toString()
} }
@@ -423,6 +424,28 @@ export function getDrawerWidth() {
return '90%' return '90%'
} }
export function getShowCurrentAssetValue(cookie, defaultValue = '0') {
const stored = typeof window !== 'undefined'
? window.localStorage.getItem('show_current_asset')
: null
if (stored === '0' || stored === '1') {
return stored
}
if (cookie && typeof cookie.get === 'function') {
return cookie.get('show_current_asset') || defaultValue
}
return defaultValue
}
export function setShowCurrentAssetValue(cookie, value) {
if (typeof window !== 'undefined') {
window.localStorage.setItem('show_current_asset', String(value))
}
if (cookie && typeof cookie.set === 'function') {
cookie.set('show_current_asset', value, 1)
}
}
export class ObjectLocalStorage { export class ObjectLocalStorage {
constructor(key, attr) { constructor(key, attr) {
this.key = key this.key = key

View File

@@ -92,7 +92,7 @@ export function encryptPassword(password) {
rsaPublicKeyText = rsaPublicKeyText.replaceAll('"', '') rsaPublicKeyText = rsaPublicKeyText.replaceAll('"', '')
const rsaPublicKey = atob(rsaPublicKeyText) const rsaPublicKey = atob(rsaPublicKeyText)
const keyCipher = rsaEncrypt(aesKey, rsaPublicKey) const keyCipher = rsaEncrypt(aesKey, rsaPublicKey)
const passwordCipher = aesEncrypt(password, aesKey) const passwordCipher = aesEncrypt(String(password), aesKey)
return `${keyCipher}:${passwordCipher}` return `${keyCipher}:${passwordCipher}`
} }

View File

@@ -38,11 +38,6 @@ export default {
value: this.object.snapshot.node_amount value: this.object.snapshot.node_amount
}, },
'trigger_display', 'date_start', 'date_finished', 'trigger_display', 'date_start', 'date_finished',
{
key: this.$t('MailRecipient'),
value: this.object.recipients ? this.object.recipients.map(
i => `${i[0]}` + `${i[1] ? ': ' + this.$t('ContainAttachment') : ''}`).join(', ') : ''
},
{ {
key: this.$t('Comment'), key: this.$t('Comment'),
value: this.object.snapshot.common value: this.object.snapshot.common

View File

@@ -5,7 +5,12 @@
</el-alert> </el-alert>
<TwoCol> <TwoCol>
<template> <template>
<GenericListTable ref="listTable" :header-actions="headerActions" :table-config="tableConfig" /> <GenericListTable
ref="listTable"
:detail-drawer="detailDrawer"
:header-actions="headerActions"
:table-config="tableConfig"
/>
</template> </template>
<template #right> <template #right>
<QuickActions :actions="quickActions" type="primary" /> <QuickActions :actions="quickActions" type="primary" />
@@ -21,12 +26,13 @@
</template> </template>
<script> <script>
import GenericListTable from '@/layout/components/GenericListTable'
import { QuickActions } from '@/components' import { QuickActions } from '@/components'
import { ActionsFormatter, DetailFormatter } from '@/components/Table/TableFormatters'
import ViewSecret from '@/components/Apps/AccountListTable/ViewSecret'
import { openTaskPage } from '@/utils/jms/index' import { openTaskPage } from '@/utils/jms/index'
import { GenericListTable } from '@/layout/components'
import { ActionsFormatter, DetailFormatter } from '@/components/Table/TableFormatters'
import TwoCol from '@/layout/components/Page/TwoColPage.vue' import TwoCol from '@/layout/components/Page/TwoColPage.vue'
import ViewSecret from '@/components/Apps/AccountListTable/ViewSecret'
export default { export default {
name: 'AccountTemplateChangeSecret', name: 'AccountTemplateChangeSecret',
@@ -46,6 +52,7 @@ export default {
data() { data() {
const vm = this const vm = this
return { return {
detailDrawer: () => import('@/views/accounts/AccountDiscover/TaskDetail/index.vue'),
visible: false, visible: false,
secretUrl: '', secretUrl: '',
showViewSecretDialog: false, showViewSecretDialog: false,
@@ -58,20 +65,20 @@ export default {
}, },
callbacks: Object.freeze({ callbacks: Object.freeze({
click: () => { click: () => {
this.$axios.patch( this.$axios
`/api/v1/accounts/account-templates/${this.object.id}/sync-related-accounts/` .patch(
).then(res => { `/api/v1/accounts/account-templates/${this.object.id}/sync-related-accounts/`
openTaskPage(res['task']) )
}) .then(res => {
openTaskPage(res['task'])
})
} }
}) })
} }
], ],
tableConfig: { tableConfig: {
url: `/api/v1/accounts/accounts/?source_id=${this.object.id}`, url: `/api/v1/accounts/accounts/?source_id=${this.object.id}`,
columns: [ columns: ['name', 'asset', 'secret_type', 'is_active', 'date_created'],
'name', 'asset', 'secret_type', 'is_active', 'date_created'
],
columnsMeta: { columnsMeta: {
name: { name: {
formatter: DetailFormatter, formatter: DetailFormatter,
@@ -79,8 +86,9 @@ export default {
drawer: true, drawer: true,
can: vm.$hasPerm('accounts.view_account'), can: vm.$hasPerm('accounts.view_account'),
getRoute: ({ row }) => { getRoute: ({ row }) => {
this.detailDrawer = () => import('@/views/accounts/Account/AccountDetail/index.vue')
return { return {
name: 'AssetAccountDetail', name: 'AccountDetail',
params: { id: row.id } params: { id: row.id }
} }
} }
@@ -94,6 +102,7 @@ export default {
can: vm.$hasPerm('assets.view_asset'), can: vm.$hasPerm('assets.view_asset'),
getTitle: ({ row }) => row.asset.name, getTitle: ({ row }) => row.asset.name,
getRoute: ({ row }) => { getRoute: ({ row }) => {
this.detailDrawer = () => import('@/views/assets/Asset/AssetDetail')
return { return {
name: 'AssetDetail', name: 'AssetDetail',
params: { id: row.asset.id } params: { id: row.asset.id }

View File

@@ -28,7 +28,12 @@ import { mapGetters } from 'vuex'
import TreeMenu from './components/TreeMenu' import TreeMenu from './components/TreeMenu'
import BaseList from './components/BaseList' import BaseList from './components/BaseList'
import $ from '@/utils/jquery-vendor' import $ from '@/utils/jquery-vendor'
import { setRouterQuery, setUrlParam } from '@/utils/common/index' import {
getShowCurrentAssetValue,
setShowCurrentAssetValue,
setRouterQuery,
setUrlParam
} from '@/utils/common/index'
export default { export default {
components: { components: {
@@ -73,7 +78,7 @@ export default {
}, },
methods: { methods: {
decorateRMenu() { decorateRMenu() {
const show_current_asset = this.$cookie.get('show_current_asset') || '0' const show_current_asset = getShowCurrentAssetValue(this.$cookie)
if (show_current_asset === '1') { if (show_current_asset === '1') {
$('#m_show_asset_all_children_node').css('color', '#606266') $('#m_show_asset_all_children_node').css('color', '#606266')
$('#m_show_asset_only_current_node').css('color', 'green') $('#m_show_asset_only_current_node').css('color', 'green')
@@ -83,7 +88,7 @@ export default {
} }
}, },
showAll({ node, showCurrentAsset }) { showAll({ node, showCurrentAsset }) {
this.$cookie.set('show_current_asset', showCurrentAsset, 1) setShowCurrentAssetValue(this.$cookie, showCurrentAsset)
this.decorateRMenu() this.decorateRMenu()
const url = `${this.treeSetting.url}?node_id=${node.meta.data.id}&show_current_asset=${showCurrentAsset}` const url = `${this.treeSetting.url}?node_id=${node.meta.data.id}&show_current_asset=${showCurrentAsset}`
this.$refs.AssetTreeTable.$refs.TreeList.handleUrlChange(url) this.$refs.AssetTreeTable.$refs.TreeList.handleUrlChange(url)

View File

@@ -73,7 +73,7 @@ export default {
] ]
}, },
{ {
label: this.$t('Action'), label: this.$t('State'),
options: [ options: [
{ {
label: this.$t('All'), label: this.$t('All'),
@@ -112,7 +112,7 @@ export default {
ticketTableConfig: { ticketTableConfig: {
url: this.url, url: this.url,
extraQuery: this.extraQuery, extraQuery: this.extraQuery,
columnsExclude: ['process_map', 'rel_snapshot'], columnsExclude: ['process_map', 'rel_snapshot', 'status'],
columnsShow: { columnsShow: {
min: ['title', 'serial_num', 'type', 'state', 'date_created'], min: ['title', 'serial_num', 'type', 'state', 'date_created'],
default: ['title', 'serial_num', 'type', 'state', 'date_created'] default: ['title', 'serial_num', 'type', 'state', 'date_created']
@@ -161,25 +161,8 @@ export default {
return row.type.label return row.type.label
} }
}, },
status: {
align: 'center',
sortable: 'custom',
formatter: TagChoicesFormatter,
formatterArgs: {
getTagLabel({ row }) {
return row.status.label
},
getTagType({ row }) {
if (row.status.value === 'open') {
return 'primary'
} else {
return 'danger'
}
}
}
},
state: { state: {
label: this.$t('Action'), label: this.$t('State'),
align: 'center', align: 'center',
sortable: 'custom', sortable: 'custom',
formatter: TagChoicesFormatter, formatter: TagChoicesFormatter,

View File

@@ -217,12 +217,14 @@ export default {
const accounts = this.requestForm.accounts const accounts = this.requestForm.accounts
if (this.object.approval_step.value === this.object.process_map.length) { if (this.object.approval_step.value === this.object.process_map.length) {
if (assets.length === 0 && nodes.length === 0) { if (assets.length === 0 && nodes.length === 0) {
return this.$message.error(this.$tc('SelectAtLeastOneAssetOrNodeErrMsg')) this.$message.error(this.$tc('SelectAtLeastOneAssetOrNodeErrMsg'))
return false
} else if (accounts.length === 0) { } else if (accounts.length === 0) {
return this.$message.error(this.$tc('RequiredSystemUserErrMsg')) this.$message.error(this.$tc('RequiredSystemUserErrMsg'))
return false
} }
} }
this.$axios.patch(`/api/v1/tickets/apply-asset-tickets/${this.object.id}/approve/`, { return this.$axios.patch(`/api/v1/tickets/apply-asset-tickets/${this.object.id}/approve/`, {
apply_nodes: nodes || [], apply_nodes: nodes || [],
apply_assets: assets || [], apply_assets: assets || [],
apply_accounts: accounts || [], apply_accounts: accounts || [],
@@ -239,11 +241,11 @@ export default {
}, },
handleClose() { handleClose() {
const url = `/api/v1/tickets/apply-asset-tickets/${this.object.id}/close/` const url = `/api/v1/tickets/apply-asset-tickets/${this.object.id}/close/`
this.$axios.put(url).then(res => this.reloadPage()).catch(err => this.$message.error(err)) return this.$axios.put(url).then(res => this.reloadPage()).catch(err => this.$message.error(err))
}, },
handleReject() { handleReject() {
const url = `/api/v1/tickets/apply-asset-tickets/${this.object.id}/reject/` const url = `/api/v1/tickets/apply-asset-tickets/${this.object.id}/reject/`
this.$axios.put(url).then(res => this.reloadPage()).catch(err => this.$message.error(err)) return this.$axios.put(url).then(res => this.reloadPage()).catch(err => this.$message.error(err))
} }
} }
} }

View File

@@ -231,7 +231,16 @@ export default {
} }
if (handler) { if (handler) {
handler() const result = handler()
if (result === false) {
this.isDisabled = false
return
}
if (result && typeof result.finally === 'function') {
result.finally(() => {
this.isDisabled = false
})
}
} else { } else {
this.$message.error('No handler for action') this.$message.error('No handler for action')
} }

View File

@@ -264,7 +264,7 @@ export default {
let mfa_level = null let mfa_level = null
// SECURITY_MFA_AUTH 0 不开启 1 全局开启 2 管理员开启 // SECURITY_MFA_AUTH 0 不开启 1 全局开启 2 管理员开启
const securityMFAAuth = store.getters.publicSettings['SECURITY_MFA_AUTH'] const securityMFAAuth = store.getters.publicSettings['SECURITY_MFA_AUTH']
const adminUserIsNeed = (user?.is_superuser || user?.is_org_admin) && this.$route.meta.action === 'update' && const adminUserIsNeed = (user?.is_superuser || user?.is_org_admin) && this.$route.params.action === 'update' &&
securityMFAAuth === MFASystemSetting.onlyAdminUsers securityMFAAuth === MFASystemSetting.onlyAdminUsers
if (securityMFAAuth === MFASystemSetting.allUsers) { if (securityMFAAuth === MFASystemSetting.allUsers) {
options = [{ 'value': MFALevel.allUsers, 'label': this.$t('MFAAllUsers') }] options = [{ 'value': MFALevel.allUsers, 'label': this.$t('MFAAllUsers') }]

View File

@@ -20,6 +20,8 @@ import { QuickActions } from '@/components'
import RelationCard from '@/components/Cards/RelationCard' import RelationCard from '@/components/Cards/RelationCard'
import AutoDetailCard from '@/components/Cards/DetailCard/auto' import AutoDetailCard from '@/components/Cards/DetailCard/auto'
import TwoCol from '@/layout/components/Page/TwoColPage.vue' import TwoCol from '@/layout/components/Page/TwoColPage.vue'
import store from '@/store'
import { MFASystemSetting } from '@/views/users/const'
export default { export default {
name: 'UserInfo', name: 'UserInfo',
@@ -226,7 +228,22 @@ export default {
return <div>{doms}</div> return <div>{doms}</div>
} }
}, },
'wecom_id', 'dingtalk_id', 'feishu_id', 'mfa_level', 'wecom_id', 'dingtalk_id', 'feishu_id',
{
key: this.$t('MFA'),
formatter: (item, val) => {
const user = vm.object
const securityMFAAuth = store.getters.publicSettings['SECURITY_MFA_AUTH']
const adminUserIsNeed = (user?.is_superuser || user?.is_org_admin) && securityMFAAuth === MFASystemSetting.onlyAdminUsers
if (securityMFAAuth === MFASystemSetting.allUsers) {
return this.$t('MFAAllUsers')
}
if (securityMFAAuth === MFASystemSetting.onlyAdminUsers && adminUserIsNeed) {
return this.$t('MFAOnlyAdminUsers')
}
return user?.mfa_level.label
}
},
'source', 'labels', 'source', 'labels',
'created_by', 'date_joined', 'date_expired', 'created_by', 'date_joined', 'date_expired',
'date_password_last_updated', 'last_login', 'comment' 'date_password_last_updated', 'last_login', 'comment'