bonus-material-app/src/components/PopupConfirm/approve.vue

149 lines
3.6 KiB
Vue

<template>
<div>
<!-- 弹框确认组件 -->
<uni-popup ref="popupDialog" type="dialog" :mask-click="false">
<view class="popup-content">
<view class="popup-title">{{ title }}</view>
<uni-row :gutter="24" style="margin: 10px 0">
<uni-col :span="8">
<div>{{ titleTip }}</div>
</uni-col>
<uni-col :span="16">
<div>
<radio-group @change="radioChange">
<radio value="2" :checked="radioValue == 2" style="margin-right: 8px">通过</radio>
<radio value="3" :checked="radioValue == 3">不通过</radio>
</radio-group>
</div>
</uni-col>
</uni-row>
<uni-easyinput type="textarea" v-model="remark" placeholder="请输入原因" autoHeight />
<view class="popup-btns">
<view class="btn cancel" v-if="showClose" @click="closePopup">{{ leftBtn }}</view>
<view class="btn confirm" :class="{ disabled: countdown > 0 }" @click="confirm">
<span>{{ rightBtn }}</span>
{{ countdown > 0 ? '(' + countdown + ')' : '' }}
</view>
</view>
</view>
</uni-popup>
</div>
</template>
<script setup>
import { ref } from 'vue'
const props = defineProps({
title: { type: String, default: '提示' },
titleTip: { type: String, default: '结算审批' },
content: { type: String, default: '是否确定提交?' },
showClose: { type: Boolean, default: true },
leftBtn: { type: String, default: '取 消' },
rightBtn: { type: String, default: '确 定' },
showRemark: { type: Boolean, default: false },
})
const emit = defineEmits(['confirm'])
const popupDialog = ref(null)
const remark = ref('')
const timer = ref(null)
const countdown = ref(0)
const radioValue = ref('2')
let resolvePromise = null // 用于存储 Promise 的 resolve
// 打开弹框,返回 Promise
const openPopup = () => {
return new Promise((resolve) => {
resolvePromise = resolve // 保存 resolve
popupDialog.value.open()
remark.value = '' // 每次打开清空
// 启动倒计时
if (timer.value) clearInterval(timer.value)
countdown.value = 3
timer.value = setInterval(() => {
if (countdown.value > 0) {
countdown.value--
} else {
clearInterval(timer.value)
timer.value = null
countdown.value = 0
}
}, 1000)
})
}
const radioChange = (e) => {
console.log('🚀 ~ radioChange ~ e:', e.detail.value, radioValue.value)
radioValue.value = e.detail.value
}
// 关闭弹框
const closePopup = () => {
popupDialog.value.close()
if (resolvePromise) resolvePromise({ data: false })
resolvePromise = null
}
// 点击确认
const confirm = () => {
if (countdown.value > 0) return
popupDialog.value.close()
const params = {
data: true,
radioValue: radioValue.value,
remark: remark.value,
}
if (resolvePromise) resolvePromise(params)
resolvePromise = null
}
// 暴露方法
defineExpose({ openPopup })
</script>
<style lang="scss" scoped>
.popup-content {
padding: 20rpx;
background-color: #fff;
border-radius: 10rpx;
width: 80vw;
}
.popup-title {
font-size: 32rpx;
font-weight: bold;
margin-bottom: 20rpx;
}
.popup-message {
font-size: 36rpx;
font-weight: bold;
margin: 30px 0;
text-align: center;
}
.popup-btns {
display: flex;
border-top: 1px solid #eee;
height: 88rpx;
line-height: 88rpx;
text-align: center;
}
.btn {
margin-top: 3px;
flex: 1;
font-size: 34rpx;
}
.cancel {
color: #666;
border-right: 1px solid #eee;
}
.confirm {
color: #007aff;
font-weight: 500;
&.disabled {
color: #999;
}
}
</style>