Merge branch 'dev-2.0' of https://git.mesalab.cn/nezha/nezha-fronted into dev-2.0
This commit is contained in:
@@ -124,3 +124,8 @@
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
|
span:first-letter,div:first-letter{
|
||||||
|
text-transform: capitalize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -643,7 +643,7 @@ export default {
|
|||||||
this.modelStaticData(chartInfo, filterType)
|
this.modelStaticData(chartInfo, filterType)
|
||||||
} else {
|
} else {
|
||||||
// 没有数据的设置提示信息暂无数据-针对每一个图
|
// 没有数据的设置提示信息暂无数据-针对每一个图
|
||||||
const len = chartItem.elements.length
|
const len = chartItem.elements ? chartItem.elements.length : 0
|
||||||
if (len === 0) {
|
if (len === 0) {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
if (this.$refs['editChart' + chartItem.id] && this.$refs['editChart' + chartItem.id].length > 0) {
|
if (this.$refs['editChart' + chartItem.id] && this.$refs['editChart' + chartItem.id].length > 0) {
|
||||||
@@ -693,7 +693,6 @@ export default {
|
|||||||
})
|
})
|
||||||
// 一个图表的所有element单独获取数据
|
// 一个图表的所有element单独获取数据
|
||||||
axios.all(axiosArr).then((res) => {
|
axios.all(axiosArr).then((res) => {
|
||||||
|
|
||||||
if (res.length > 0) {
|
if (res.length > 0) {
|
||||||
const series = []
|
const series = []
|
||||||
let singleStatRlt = ''
|
let singleStatRlt = ''
|
||||||
|
|||||||
@@ -315,7 +315,6 @@ export default {
|
|||||||
this.tempDom.width = span.offsetWidth
|
this.tempDom.width = span.offsetWidth
|
||||||
},
|
},
|
||||||
start (event) {
|
start (event) {
|
||||||
// console.log('start', event, this.dataList);
|
|
||||||
event.item.querySelector('.chartTitle').style.background = '#d8dce1'
|
event.item.querySelector('.chartTitle').style.background = '#d8dce1'
|
||||||
const projectAndAssetFeatureInfos = event.item.querySelectorAll('.feature-content')
|
const projectAndAssetFeatureInfos = event.item.querySelectorAll('.feature-content')
|
||||||
if (projectAndAssetFeatureInfos && projectAndAssetFeatureInfos.length > 0) {
|
if (projectAndAssetFeatureInfos && projectAndAssetFeatureInfos.length > 0) {
|
||||||
@@ -611,9 +610,11 @@ export default {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (param.from == fromRoute.chartTemp) { // 模板列表
|
if (param.from == fromRoute.chartTemp) { // 模板列表
|
||||||
this.panelDataList[0].children.forEach((item1, i) => {
|
if (this.panelDataList[0] && this.panelDataList[0].children) {
|
||||||
item1.chartIndex = i
|
this.panelDataList[0].children.forEach((item1, i) => {
|
||||||
})
|
item1.chartIndex = i
|
||||||
|
})
|
||||||
|
}
|
||||||
this.dataList = this.panelDataList
|
this.dataList = this.panelDataList
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.dataList.forEach((item, index) => {
|
this.dataList.forEach((item, index) => {
|
||||||
|
|||||||
@@ -515,7 +515,7 @@ export default {
|
|||||||
// this.$store.commit('addConsole');
|
// this.$store.commit('addConsole');
|
||||||
},
|
},
|
||||||
show (id, host, accountId, port) {
|
show (id, host, accountId, port) {
|
||||||
this.addConsole(id, host, accountId, port)
|
this.addConsole(id, host, accountId, port,'asset')
|
||||||
this.consoleShow = true
|
this.consoleShow = true
|
||||||
},
|
},
|
||||||
initDialog () {
|
initDialog () {
|
||||||
|
|||||||
@@ -357,7 +357,7 @@ export default {
|
|||||||
.record-console {
|
.record-console {
|
||||||
padding: 10px 4px 10px 10px;
|
padding: 10px 4px 10px 10px;
|
||||||
background-color: black;
|
background-color: black;
|
||||||
height: calc(100% - 80px);
|
height: calc(100% - 65px);
|
||||||
}
|
}
|
||||||
.terminal-replay-progress {
|
.terminal-replay-progress {
|
||||||
height: 20px;
|
height: 20px;
|
||||||
|
|||||||
@@ -457,7 +457,7 @@ const cn = {
|
|||||||
module: '模块'
|
module: '模块'
|
||||||
},
|
},
|
||||||
endpoint: {
|
endpoint: {
|
||||||
endpoint: 'Endpoints'
|
endpoint: 'Endpoint'
|
||||||
},
|
},
|
||||||
dataCenter: {
|
dataCenter: {
|
||||||
dataCenter: '数据中心',
|
dataCenter: '数据中心',
|
||||||
|
|||||||
@@ -458,16 +458,16 @@ const en = {
|
|||||||
total: 'Total'
|
total: 'Total'
|
||||||
},
|
},
|
||||||
project: {
|
project: {
|
||||||
project: 'Projects',
|
project: 'Project',
|
||||||
name: 'Name',
|
name: 'Name',
|
||||||
module: 'Module',
|
module: 'Module',
|
||||||
endpoint: 'Endpoint'
|
endpoint: 'Endpoint'
|
||||||
},
|
},
|
||||||
module: {
|
module: {
|
||||||
module: 'Modules'
|
module: 'Module'
|
||||||
},
|
},
|
||||||
endpoint: {
|
endpoint: {
|
||||||
endpoint: 'Endpoints'
|
endpoint: 'Endpoint'
|
||||||
},
|
},
|
||||||
dataCenter: {
|
dataCenter: {
|
||||||
dataCenter: 'Data center',
|
dataCenter: 'Data center',
|
||||||
@@ -475,7 +475,7 @@ const en = {
|
|||||||
promServer: 'Prom server'
|
promServer: 'Prom server'
|
||||||
},
|
},
|
||||||
alert: {
|
alert: {
|
||||||
alertMessage: 'Alert messages',
|
alertMessage: 'Module name / Alert Message',
|
||||||
level: 'Priority',
|
level: 'Priority',
|
||||||
alertRule: 'Alert rule',
|
alertRule: 'Alert rule',
|
||||||
ruleNum: 'Rule num',
|
ruleNum: 'Rule num',
|
||||||
@@ -562,7 +562,7 @@ const en = {
|
|||||||
copySuccess: 'Copy success'
|
copySuccess: 'Copy success'
|
||||||
},
|
},
|
||||||
asset: {
|
asset: {
|
||||||
asset: 'Asset',
|
asset: 'Module name / Asset ',
|
||||||
assets: 'Asset', // '资产'
|
assets: 'Asset', // '资产'
|
||||||
editAsset: 'Edit asset', // '编辑资产'
|
editAsset: 'Edit asset', // '编辑资产'
|
||||||
createAsset: 'New asset', // '编辑资产'
|
createAsset: 'New asset', // '编辑资产'
|
||||||
@@ -1267,7 +1267,8 @@ const en = {
|
|||||||
endpoint: {
|
endpoint: {
|
||||||
createEndpoint: 'New endpoint', // "新增Endpoint"
|
createEndpoint: 'New endpoint', // "新增Endpoint"
|
||||||
editEndpoint: 'Edit endpoint', // "编辑Endpoint"
|
editEndpoint: 'Edit endpoint', // "编辑Endpoint"
|
||||||
endpoint: 'Endpoint', // "Endpoint"
|
endpoint: 'Endpoint ', // "Endpoint"
|
||||||
|
endpoints: 'Module name / Endpoint',
|
||||||
endpointId: 'Endpoint ID', // "Endpoint ID"
|
endpointId: 'Endpoint ID', // "Endpoint ID"
|
||||||
list: 'List',
|
list: 'List',
|
||||||
host: 'Host', // "Host"
|
host: 'Host', // "Host"
|
||||||
|
|||||||
@@ -160,8 +160,9 @@ export default {
|
|||||||
}
|
}
|
||||||
this.$delete(url + '?seq=' + this.importResult.seq).then(response => {
|
this.$delete(url + '?seq=' + this.importResult.seq).then(response => {
|
||||||
if (response.code == 200) {
|
if (response.code == 200) {
|
||||||
|
const linkId = this.link ? this.link.id : ''
|
||||||
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') })
|
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') })
|
||||||
this.$emit('afterImport')
|
this.$emit('afterImport', linkId)
|
||||||
} else {
|
} else {
|
||||||
this.$message.error(response.msg)
|
this.$message.error(response.msg)
|
||||||
}
|
}
|
||||||
@@ -183,7 +184,8 @@ export default {
|
|||||||
this.$post(this.importUrl, form, { 'Content-Type': 'multipart/form-data' }).then(response => {
|
this.$post(this.importUrl, form, { 'Content-Type': 'multipart/form-data' }).then(response => {
|
||||||
if (response.code == 200 && response.msg == 'success') {
|
if (response.code == 200 && response.msg == 'success') {
|
||||||
this.importResult = response.data
|
this.importResult = response.data
|
||||||
this.$emit('afterImport')
|
const linkId = this.link ? this.link.id : ''
|
||||||
|
this.$emit('afterImport', linkId)
|
||||||
this.importBox.type = 3
|
this.importBox.type = 3
|
||||||
this.importBox.width = '600px'
|
this.importBox.width = '600px'
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mc" @click.self="clickOutside">
|
<div class="mc" @click.self="clickOutside">
|
||||||
<div class="right-box right-box-project-alert">
|
<div class="right-box right-box-project-alert">
|
||||||
<div class="right-box-title">{{$t('project.endpoint.endpoint')}}</div>
|
<div class="right-box-title">{{$t('project.endpoint.endpoints')}}</div>
|
||||||
<nz-data-list
|
<nz-data-list
|
||||||
ref="dataList"
|
ref="dataList"
|
||||||
:api="url"
|
:api="url"
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
<!-- ChartTemplate -->
|
<!-- ChartTemplate -->
|
||||||
<el-form-item :label="$t('config.model.ChartTemplate')" prop="ChartTemplate">
|
<el-form-item :label="$t('config.model.ChartTemplate')" prop="ChartTemplate">
|
||||||
<v-selectpage
|
<v-selectpage
|
||||||
:data="'visual/panel/chart'"
|
:data="chartlList"
|
||||||
:tb-columns="ChartSearchShowFields"
|
:tb-columns="ChartSearchShowFields"
|
||||||
:params="{
|
:params="{
|
||||||
varType: 1, panelId: 0,
|
varType: 1, panelId: 0,
|
||||||
@@ -115,7 +115,7 @@ export default {
|
|||||||
},
|
},
|
||||||
created () {
|
created () {
|
||||||
this.getBrandList()
|
this.getBrandList()
|
||||||
// this.ChartTemplateList()
|
this.ChartTemplateList()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
clickOutside () {
|
clickOutside () {
|
||||||
@@ -198,13 +198,13 @@ export default {
|
|||||||
assetData.totalRow = resp.data.total
|
assetData.totalRow = resp.data.total
|
||||||
return assetData
|
return assetData
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
/* 获取chart列表数据 */
|
/* 获取chart列表数据 */
|
||||||
// ChartTemplateList () {
|
ChartTemplateList () {
|
||||||
// this.$get('visual/panel/chart', { pageSize: -1, varType: 1, panelId: 0 }).then(res => {
|
this.$get('visual/panel/chart', { pageSize: -1, varType: 1, panelId: 0, groupId: 0 }).then(res => {
|
||||||
// this.chartlList = res.data.list
|
this.chartlList = res.data.list
|
||||||
// })
|
})
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -37,11 +37,11 @@
|
|||||||
<template v-if="editData.authType === assetConstants.authTypeData.key">
|
<template v-if="editData.authType === assetConstants.authTypeData.key">
|
||||||
<!-- Key支持私钥 -->
|
<!-- Key支持私钥 -->
|
||||||
<el-form-item :label="$t('asset.privateKey')" prop="authPriKey">
|
<el-form-item :label="$t('asset.privateKey')" prop="authPriKey">
|
||||||
<el-input v-model="editData.authPriKey" size="small"/>
|
<el-input v-model="editData.authPriKey" size="small" type="password" autocomplete="new-password"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
<el-form-item :label="$t('asset.pin')" prop="authPin">
|
<el-form-item :label="$t('asset.pin')" prop="authPin">
|
||||||
<el-input v-model="editData.authPin" size="small"/>
|
<el-input v-model="editData.authPin" size="small" type="password" autocomplete="new-password"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('asset.port')" prop="authProtocolPort">
|
<el-form-item :label="$t('asset.port')" prop="authProtocolPort">
|
||||||
<el-input v-model="editData.authProtocolPort" size="small"/>
|
<el-input v-model="editData.authProtocolPort" size="small"/>
|
||||||
|
|||||||
@@ -228,7 +228,7 @@ export default {
|
|||||||
} else if (this.from === fromRoute.endpoint) { // 来自endpoint时取endpointId
|
} else if (this.from === fromRoute.endpoint) { // 来自endpoint时取endpointId
|
||||||
this.editChartTemp.varIds = this.obj.varIds
|
this.editChartTemp.varIds = this.obj.varIds
|
||||||
} else {
|
} else {
|
||||||
this.editChartTemp.varIds = this.transfer.selectedData.map(item => item.id)
|
this.editChartTemp.varIds = this.$refs.transfer.selectedData.map(item => item.id)
|
||||||
}
|
}
|
||||||
this.$refs.userForm.validate((valid) => {
|
this.$refs.userForm.validate((valid) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
|
|||||||
@@ -155,7 +155,7 @@
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
<el-tab-pane label="Parameter" name="Parameter">
|
<el-tab-pane :label="$t('project.endpoint.param')" name="Parameter">
|
||||||
<div id="module-box-params" ref="labelBoxScrollbar" style="height: 100%; overflow: auto;">
|
<div id="module-box-params" ref="labelBoxScrollbar" style="height: 100%; overflow: auto;">
|
||||||
<div v-for="(item, index) in editEndpoint.paramObj" :key="index" class="param-box-row">
|
<div v-for="(item, index) in editEndpoint.paramObj" :key="index" class="param-box-row">
|
||||||
<el-form-item :prop="'paramObj.' + index + '.key'" class="param-box-row-key">
|
<el-form-item :prop="'paramObj.' + index + '.key'" class="param-box-row-key">
|
||||||
|
|||||||
@@ -88,7 +88,7 @@
|
|||||||
<el-form-item :label="$t('config.model.ChartTemplate')" prop="ChartTemplate">
|
<el-form-item :label="$t('config.model.ChartTemplate')" prop="ChartTemplate">
|
||||||
<v-selectpage
|
<v-selectpage
|
||||||
v-model="editModule.chartIds"
|
v-model="editModule.chartIds"
|
||||||
:data="'visual/panel/chart'"
|
:data="chartlList"
|
||||||
:language="language"
|
:language="language"
|
||||||
:multiple="true"
|
:multiple="true"
|
||||||
:params="{
|
:params="{
|
||||||
@@ -648,14 +648,14 @@ export default {
|
|||||||
},
|
},
|
||||||
/* 获取chart列表数据 */
|
/* 获取chart列表数据 */
|
||||||
ChartTemplateList () {
|
ChartTemplateList () {
|
||||||
this.$get('visual/panel/chart', { pageSize: -1, varType: 2, panelId: 0 }).then(res => {
|
this.$get('visual/panel/chart', { pageSize: -1, varType: 2, panelId: 0, returnChildren: 0, groupId: 0 }).then(res => {
|
||||||
this.chartlList = res.data.list
|
this.chartlList = res.data.list
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
this.getWalkData()
|
this.getWalkData()
|
||||||
// this.ChartTemplateList()
|
this.ChartTemplateList()
|
||||||
},
|
},
|
||||||
created () {
|
created () {
|
||||||
this.getProjectList()
|
this.getProjectList()
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
@header-dragend="dragend"
|
@header-dragend="dragend"
|
||||||
@sort-change="tableDataSort"
|
@sort-change="tableDataSort"
|
||||||
@selection-change="selectionChange"
|
@selection-change="selectionChange"
|
||||||
|
@row-dblclick="(row)=>{$emit('messageDetail', row)}"
|
||||||
>
|
>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
:resizable="false"
|
:resizable="false"
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
@header-dragend="dragend"
|
@header-dragend="dragend"
|
||||||
@sort-change="tableDataSort"
|
@sort-change="tableDataSort"
|
||||||
@selection-change="selectionChange"
|
@selection-change="selectionChange"
|
||||||
|
@row-dblclick="(row)=>{queryMessage(row)}"
|
||||||
>
|
>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
:resizable="false"
|
:resizable="false"
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
@header-dragend="dragend"
|
@header-dragend="dragend"
|
||||||
@sort-change="tableDataSort"
|
@sort-change="tableDataSort"
|
||||||
@selection-change="selectionChange"
|
@selection-change="selectionChange"
|
||||||
|
@row-dblclick="(row)=>{$emit('showBottomBox', 'panelTab', row)}"
|
||||||
>
|
>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
:resizable="false"
|
:resizable="false"
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
@header-dragend="dragend"
|
@header-dragend="dragend"
|
||||||
@sort-change="tableDataSort"
|
@sort-change="tableDataSort"
|
||||||
@selection-change="selectionChange"
|
@selection-change="selectionChange"
|
||||||
|
@row-dblclick="(row)=>{showBottomBox('panel', row)}"
|
||||||
>
|
>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
:resizable="false"
|
:resizable="false"
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
@header-dragend="dragend"
|
@header-dragend="dragend"
|
||||||
@sort-change="tableDataSort"
|
@sort-change="tableDataSort"
|
||||||
@selection-change="selectionChange"
|
@selection-change="selectionChange"
|
||||||
|
@row-dblclick="(row)=>{$emit('showBottomBox', 'panelTab', row)}"
|
||||||
>
|
>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
:resizable="false"
|
:resizable="false"
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
@header-dragend="dragend"
|
@header-dragend="dragend"
|
||||||
@sort-change="tableDataSort"
|
@sort-change="tableDataSort"
|
||||||
@selection-change="selectionChange"
|
@selection-change="selectionChange"
|
||||||
|
@row-dblclick="(row)=>{showBottomBox('endpoint', row)}"
|
||||||
>
|
>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
:resizable="false"
|
:resizable="false"
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
@header-dragend="dragend"
|
@header-dragend="dragend"
|
||||||
@sort-change="tableDataSort"
|
@sort-change="tableDataSort"
|
||||||
@selection-change="selectionChange"
|
@selection-change="selectionChange"
|
||||||
|
@row-dblclick="(row)=>{changeProjectTopo(row)}"
|
||||||
>
|
>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
:resizable="false"
|
:resizable="false"
|
||||||
@@ -67,7 +68,7 @@
|
|||||||
fixed="right">
|
fixed="right">
|
||||||
<div slot="header" class="table-operation-title">{{$t('overall.option')}}</div>
|
<div slot="header" class="table-operation-title">{{$t('overall.option')}}</div>
|
||||||
<div slot-scope="scope" class="table-operation-items">
|
<div slot-scope="scope" class="table-operation-items">
|
||||||
<button class="table-operation-item" @click="changeProjectTopo( scope.row)"><i class="nz-icon nz-icon-view1"></i></button>
|
<button class="table-operation-item" @click="changeProjectTopo(scope.row)"><i class="nz-icon nz-icon-view1"></i></button>
|
||||||
<el-dropdown size="medium" v-has="['project_edit','project_delete']" trigger="hover" @command="tableOperation">
|
<el-dropdown size="medium" v-has="['project_edit','project_delete']" trigger="hover" @command="tableOperation">
|
||||||
<div class="table-operation-item table-operation-item--more">
|
<div class="table-operation-item table-operation-item--more">
|
||||||
<span>…</span><i class="nz-icon nz-icon-arrow-down"></i>
|
<span>…</span><i class="nz-icon nz-icon-arrow-down"></i>
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
@header-dragend="dragend"
|
@header-dragend="dragend"
|
||||||
@sort-change="tableDataSort"
|
@sort-change="tableDataSort"
|
||||||
@selection-change="selectionChange"
|
@selection-change="selectionChange"
|
||||||
|
@row-dblclick="(row)=>{showBottomBox(row.status==0 ? 'monitorTab' : 'cmdTab', row)}"
|
||||||
>
|
>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
:resizable="false"
|
:resizable="false"
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
@header-dragend="dragend"
|
@header-dragend="dragend"
|
||||||
@sort-change="tableDataSort"
|
@sort-change="tableDataSort"
|
||||||
@selection-change="selectionChange"
|
@selection-change="selectionChange"
|
||||||
|
@row-dblclick="(row)=>{showBottomBox('operationLogTab', row)}"
|
||||||
>
|
>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
:resizable="false"
|
:resizable="false"
|
||||||
|
|||||||
@@ -609,6 +609,7 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
deleteMessage () {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -251,12 +251,11 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
cli ([id, host, account]) {
|
cli (row) {
|
||||||
const consoleParam = {
|
const consoleParam = {
|
||||||
id: id,
|
id: row.id,
|
||||||
host: host,
|
host: row.manageIp,
|
||||||
accountId: account.id,
|
port: row.authProtocolPort
|
||||||
port: account.port
|
|
||||||
}
|
}
|
||||||
this.$store.commit('addConsole', consoleParam)
|
this.$store.commit('addConsole', consoleParam)
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user