new-cashier/jeepay-ui-uapp-agent/components/newComponents/JPreview/JPreview.vue

263 lines
6.0 KiB
Vue

<template>
<view class="pre-wrapper" :class="{ 'preview-two': props.preStyle == 'one', 'preview-one': props.preStyle == 'two' }">
<view v-if="activeBox" class="active-box" :class="{ disabled: disabled, active: active }" @tap="emits('activeClick')">
<image :src="imageList[disabled ? 0 : 1]" mode="scaleToFill" />
</view>
<view
class="preview-list"
:class="{
'last-list': isLast,
'last-none': props.borderNone,
}"
@tap="emits('click')"
>
<view class="content-box">
<image :src="props.img" class="img" />
<view class="content-describe">
<text class="title single-text-beyond">{{ props.title }}
<slot name="titleTag"/>
</text>
<text>{{ props.qrcId }}</text>
</view>
<slot>
<view class="content-state">
<view class="top">
<view class="spot" :style="{ backgroundColor: props.spot }"></view>
<view class="status">{{ props.status }}</view>
</view>
<text></text>
</view>
</slot>
</view>
<!-- 组件下部具名插槽 默认填充内容,图标,描述,号码 -->
<slot name="bottom">
<view class="info" v-if="mchName || mchNo">
<image src="@/static/equipmentImg/mch-little.svg" mode="aspectFit" class="mch-img" />
<view class="name">{{ props.mchName }}</view>
<view class="number">{{ props.mchNo }}</view>
</view>
</slot>
</view>
</view>
</template>
<script setup>
/*
列表预览组件
默认插槽放到最右边
具名插槽在下部
*/
import { ref, reactive, nextTick, watchEffect } from 'vue'
const emits = defineEmits(['activeClick', 'click'])
const vdata = reactive({
infoIsShow: false, // info板块是否展示
})
const props = defineProps({
img: { type: String, default: '/static/equipmentImg/code-open.svg' },
title: { type: String, default: '' },
qrcId: { type: String, default: '' },
spot: { type: String, default: '#fff' },
status: { type: String, default: '' },
mchName: { type: String, default: '' },
mchNo: { type: String, default: '' },
isLast: { type: Boolean, default: false }, // 最后一个列表,下划线通底
borderNone: { type: Boolean, default: false }, // 最后一个下划线隐藏
preStyle: { type: String, default: '' }, // 预制的主题颜色,在最下方
disabled: { type: Boolean, default: false }, //是否禁用默认否
active: { type: Boolean, default: false }, //是否选中默认未选中
activeBox: { type: Boolean, default: false }, // 是否显示 勾选框 默认不显示
})
const imageList = ['/static/iconImg/icon-disabled.svg', '/static/iconImg/icon-active.svg']
</script>
<style scoped lang="scss">
.pre-wrapper {
display: flex;
align-items: center;
background-color: #fff;
padding: 30rpx;
position: relative;
box-sizing: border-box;
.active-box {
flex-shrink: 0;
flex-grow: 0;
display: flex;
justify-content: center;
align-items: center;
margin-right: 30rpx;
width: 36rpx;
height: 36rpx;
border-radius: 6rpx;
border: 2rpx solid #d9d9d9;
image {
width: 100%;
height: 100%;
}
}
.active {
background-color: #2980fd;
}
.disabled {
background-color: #f2f2f2;
}
}
.preview-list {
flex: 1;
display: flex;
flex-wrap: wrap;
// 下边框线
&::after {
content: '';
position: absolute;
bottom: 0;
right: 0;
height: 1px;
width: calc(100% - 30rpx);
background-color: #d9d9d9;
transform: scaleY(0.5);
}
// 纯图片
.img {
flex-grow: 0;
flex-shrink: 0;
width: 93rpx;
height: 93rpx;
margin-right: 25rpx;
}
// 左侧内容
.content-box {
flex: 1;
display: flex;
justify-content: space-between;
.content-describe {
flex: 1;
color: #8c8c8c;
font-size: 25rpx;
// width: 100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
line-height: 35rpx;
.title {
width: 380rpx;
font-size: 33rpx;
color: #000;
line-height: 46rpx;
}
}
}
// 右侧内容 默认为状态点以及文字
.content-state {
display: flex;
flex-direction: column;
justify-content: space-between;
.top {
display: flex;
align-items: center;
.spot {
width: 10rpx;
height: 10rpx;
border-radius: 50%;
margin-right: 16rpx;
background-color: #000;
}
.status {
font-size: 30rpx;
line-height: 46rpx;
white-space: nowrap;
color: #666;
}
}
}
// 底部样式
.info {
width: 100%;
display: flex;
justify-content: center;
padding: 20rpx;
box-sizing: border-box;
background-color: #f7f7f7;
border-radius: 10rpx;
margin-top: 20rpx;
.mch-img {
width: 40rpx;
height: 40rpx;
flex-shrink: 0;
}
.name {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin: 0 10rpx;
color: #000;
font-size: 28rpx;
flex-grow: 1;
}
.number {
white-space: nowrap;
color: #8c8c8c;
font-size: 28rpx;
}
}
}
.last-list {
// 下边框线
&::after {
content: '';
position: absolute;
bottom: 0;
right: 0;
height: 1rpx;
width: 100%;
background-color: #e5e5e5;
}
}
.last-none {
// 下边框线
&::after {
height: 0;
}
}
// 预制样式1 开启状态 标题白色 id 白色0.6
.preview-one {
background: rgba(0, 0, 0, 0.1);
.content-box {
.content-describe {
color: rgba(255, 255, 255, 0.6);
.title {
color: #ffffff;
}
}
}
}
// 预制样式2 关闭状态 标题白色 id 白色0.6
.preview-two {
background: rgba(0, 0, 0, 0.1) !important;
.content-box {
.content-describe {
color: rgba(255, 255, 255, 0.5);
.title {
color: rgba(255, 255, 255, 0.5);
}
}
}
}
</style>