parent
c9cfbd6f16
commit
8efa6fa4d3
@ -0,0 +1,360 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<a-drawer
|
||||||
|
:title="formTitle"
|
||||||
|
:width="720"
|
||||||
|
:visible="show"
|
||||||
|
:body-style="{ paddingBottom: '80px' }"
|
||||||
|
@close="close"
|
||||||
|
>
|
||||||
|
<div class="drawer-content" v-if="formType !== 3">
|
||||||
|
楼栋信息
|
||||||
|
<a-divider></a-divider>
|
||||||
|
<a-form-model
|
||||||
|
layout="vertical"
|
||||||
|
ref="ruleForm"
|
||||||
|
:model="form"
|
||||||
|
:rules="rules"
|
||||||
|
>
|
||||||
|
<a-form-model-item label="楼栋号" prop="name">
|
||||||
|
<a-input
|
||||||
|
v-model="form.name"
|
||||||
|
placeholder="请输入楼栋号"
|
||||||
|
style="width: 50%"
|
||||||
|
/>
|
||||||
|
</a-form-model-item>
|
||||||
|
<a-form-model-item
|
||||||
|
label="上传照片"
|
||||||
|
style="width: 70%"
|
||||||
|
prop="fileList"
|
||||||
|
>
|
||||||
|
<a-upload
|
||||||
|
:action="`${$upload}`"
|
||||||
|
:headers="uploadHeaders"
|
||||||
|
accept='.jpg,.JPG,.png,.PNG'
|
||||||
|
list-type="picture"
|
||||||
|
:file-list="fileList"
|
||||||
|
@preview="handlePreview"
|
||||||
|
@change="fileChange"
|
||||||
|
>
|
||||||
|
<a-button> <a-icon type="upload" /> 点击上传 </a-button>
|
||||||
|
</a-upload>
|
||||||
|
<a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel">
|
||||||
|
<img alt="example" style="width: 100%" :src="previewImage" />
|
||||||
|
</a-modal>
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-form-model>
|
||||||
|
</div>
|
||||||
|
<!-- 详情 -->
|
||||||
|
<div class="drawer-content detail" v-else-if="formType===3">
|
||||||
|
楼栋信息
|
||||||
|
<a-divider></a-divider>
|
||||||
|
<a-form layout="vertical">
|
||||||
|
<a-form-item label="楼栋号" prop="name">
|
||||||
|
<span>{{form.name}}</span>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="楼栋照片" style="width: 70%" v-if="fileList.length>0">
|
||||||
|
<a-upload
|
||||||
|
:action="`${$upload}`"
|
||||||
|
:headers="uploadHeaders"
|
||||||
|
accept='.jpg,.JPG,.png,.PNG'
|
||||||
|
list-type="picture"
|
||||||
|
:file-list="fileList"
|
||||||
|
@preview="handlePreview"
|
||||||
|
@change="fileChange"
|
||||||
|
>
|
||||||
|
</a-upload>
|
||||||
|
<a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel">
|
||||||
|
<img alt="example" style="width: 100%" :src="previewImage" />
|
||||||
|
</a-modal>
|
||||||
|
</a-form-item>
|
||||||
|
</a-form>
|
||||||
|
单元信息
|
||||||
|
<a-divider></a-divider>
|
||||||
|
<a-button class='add-btn' @click='addUnit' style="margin-bottom:5px">新增单元</a-button>
|
||||||
|
<a-table :columns="unitColumns" :data-source="unitData" :row-key="record => record.id">
|
||||||
|
<span slot="action" slot-scope="text, row">
|
||||||
|
<a-space><a @click="addUnit(text, row)">编辑</a>
|
||||||
|
<a @click="delUnit(text, row)">删除</a></a-space>
|
||||||
|
</span>
|
||||||
|
</a-table>
|
||||||
|
</div>
|
||||||
|
<!-- foot -->
|
||||||
|
<div class="drawer-footer">
|
||||||
|
<a-button :style="{ marginRight: '8px' }" @click="close">
|
||||||
|
关闭
|
||||||
|
</a-button>
|
||||||
|
<a-button type="primary" @click="submit" v-if="formType !==3">
|
||||||
|
提交
|
||||||
|
</a-button>
|
||||||
|
<a-button type="primary" @click="edit" v-else> 编辑 </a-button>
|
||||||
|
</div>
|
||||||
|
</a-drawer>
|
||||||
|
<!-- 单元 -->
|
||||||
|
<a-modal
|
||||||
|
:title="unit.modalTitle"
|
||||||
|
:visible="unit.showModal"
|
||||||
|
@ok="unitSubmit"
|
||||||
|
@cancel="unitClose"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<a-form-model
|
||||||
|
ref="unForm"
|
||||||
|
:model="unit.unitForm"
|
||||||
|
:rules="unit.rules"
|
||||||
|
layout="vertical"
|
||||||
|
>
|
||||||
|
<a-form-model-item prop='name' label='单元名称'>
|
||||||
|
<a-input placeholder='请输入' v-model="unit.unitForm.name"/>
|
||||||
|
</a-form-model-item>
|
||||||
|
<a-form-model-item prop='floor' label='楼层数'>
|
||||||
|
<a-input placeholder='请输入' v-model.number="unit.unitForm.floor"/>
|
||||||
|
</a-form-model-item>
|
||||||
|
<a-form-model-item prop='publicFloor' label='公共楼层数'>
|
||||||
|
<a-input placeholder='请输入' v-model.number="unit.unitForm.publicFloor"/>
|
||||||
|
</a-form-model-item>
|
||||||
|
<a-form-model-item prop='elevator' label='是否有电梯'>
|
||||||
|
<a-select placeholder='请选择' v-model="unit.unitForm.elevator">
|
||||||
|
<a-select-option :value='1'>有</a-select-option>
|
||||||
|
<a-select-option :value='0'>无</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-form-model>
|
||||||
|
</div>
|
||||||
|
</a-modal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { form, rules, unitColumns,uploadHeaders } from "./config";
|
||||||
|
import { buildInsert,buildUpdate, buildInfo, unitAdd, unitUpdate, unitDel } from '@/api/basic/estate'
|
||||||
|
function getBase64(file) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.readAsDataURL(file);
|
||||||
|
reader.onload = () => resolve(reader.result);
|
||||||
|
reader.onerror = (error) => reject(error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
show: Boolean,
|
||||||
|
type: Number,
|
||||||
|
editId: Number,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
form,
|
||||||
|
rules,
|
||||||
|
unitColumns,
|
||||||
|
uploadHeaders,
|
||||||
|
previewVisible: false,
|
||||||
|
previewImage: "",
|
||||||
|
imgLoading: false,
|
||||||
|
formTitle:'新增楼栋',
|
||||||
|
fileList: [], //图片list
|
||||||
|
unitData: [], //单元数据
|
||||||
|
formType: 1, //1 add 2edit 3detail
|
||||||
|
unit:{// 单元
|
||||||
|
showModal:false, //弹窗
|
||||||
|
modalTitle:'',
|
||||||
|
unitForm:{ //表单
|
||||||
|
id:null,
|
||||||
|
name:'',
|
||||||
|
floor:null,
|
||||||
|
elevator:undefined,
|
||||||
|
publicFloor:null,
|
||||||
|
manageBuildingId:null
|
||||||
|
},
|
||||||
|
rules:{
|
||||||
|
name:[{required:true,message:'请输入单元名称',trigger:'blur'}],
|
||||||
|
floor:[{required:true,message:'请输入楼层数',trigger:'blur'}],
|
||||||
|
elevator:[{required:true,message:'是否有电梯',trigger:'change'}],
|
||||||
|
publicFloor:[{required:true,message:'公共楼层数',trigger:'blur'}],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getInfo(){
|
||||||
|
buildInfo({buildingId:this.form.id}).then(res=>{
|
||||||
|
this.form.name =res.data.name
|
||||||
|
this.unitData =res.data.manageUnitFBIVoList
|
||||||
|
if(!res.data.buildingInfoImgList.length){
|
||||||
|
this.fileList=[]
|
||||||
|
}
|
||||||
|
const file = []
|
||||||
|
for(let item of res.data.buildingInfoImgList){
|
||||||
|
let obj = {
|
||||||
|
name:item.url.split('_')[0] +'.'+ item.url.split('.')[1],
|
||||||
|
url: this.$ImgUrl(item.url),
|
||||||
|
uid:item.url.split('_')[1],
|
||||||
|
status:'done',
|
||||||
|
thumbUrl: this.$ImgUrl(item.url),
|
||||||
|
}
|
||||||
|
file.push(obj)
|
||||||
|
}
|
||||||
|
this.fileList = file
|
||||||
|
})
|
||||||
|
},
|
||||||
|
close() {// 楼栋drawer关闭的回调
|
||||||
|
this.$emit('close');
|
||||||
|
this.form = {
|
||||||
|
id:null,
|
||||||
|
name: '',
|
||||||
|
buildingInfoImgUrls:[]
|
||||||
|
}
|
||||||
|
this.unitData =[]
|
||||||
|
this.fileList = []
|
||||||
|
},
|
||||||
|
edit(){// 楼栋修改
|
||||||
|
this.formType = 2;
|
||||||
|
},
|
||||||
|
submit(){// 楼栋提交
|
||||||
|
let file = []
|
||||||
|
for(let item of this.fileList){
|
||||||
|
// 新增的照片
|
||||||
|
if(item.response){
|
||||||
|
file.push(item.response.data)
|
||||||
|
}else{
|
||||||
|
// 已添加的照片
|
||||||
|
file.push(item.url.split('/')[item.url.split('/').length-1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.form.buildingInfoImgUrls = file
|
||||||
|
this.$refs.ruleForm.validate(async valid => {
|
||||||
|
if (valid) {
|
||||||
|
if(this.formType ===1){
|
||||||
|
const res = await buildInsert(this.form)
|
||||||
|
if(res.code === 200){
|
||||||
|
this.$message.success(res.msg)
|
||||||
|
this.close()
|
||||||
|
}else{
|
||||||
|
this.$message.error(res.msg)
|
||||||
|
}
|
||||||
|
}else if(this.formType ===2){
|
||||||
|
const res = await buildUpdate(this.form)
|
||||||
|
if(res.code === 200){
|
||||||
|
this.$message.success(res.msg)
|
||||||
|
this.close()
|
||||||
|
}else{
|
||||||
|
this.$message.error(res.msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
addUnit(data,row){//新增单元
|
||||||
|
console.log(row);
|
||||||
|
if(row!==undefined){
|
||||||
|
this.unit.modalTitle='修改单元'
|
||||||
|
this.unit.unitForm= {...row}
|
||||||
|
this.unit.unitForm.manageBuildingId = this.form.id
|
||||||
|
}else{
|
||||||
|
this.unit.modalTitle='新增单元'
|
||||||
|
}
|
||||||
|
this.unit.showModal=true
|
||||||
|
console.log(this.unit.unitForm);
|
||||||
|
},
|
||||||
|
unitSubmit(){//单元提交
|
||||||
|
this.$refs.unForm.validate(async valid => {
|
||||||
|
if (valid) {
|
||||||
|
if(this.unit.modalTitle==='新增单元'){
|
||||||
|
let res = await unitAdd(this.unit.unitForm)
|
||||||
|
if(res.code === 200){
|
||||||
|
this.$message.success(res.msg)
|
||||||
|
this.getInfo()
|
||||||
|
this.unitClose()
|
||||||
|
}else{
|
||||||
|
this.$message.error(res.msg)
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
let res = await unitUpdate(this.unit.unitForm)
|
||||||
|
if(res.code === 200){
|
||||||
|
this.$message.success(res.msg)
|
||||||
|
this.getInfo()
|
||||||
|
this.unitClose()
|
||||||
|
}else{
|
||||||
|
this.$message.error(res.msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
delUnit(data,row){
|
||||||
|
this.$confirm({
|
||||||
|
title: "是否删除",
|
||||||
|
icon: "delete",
|
||||||
|
onOk: async() => {
|
||||||
|
let res = await unitDel({unitIds:[row.id]})
|
||||||
|
if(res.code === 200){
|
||||||
|
this.$message.success(res.msg)
|
||||||
|
this.getInfo()
|
||||||
|
}else{
|
||||||
|
this.$message.error(res.msg)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
unitClose(){
|
||||||
|
this.unit.showModal = false;
|
||||||
|
this.$refs.unForm.resetFields()
|
||||||
|
},
|
||||||
|
async handlePreview(file) {
|
||||||
|
if (!file.url && !file.preview) {
|
||||||
|
file.preview = await getBase64(file.originFileObj);
|
||||||
|
}
|
||||||
|
this.previewImage = file.url || file.preview;
|
||||||
|
this.previewVisible = true;
|
||||||
|
},
|
||||||
|
handleCancel() {
|
||||||
|
this.previewVisible = false;
|
||||||
|
},
|
||||||
|
fileChange(info) {
|
||||||
|
this.fileList = info.fileList
|
||||||
|
},
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
type: {
|
||||||
|
handler(val) {
|
||||||
|
this.formType = val;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
editId:{
|
||||||
|
handler(val) {
|
||||||
|
this.form.id = val;
|
||||||
|
this.unit.unitForm.manageBuildingId = val
|
||||||
|
if(this.formType !== 1){
|
||||||
|
this.getInfo()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
formType:{
|
||||||
|
handler(val) {
|
||||||
|
switch (val) {
|
||||||
|
case 1:
|
||||||
|
this.formTitle ='新增楼栋'
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
this.formTitle ='修改楼栋'
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
this.formTitle ='楼栋详情'
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.detail{
|
||||||
|
/deep/.anticon svg{
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -0,0 +1,33 @@
|
|||||||
|
/**
|
||||||
|
* 表单
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 表单
|
||||||
|
export const form = {
|
||||||
|
manageBuildingId:undefined,
|
||||||
|
manageUnitId:undefined,
|
||||||
|
floorLocation:undefined,
|
||||||
|
name:undefined,
|
||||||
|
indoorArea:undefined,
|
||||||
|
constructionArea:undefined,
|
||||||
|
manageEstateTypeId:undefined,
|
||||||
|
isEnableLease:undefined,
|
||||||
|
houseTypeHall:undefined,
|
||||||
|
houseTypeRoom:undefined,
|
||||||
|
houseTypeBathroom:undefined,
|
||||||
|
estateImgUrls:[],
|
||||||
|
remarks:undefined,
|
||||||
|
}
|
||||||
|
export const rules = {
|
||||||
|
floorLocation: [
|
||||||
|
{ required: true, message: "楼层位置", trigger: "blur" },
|
||||||
|
],
|
||||||
|
name: [
|
||||||
|
{ required: true, message: "请输入房屋名称", trigger: "blur" },
|
||||||
|
],
|
||||||
|
}
|
||||||
|
import store from "@/store";
|
||||||
|
export const uploadHeaders = {
|
||||||
|
"manage-login-token": store.getters.getToken,
|
||||||
|
}
|
@ -0,0 +1,164 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<a-form-model
|
||||||
|
layout="vertical"
|
||||||
|
ref="ruleForm"
|
||||||
|
:model="form"
|
||||||
|
:rules="rules"
|
||||||
|
:wrapper-col="{ span: 18 }"
|
||||||
|
>
|
||||||
|
<a-row>
|
||||||
|
<a-col :span="12">
|
||||||
|
<a-form-model-item label="楼栋" prop="manageBuildingId">
|
||||||
|
<a-select
|
||||||
|
v-model="form.manageBuildingId"
|
||||||
|
placeholder="请选择楼栋"
|
||||||
|
/>
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="12">
|
||||||
|
<a-form-model-item label="单元" prop="manageUnitId">
|
||||||
|
<a-select v-model="form.manageUnitId" placeholder="请选择单元" />
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="12">
|
||||||
|
<a-form-model-item label="楼层" prop="floorLocation">
|
||||||
|
<a-select v-model="form.floorLocation" placeholder="请选择楼层" />
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="12">
|
||||||
|
<a-form-model-item label="房屋名称" prop="name">
|
||||||
|
<a-input v-model="form.name" placeholder="请输入房屋名称" />
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="12">
|
||||||
|
<a-form-model-item label="室内面积" prop="indoorArea">
|
||||||
|
<a-input
|
||||||
|
type="number"
|
||||||
|
v-model="form.indoorArea"
|
||||||
|
placeholder="请输入室内面积"
|
||||||
|
suffix="㎡"
|
||||||
|
/>
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="12">
|
||||||
|
<a-form-model-item label="建筑面积" prop="constructionArea">
|
||||||
|
<a-input
|
||||||
|
v-model="form.constructionArea"
|
||||||
|
type="number"
|
||||||
|
suffix="㎡"
|
||||||
|
placeholder="请输入建筑面积"
|
||||||
|
/>
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="12">
|
||||||
|
<a-form-model-item label="房屋类型" prop="manageEstateTypeId">
|
||||||
|
<a-select
|
||||||
|
mode="multiple"
|
||||||
|
v-model="form.manageEstateTypeId"
|
||||||
|
placeholder="请选择房屋类型"
|
||||||
|
/>
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="12">
|
||||||
|
<a-form-model-item label="是否开启租赁" prop="isEnableLease">
|
||||||
|
<a-select v-model="form.isEnableLease" />
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<div>房屋户型</div>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="4">
|
||||||
|
<a-form-model-item label="厅" prop="houseTypeHall">
|
||||||
|
<a-input type="number" :min="0" v-model="form.houseTypeHall" />
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="4">
|
||||||
|
<a-form-model-item label="室" prop="houseTypeRoom">
|
||||||
|
<a-input type="number" :min="0" v-model="form.houseTypeRoom" />
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="4">
|
||||||
|
<a-form-model-item label="卫" prop="houseTypeBathroom">
|
||||||
|
<a-input type="number" :min="0" v-model="form.houseTypeBathroom" />
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-model-item label="房屋照片" prop="estateImgUrls">
|
||||||
|
<a-upload
|
||||||
|
:action="`${$upload}`"
|
||||||
|
list-type="picture-card"
|
||||||
|
:file-list="fileList"
|
||||||
|
@preview="handlePreview"
|
||||||
|
@change="handleChange"
|
||||||
|
>
|
||||||
|
<div v-if="fileList.length < 5">
|
||||||
|
<a-icon type="plus" />
|
||||||
|
<div class="ant-upload-text">Upload</div>
|
||||||
|
</div>
|
||||||
|
</a-upload>
|
||||||
|
<a-modal
|
||||||
|
:visible="previewVisible"
|
||||||
|
:footer="null"
|
||||||
|
@cancel="handleCancel"
|
||||||
|
>
|
||||||
|
<img alt="example" style="width: 100%" :src="previewImage" />
|
||||||
|
</a-modal>
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-model-item label="备注" prop="remarks">
|
||||||
|
<a-textarea v-model="form.remarks" :rows="4" />
|
||||||
|
</a-form-model-item>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</a-form-model>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { form, rules, uploadHeaders } from "./form.js";
|
||||||
|
function getBase64(file) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.readAsDataURL(file);
|
||||||
|
reader.onload = () => resolve(reader.result);
|
||||||
|
reader.onerror = error => reject(error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
editId: Number,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
form,
|
||||||
|
rules,
|
||||||
|
uploadHeaders,
|
||||||
|
fileList: [],
|
||||||
|
previewVisible: false,
|
||||||
|
previewImage: "",
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async handlePreview(file) {
|
||||||
|
if (!file.url && !file.preview) {
|
||||||
|
file.preview = await getBase64(file.originFileObj);
|
||||||
|
}
|
||||||
|
this.previewImage = file.url || file.preview;
|
||||||
|
this.previewVisible = true;
|
||||||
|
},
|
||||||
|
handleCancel() {
|
||||||
|
this.previewVisible = false;
|
||||||
|
},
|
||||||
|
handleChange({ fileList }) {
|
||||||
|
this.fileList = fileList;
|
||||||
|
console.log(this.fileList);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
watch: {},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
</style>
|
Loading…
Reference in new issue