mirror of
https://github.com/jumpserver/lina.git
synced 2025-11-11 12:51:59 +00:00
Compare commits
1 Commits
v3.10.21-l
...
pr@v3@fix_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f433e27a43 |
@@ -72,6 +72,7 @@
|
||||
"vue-i18n": "^8.15.5",
|
||||
"vue-json-editor": "^1.4.3",
|
||||
"vue-markdown": "^2.2.4",
|
||||
"vue-moment": "^4.1.0",
|
||||
"vue-password-strength-meter": "^1.7.2",
|
||||
"vue-router": "3.0.6",
|
||||
"vue-select": "^3.9.5",
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<table style="width: 100%">
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<AssetSelect ref="assetSelect" :can-select="canSelect" :disabled="disabled" :tree-setting="treeSetting" />
|
||||
<AssetSelect ref="assetSelect" :can-select="canSelect" :disabled="disabled" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -59,10 +59,6 @@ export default {
|
||||
default(row, index) {
|
||||
return true
|
||||
}
|
||||
},
|
||||
treeSetting: {
|
||||
type: Object,
|
||||
default: () => {}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
|
||||
@@ -108,11 +108,6 @@ export default {
|
||||
url: this.typeUrl,
|
||||
nodeUrl: this.treeSetting?.nodeUrl || this.nodeUrl,
|
||||
treeUrl: `${this.typeUrl}?assets=${showAssets ? '1' : '0'}&count_resource=${this.treeSetting.countResource || 'asset'}`,
|
||||
edit: {
|
||||
drag: {
|
||||
isMove: false
|
||||
}
|
||||
},
|
||||
callback: {
|
||||
onSelected: (event, treeNode) => this.getAssetsUrl(treeNode)
|
||||
}
|
||||
|
||||
@@ -51,11 +51,6 @@ export default {
|
||||
url: this.tableUrl,
|
||||
// ?assets=0不显示资产. =1显示资产
|
||||
treeUrl: this.treeUrl,
|
||||
edit: {
|
||||
drag: {
|
||||
isMove: false
|
||||
}
|
||||
},
|
||||
callback: {
|
||||
onSelected: (event, node) => vm.onSelected(node, vm),
|
||||
refresh: vm.refreshObjectAssetPermission
|
||||
|
||||
@@ -85,12 +85,7 @@ export default {
|
||||
}
|
||||
},
|
||||
public: {
|
||||
disabled: this.protocol.name === 'winrm',
|
||||
hidden: (formValue) => {
|
||||
if (this.protocol.name === 'winrm') {
|
||||
formValue['public'] = false
|
||||
}
|
||||
}
|
||||
disabled: this.protocol.name === 'winrm'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,28 +13,15 @@ class StrategyAbstract {
|
||||
this.onSelect = this.onSelect.bind(this)
|
||||
this.onSelectAll = this.onSelectAll.bind(this)
|
||||
}
|
||||
|
||||
get elTable() {
|
||||
return this.elDataTable.$refs.table
|
||||
}
|
||||
|
||||
onSelectionChange() {
|
||||
}
|
||||
|
||||
onSelect() {
|
||||
}
|
||||
|
||||
onSelectAll() {
|
||||
}
|
||||
|
||||
toggleRowSelection() {
|
||||
}
|
||||
|
||||
clearSelection() {
|
||||
}
|
||||
|
||||
updateElTableSelection() {
|
||||
}
|
||||
onSelectionChange() {}
|
||||
onSelect() {}
|
||||
onSelectAll() {}
|
||||
toggleRowSelection() {}
|
||||
clearSelection() {}
|
||||
updateElTableSelection() {}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -47,16 +34,14 @@ class StrategyNormal extends StrategyAbstract {
|
||||
onSelectionChange(val) {
|
||||
this.elDataTable.selected = val
|
||||
}
|
||||
|
||||
/**
|
||||
* toggleRowSelection和clearSelection的表现与el-table一致
|
||||
*/
|
||||
toggleRowSelection(...args) {
|
||||
return this.elTable.toggleRowSelection(...args)
|
||||
}
|
||||
|
||||
clearSelection() {
|
||||
return this.elTable?.clearSelection()
|
||||
return this.elTable.clearSelection()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,7 +65,6 @@ class StrategyPersistSelection extends StrategyAbstract {
|
||||
const isChosen = selection.indexOf(row) > -1
|
||||
this.toggleRowSelection(row, isChosen)
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户切换当前页的多选
|
||||
*/
|
||||
@@ -101,7 +85,7 @@ class StrategyPersistSelection extends StrategyAbstract {
|
||||
// 判断是全选还是取消全选
|
||||
const shouldSelectAll = currentPageSelectedCount < selectableRows.length
|
||||
|
||||
this.elTable?.clearSelection()
|
||||
this.elTable.clearSelection()
|
||||
|
||||
if (shouldSelectAll) {
|
||||
selectableRows.forEach(row => {
|
||||
@@ -128,7 +112,6 @@ class StrategyPersistSelection extends StrategyAbstract {
|
||||
|
||||
this.elDataTable.$emit('selection-change', this.elDataTable.selected)
|
||||
}
|
||||
|
||||
/**
|
||||
* toggleRowSelection和clearSelection管理elDataTable的selected数组
|
||||
* 记得最后要将状态同步到el-table中
|
||||
@@ -150,12 +133,10 @@ class StrategyPersistSelection extends StrategyAbstract {
|
||||
this.elDataTable.$emit('toggle-row-selection', isSelected, row)
|
||||
this.updateElTableSelection()
|
||||
}
|
||||
|
||||
clearSelection() {
|
||||
this.elDataTable.selected = []
|
||||
this.updateElTableSelection()
|
||||
}
|
||||
|
||||
/**
|
||||
* 将selected状态同步到el-table中
|
||||
*/
|
||||
@@ -163,7 +144,7 @@ class StrategyPersistSelection extends StrategyAbstract {
|
||||
const { data, id, selected } = this.elDataTable
|
||||
const selectedIds = new Set(selected.map(r => r[id]))
|
||||
|
||||
this.elTable?.clearSelection()
|
||||
this.elTable.clearSelection()
|
||||
|
||||
data.forEach(row => {
|
||||
const shouldBeSelected = selectedIds.has(row[id])
|
||||
|
||||
@@ -122,13 +122,8 @@ export default {
|
||||
})
|
||||
},
|
||||
iExportOptions() {
|
||||
// const options = assignIfNot(this.exportOptions, { url: this.tableUrl })
|
||||
// return options
|
||||
|
||||
return {
|
||||
url: this.tableUrl,
|
||||
...this.exportOptions
|
||||
}
|
||||
const options = assignIfNot(this.exportOptions, { url: this.tableUrl })
|
||||
return options
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
class="text edit-input"
|
||||
@blur="onEditBlur"
|
||||
/>
|
||||
<span class="action">
|
||||
<span v-if="realValue" class="action">
|
||||
<template v-for="(item, index) in iActions">
|
||||
<el-tooltip
|
||||
v-if="item.has"
|
||||
|
||||
@@ -157,7 +157,7 @@ export default {
|
||||
</a>`
|
||||
const treeActions = `${showSearch ? searchIcon : ''}${showRefresh ? refreshIcon : ''}`
|
||||
const icons = `
|
||||
<span>
|
||||
<span style="float: right; margin-right: 10px">
|
||||
${treeActions}
|
||||
</span>`
|
||||
if (rootNode) {
|
||||
|
||||
@@ -39,7 +39,7 @@ export default {
|
||||
showRenameBtn: false,
|
||||
drag: {
|
||||
isCopy: false,
|
||||
isMove: !this.$store.getters.currentOrgIsRoot
|
||||
isMove: true
|
||||
}
|
||||
},
|
||||
callback: {
|
||||
|
||||
@@ -54,24 +54,24 @@ export default {
|
||||
resizeObserver: null,
|
||||
span: 12,
|
||||
isShow: true,
|
||||
iValue: this.sanitizeContent(this.value)
|
||||
iValue: this.value
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
sanitizedValue() {
|
||||
const content = this.iValue.replace(/\\/g, '\\\\').replace(/\$/g, '\\$')
|
||||
// 转义特殊字符
|
||||
let content = this.iValue.replace(/\\/g, '\\\\').replace(/\$/g, '\\$')
|
||||
|
||||
return this.sanitizeContent(content)
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
value(newVal) {
|
||||
this.iValue = this.sanitizeContent(newVal)
|
||||
// 使用 DOMPurify 进行 XSS 过滤
|
||||
content = DOMPurify.sanitize(content)
|
||||
|
||||
return content
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.$nextTick(() => {
|
||||
this.resizeObserver = new ResizeObserver(entries => {
|
||||
// 监听高度变化
|
||||
const height = entries[0].target.offsetHeight
|
||||
if (height) {
|
||||
this.height = height
|
||||
@@ -91,19 +91,8 @@ export default {
|
||||
this.resizeObserver = null
|
||||
},
|
||||
methods: {
|
||||
sanitizeContent(content) {
|
||||
if (!content) return ''
|
||||
|
||||
return DOMPurify.sanitize(content, {
|
||||
ALLOWED_TAGS: ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'li', 'strong', 'em', 'code', 'pre', 'blockquote', 'a'],
|
||||
FORBID_TAGS: ['script', 'style', 'iframe', 'frame', 'object', 'embed'],
|
||||
FORBID_ATTR: ['onerror', 'onload', 'onclick', 'onmouseover']
|
||||
})
|
||||
},
|
||||
onChange() {
|
||||
const sanitizedValue = this.sanitizeContent(this.iValue)
|
||||
this.iValue = sanitizedValue
|
||||
this.$emit('change', sanitizedValue)
|
||||
this.$emit('change', this.iValue)
|
||||
},
|
||||
onView() {
|
||||
this.isShow = !this.isShow
|
||||
|
||||
@@ -24,8 +24,6 @@ import { message } from '@/utils/message'
|
||||
import xss from '@/utils/xss'
|
||||
import request from '@/utils/request'
|
||||
import ElTableTooltipPatch from '@/utils/elTableTooltipPatch.js'
|
||||
import moment from 'moment'
|
||||
moment.locale('zh-cn')
|
||||
|
||||
/**
|
||||
* If you don't want to use mock-server
|
||||
@@ -52,7 +50,11 @@ Vue.config.productionTip = false
|
||||
Vue.use(VueCookie)
|
||||
window.$cookie = VueCookie
|
||||
|
||||
Vue.prototype.$moment = moment
|
||||
const moment = require('moment')
|
||||
require('moment/locale/zh-cn')
|
||||
Vue.use(require('vue-moment'), {
|
||||
moment
|
||||
})
|
||||
|
||||
Vue.use(VueLogger, loggerOptions)
|
||||
|
||||
|
||||
@@ -90,20 +90,10 @@ function ifBadRequest({ response, error }) {
|
||||
}
|
||||
}
|
||||
|
||||
export function logout() {
|
||||
window.location.href = `${process.env.VUE_APP_LOGOUT_PATH}?next=${location.pathname}`
|
||||
}
|
||||
|
||||
export function flashErrorMsg({ response, error }) {
|
||||
if (!response.config.disableFlashErrorMsg) {
|
||||
const responseErrorMsg = getErrorResponseMsg(error)
|
||||
const msg = responseErrorMsg || error.message
|
||||
|
||||
if (response.status === 403 && msg === 'CSRF Failed: CSRF token missing.') {
|
||||
setTimeout(() => {
|
||||
logout()
|
||||
}, 1000)
|
||||
}
|
||||
message({
|
||||
message: msg,
|
||||
type: 'error',
|
||||
|
||||
@@ -30,12 +30,7 @@ export default {
|
||||
showMenu: false,
|
||||
showAssets: true,
|
||||
url: '/api/v1/accounts/accounts/',
|
||||
countResource: 'account',
|
||||
edit: {
|
||||
drag: {
|
||||
isMove: false
|
||||
}
|
||||
}
|
||||
countResource: 'account'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,53 +122,9 @@ export default {
|
||||
return {
|
||||
name: 'AccountChangeSecretCreate'
|
||||
}
|
||||
},
|
||||
extraMoreActions: [
|
||||
{
|
||||
name: 'BatchDisable',
|
||||
title: this.$t('common.BatchDisable'),
|
||||
icon: 'fa fa-ban',
|
||||
can: ({ selectedRows }) => selectedRows.length > 0 && this.$hasPerm('accounts.change_changesecretautomation'),
|
||||
callback: ({ selectedRows, reloadTable }) => this.bulkDisableCallback(selectedRows, reloadTable)
|
||||
},
|
||||
{
|
||||
name: 'BatchActivate',
|
||||
title: this.$t('common.BatchActivate'),
|
||||
icon: 'fa fa-check-circle-o',
|
||||
can: ({ selectedRows }) => selectedRows.length > 0 && this.$hasPerm('accounts.change_changesecretautomation'),
|
||||
callback: ({ selectedRows, reloadTable }) => this.bulkActivateCallback(selectedRows, reloadTable)
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
bulkDisableCallback(selectedRows, reloadTable) {
|
||||
const url = '/api/v1/accounts/change-secret-automations/'
|
||||
const data = selectedRows.map(row => {
|
||||
return { id: row.id, is_active: false }
|
||||
})
|
||||
if (data.length === 0) return
|
||||
this.$axios.patch(url, data).then(() => {
|
||||
reloadTable()
|
||||
this.$message.success(this.$t('common.disableSuccessMsg'))
|
||||
}).catch(error => {
|
||||
this.$message.error(this.$t('common.updateError') + ' ' + error)
|
||||
})
|
||||
},
|
||||
bulkActivateCallback(selectedRows, reloadTable) {
|
||||
const url = '/api/v1/accounts/change-secret-automations/'
|
||||
const data = selectedRows.map(row => {
|
||||
return { id: row.id, is_active: true }
|
||||
})
|
||||
if (data.length === 0) return
|
||||
this.$axios.patch(url, data).then(() => {
|
||||
reloadTable()
|
||||
this.$message.success(this.$t('common.activateSuccessMsg'))
|
||||
}).catch(error => {
|
||||
this.$message.error(this.$t('common.updateError') + ' ' + error)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -127,58 +127,9 @@ export default {
|
||||
headerActions: {
|
||||
hasRefresh: true,
|
||||
hasExport: false,
|
||||
hasImport: false,
|
||||
createRoute: () => {
|
||||
return {
|
||||
name: 'AccountPushCreate'
|
||||
}
|
||||
},
|
||||
extraMoreActions: [
|
||||
{
|
||||
name: 'BatchDisable',
|
||||
title: this.$t('common.BatchDisable'),
|
||||
icon: 'fa fa-ban',
|
||||
can: ({ selectedRows }) => selectedRows.length > 0 && this.$hasPerm('accounts.change_pushaccountautomation'),
|
||||
callback: ({ selectedRows, reloadTable }) => this.bulkDisableCallback(selectedRows, reloadTable)
|
||||
},
|
||||
{
|
||||
name: 'BatchActivate',
|
||||
title: this.$t('common.BatchActivate'),
|
||||
icon: 'fa fa-check-circle-o',
|
||||
can: ({ selectedRows }) => selectedRows.length > 0 && this.$hasPerm('accounts.change_pushaccountautomation'),
|
||||
callback: ({ selectedRows, reloadTable }) => this.bulkActivateCallback(selectedRows, reloadTable)
|
||||
}
|
||||
]
|
||||
hasImport: false
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
bulkDisableCallback(selectedRows, reloadTable) {
|
||||
const url = '/api/v1/accounts/push-account-automations/'
|
||||
const data = selectedRows.map(row => {
|
||||
return { id: row.id, is_active: false }
|
||||
})
|
||||
if (data.length === 0) return
|
||||
this.$axios.patch(url, data).then(() => {
|
||||
reloadTable()
|
||||
this.$message.success(this.$t('common.disableSuccessMsg'))
|
||||
}).catch(error => {
|
||||
this.$message.error(this.$t('common.updateError') + ' ' + error)
|
||||
})
|
||||
},
|
||||
bulkActivateCallback(selectedRows, reloadTable) {
|
||||
const url = '/api/v1/accounts/push-account-automations/'
|
||||
const data = selectedRows.map(row => {
|
||||
return { id: row.id, is_active: true }
|
||||
})
|
||||
if (data.length === 0) return
|
||||
this.$axios.patch(url, data).then(() => {
|
||||
reloadTable()
|
||||
this.$message.success(this.$t('common.activateSuccessMsg'))
|
||||
}).catch(error => {
|
||||
this.$message.error(this.$t('common.updateError') + ' ' + error)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -65,11 +65,9 @@ export default {
|
||||
columns: ['name', 'username', 'secret_type', 'privileged'],
|
||||
columnsMeta: {
|
||||
name: {
|
||||
formatter: (row) => <span>{row.name}</span>
|
||||
// 暂禁用远程应用中账号模板的详情跳转
|
||||
// formatterArgs: {
|
||||
// route: 'AccountTemplateDetail'
|
||||
// }
|
||||
formatterArgs: {
|
||||
route: 'AccountTemplateDetail'
|
||||
}
|
||||
},
|
||||
privileged: {
|
||||
width: '100px'
|
||||
|
||||
@@ -102,7 +102,7 @@ export const ACCOUNT_PROVIDER_ATTRS_MAP = {
|
||||
[vmware]: {
|
||||
name: vmware,
|
||||
title: 'VMware',
|
||||
attrs: ['host', 'port', 'username', 'password', 'auto_sync_node']
|
||||
attrs: ['host', 'port', 'username', 'password']
|
||||
},
|
||||
[nutanix]: {
|
||||
name: nutanix,
|
||||
|
||||
@@ -20,8 +20,7 @@ export const platformFieldsMeta = (vm) => {
|
||||
'change_secret_enabled', 'change_secret_method', 'change_secret_params',
|
||||
'push_account_enabled', 'push_account_method', 'push_account_params',
|
||||
'verify_account_enabled', 'verify_account_method', 'verify_account_params',
|
||||
'gather_accounts_enabled', 'gather_accounts_method', 'gather_accounts_params',
|
||||
'remove_account_enabled', 'remove_account_method', 'remove_account_params'
|
||||
'gather_accounts_enabled', 'gather_accounts_method', 'gather_accounts_params'
|
||||
],
|
||||
fieldsMeta: {
|
||||
ansible_config: {
|
||||
@@ -29,15 +28,12 @@ export const platformFieldsMeta = (vm) => {
|
||||
hidden: (formValue) => !formValue['ansible_enabled']
|
||||
},
|
||||
gather_facts_enabled: {},
|
||||
remove_account_enabled: {},
|
||||
ping_method: {},
|
||||
ping_params: {
|
||||
label: ''
|
||||
},
|
||||
gather_facts_method: {},
|
||||
push_account_method: {},
|
||||
remove_account_method: {},
|
||||
remove_account_params: {},
|
||||
push_account_params: {
|
||||
label: ''
|
||||
},
|
||||
|
||||
@@ -36,11 +36,6 @@ export default {
|
||||
this.tableConfig.url = `/api/v1/perms/users/self/nodes/${currentNodeId}/assets/?cache_policy=1`
|
||||
}
|
||||
}.bind(this)
|
||||
},
|
||||
edit: {
|
||||
drag: {
|
||||
isMove: false
|
||||
}
|
||||
}
|
||||
},
|
||||
tableConfig: {
|
||||
|
||||
@@ -205,11 +205,6 @@ export default {
|
||||
view: {
|
||||
dblClickExpand: false,
|
||||
showLine: true
|
||||
},
|
||||
edit: {
|
||||
drag: {
|
||||
isMove: false
|
||||
}
|
||||
}
|
||||
},
|
||||
iShowTree: true,
|
||||
|
||||
@@ -290,11 +290,6 @@ export default {
|
||||
view: {
|
||||
dblClickExpand: false,
|
||||
showLine: true
|
||||
},
|
||||
edit: {
|
||||
drag: {
|
||||
isMove: false
|
||||
}
|
||||
}
|
||||
},
|
||||
iShowTree: true
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
<script>
|
||||
import { GenericCreateUpdatePage } from '@/layout/components'
|
||||
import AssetSelect from '@/components/Apps/AssetSelect'
|
||||
import { getDayFuture } from '@/utils/common'
|
||||
import AccountFormatter from './components/AccountFormatter'
|
||||
import { AllAccount } from '../const'
|
||||
import ProtocolsSelect from '@/components/Form/FormFields/AllOrSpec.vue'
|
||||
@@ -33,6 +34,7 @@ export default {
|
||||
initial: {
|
||||
is_active: true,
|
||||
date_start: new Date().toISOString(),
|
||||
date_expired: getDayFuture(25550, new Date()).toISOString(),
|
||||
nodes: nodesInitial,
|
||||
assets: assetsInitial,
|
||||
accounts: [AllAccount]
|
||||
|
||||
@@ -107,13 +107,6 @@ export default {
|
||||
this.$log.debug('AssetSelect value', that.assets)
|
||||
this.$message.success(this.$tc('common.updateSuccessMsg'))
|
||||
this.$store.commit('common/reload')
|
||||
},
|
||||
treeSetting: {
|
||||
edit: {
|
||||
drag: {
|
||||
isMove: false
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
nodeRelationConfig: {
|
||||
|
||||
@@ -39,12 +39,7 @@ export default {
|
||||
notShowBuiltinTree: true,
|
||||
url: '/api/v1/perms/asset-permissions/',
|
||||
nodeUrl: '/api/v1/perms/asset-permissions/',
|
||||
treeUrl: '/api/v1/assets/nodes/children/tree/?assets=1',
|
||||
edit: {
|
||||
drag: {
|
||||
isMove: false
|
||||
}
|
||||
}
|
||||
treeUrl: '/api/v1/assets/nodes/children/tree/?assets=1'
|
||||
},
|
||||
tableConfig: {
|
||||
url: '/api/v1/perms/asset-permissions/',
|
||||
|
||||
@@ -134,7 +134,7 @@ export default {
|
||||
},
|
||||
onMonitor() {
|
||||
const joinUrl = `/luna/monitor/${this.session.id}?ticket_id=${this.object.id}`
|
||||
window.open(joinUrl, '_blank', 'height=600, width=850, top=400, left=400, toolbar=no, menubar=no, scrollbars=no, location=no, status=no')
|
||||
window.open(joinUrl, 'height=600, width=850, top=400, left=400, toolbar=no, menubar=no, scrollbars=no, location=no, status=no')
|
||||
},
|
||||
onToggleLock() {
|
||||
const url = '/api/v1/terminal/tasks/toggle-lock-session-for-ticket/'
|
||||
|
||||
@@ -54,11 +54,6 @@ export default {
|
||||
showRefresh: true,
|
||||
showSearch: false,
|
||||
treeUrl: '',
|
||||
edit: {
|
||||
drag: {
|
||||
isMove: false
|
||||
}
|
||||
},
|
||||
check: {
|
||||
enable: true
|
||||
},
|
||||
|
||||
@@ -121,9 +121,6 @@ export default {
|
||||
system_roles: {
|
||||
component: Select2,
|
||||
label: this.$t('users.SystemRoles'),
|
||||
rules: [
|
||||
rules.Required
|
||||
],
|
||||
el: {
|
||||
multiple: true,
|
||||
ajax: {
|
||||
|
||||
@@ -8987,7 +8987,7 @@ moment-parseformat@^4.0.0:
|
||||
resolved "https://registry.npmmirror.com/moment-parseformat/-/moment-parseformat-4.0.0.tgz#44cffc3b3be3b3d033475869fbfa9066abb66cb0"
|
||||
integrity sha512-0V4ICKnI1npglqrMSDK2y8WxOdN79DkMoIexzY3P+jr2wNfbB4J81BgjFfHsj18wBsV7FdKCWyCHcezzH0xlyg==
|
||||
|
||||
moment@^2.29.4:
|
||||
moment@^2.19.2, moment@^2.29.4:
|
||||
version "2.29.4"
|
||||
resolved "https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108"
|
||||
integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==
|
||||
@@ -13226,6 +13226,13 @@ vue-markdown@^2.2.4:
|
||||
markdown-it-task-lists "^2.0.1"
|
||||
markdown-it-toc-and-anchor "^4.1.2"
|
||||
|
||||
vue-moment@^4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.npmmirror.com/vue-moment/-/vue-moment-4.1.0.tgz#092a8ff723a96c6f85a0a8e23ad30f0bf320f3b0"
|
||||
integrity sha512-Gzisqpg82ItlrUyiD9d0Kfru+JorW2o4mQOH06lEDZNgxci0tv/fua1Hl0bo4DozDV2JK1r52Atn/8QVCu8qQw==
|
||||
dependencies:
|
||||
moment "^2.19.2"
|
||||
|
||||
vue-password-strength-meter@^1.7.2:
|
||||
version "1.7.2"
|
||||
resolved "https://registry.npmmirror.com/vue-password-strength-meter/-/vue-password-strength-meter-1.7.2.tgz#ddaae2246fb8a53fd8cdc5b1084b1d16cc401505"
|
||||
|
||||
Reference in New Issue
Block a user