new-cashier/jeepay-ui-uapp-merchant/pageTable/index/index.vue

448 lines
9.2 KiB
Vue

<template>
<view class="color-333 u-font-28 min-page bg-gray ">
<view class="fixed-top bg-fff u-flex u-p-l-30 u-row-between">
<view class="u-flex u-flex-1 u-row-between">
<view class="u-flex u-p-t-30 u-p-b-30 u-flex-1 u-row-center" @tap="showsTimesToggle">
<text class="u-m-r-12">{{times.list[times.active]}}</text>
<image src="/pageInvoicing/static/images/icon-arrow-down-fill.svg" class="icon-arrow-down-fill"
mode="">
</image>
</view>
<view class="u-flex u-p-t-30 u-p-b-30 u-flex-1 u-row-center" @tap="showstatusToggle">
<text class="u-m-r-12"
:class="{'color-main':status.active!=0}">{{status.list[status.active].label }}</text>
<image src="/pageInvoicing/static/images/icon-arrow-down-fill.svg" class="icon-arrow-down-fill"
mode="">
</image>
</view>
</view>
<view style="width: 164rpx;"></view>
<view class="search-box">
<view class="search-btn u-flex" @tap="showSearch" :style="{width:search.show?'694rpx':'164rpx'}">
<image src="@/static/iconImg/icon-search.svg" class="input-icon" />
<view class="u-flex-1 u-p-l-10">
<input v-model="search.keyword" @confirm="searchConfirm" type="text"
placeholder-style="font-size:28rpx;" placeholder="搜索" /></view>
<view @tap.stop="hideSearch" v-if="search.show">取消</view>
</view>
</view>
<view :style="{height:times.show?timesHeight:0}" class="tranistion status overflow-hide">
<view @tap="changeTimesActive(index)" class="u-flex u-p-l-30 lh30 u-p-r-30 u-row-between"
v-for="(item,index) in times.list" :key="index">
<view>{{item}}</view>
<uni-icons v-if="times.active===index" type="checkmarkempty" :color="color.ColorMain"></uni-icons>
</view>
<view :style="{height: status.bottomHeight+'px'}"></view>
</view>
<view :style="{height:status.show?statusHeight:0}" class="tranistion status overflow-hide">
<view @tap="changestatusActive(index)" class="u-flex u-p-l-30 lh30 u-p-r-30 u-row-between"
v-for="(item,index) in status.list" :key="index">
<view>{{item.label}}</view>
<uni-icons v-if="status.active===index" type="checkmarkempty" :color="color.ColorMain"></uni-icons>
</view>
<view :style="{height: status.bottomHeight+'px'}"></view>
</view>
</view>
<view class="list u-p-30">
<view class="my-bg-main table-type u-flex border-r-12 color-fff ">
<view class="item u-p-20" :class="{sel:tables.area.sel===item.id}" @tap="changeAreaSel(item)"
v-for="(item,index) in tables.area.list" :key="index">
<view class="box">
<view>{{item.name}}</view>
<view class="u-m-t-10">0/12</view>
</view>
</view>
</view>
<view class="u-m-t-30 u-flex u-flex-wrap u-row-between">
<view class="u-m-b-30" v-for="(item,index) in tables.list" :key="index">
<table-item @more="moreShow(item)" :data="item"></table-item>
</view>
<my-img-empty v-if="tables.hasAjax&&!tables.list.length" tips="未找到相关桌台"></my-img-empty>
</view>
</view>
</view>
<my-action-sheet @itemClick="actionSheetClick" ref="refMoreSheet" :list="actionSheet.list"
:title="actionSheet.title">
<template #title>
<view class="color-999 u-p-30 u-text-center border-bottom">桌号:{{actionSheet.title}}</view>
</template>
</my-action-sheet>
<my-mask ref="mask" @close="hideType"></my-mask>
<add-table ref="refTable" @update="tableUpdate"></add-table>
</template>
<script setup>
import {
$status
} from '@/commons/table-status.js'
import {
$table,
$tableArea
} from '@/http/yskApi/table.js'
import {
objToArrary
} from '@/commons/utils/returrn-data.js'
import {
onLoad,
onReady,
onHide,
onShow,
onPageScroll,
onPullDownRefresh
} from '@dcloudio/uni-app';
import color from '@/commons/color';
import myMask from '@/components/my-components/my-mask'
import addTable from './components/add-table'
import myActionSheet from '@/components/my-components/my-action-sheet';
import tableItem from './components/table-item'
import {
ref,
reactive,
computed,
watch
} from 'vue';
const refMoreSheet = ref(null)
const actionSheet = reactive({
list: ['编辑', '历史订单'],
title: '',
selTable: ''
})
function moreShow(table) {
actionSheet.title = table.name
actionSheet.selTable = table
refMoreSheet.value.open()
}
function actionSheetClick(index) {
console.log(index);
if (index == 0) {
refTableShow()
}
}
const refTable = ref(null)
function refTableShow() {
refTable.value.open(actionSheet.selTable)
}
function refTableClose() {
refTable.value.close()
}
const search = reactive({
keyword: '',
show: false
})
function searchConfirm() {
hideSearch()
tables.list = tables.originList.filter((v) =>
v.name.includes(search.keyword.trim())
);
}
function hideSearch() {
search.show = false
maskHide()
}
function showSearch() {
search.show = true
status.show = false
times.show = false
maskShow()
}
const page = reactive({
list: [1, 2],
status: 'noMore'
})
function showsTimesToggle() {
times.show = !times.show
search.show = false
status.show = false
if (times.show) {
maskShow()
} else {
maskHide()
}
}
const times = reactive({
list: [10, 15, 20, 30],
active: 0,
show: false,
bottomHeight: 14
})
const timesHeight = computed(() => {
return 30 * times.list.length + times.bottomHeight + 'px'
})
function changeTimesActive(i) {
times.active = i
search.show = false
times.show = false
status.show = false
maskHide()
}
const statusList = objToArrary($status)
statusList.unshift({
key: 'all',
label: '全部'
})
const status = reactive({
list: statusList,
active: 0,
show: false,
bottomHeight: 14
})
function hideType() {
status.show = false
search.show = false
times.show = false
}
const statusHeight = computed(() => {
return 30 * status.list.length + status.bottomHeight + 'px'
})
function changestatusActive(i) {
status.active = i
status.show = false
toggleMask()
}
function showstatusToggle() {
status.show = !status.show
search.show = false
times.show = false
if (status.show) {
maskShow()
} else {
maskHide()
}
}
const filters = reactive({
time: {
start: '',
end: ''
}
})
function clearTime() {
filters.time.start = ''
filters.time.end = ''
}
const datePicker = ref(null)
function datePickerConfirm(e) {
console.log(e);
filters.time.start = e.start
filters.time.end = e.end
}
function timeToggle() {
datePicker.value.toggle()
}
const mask = ref(null)
function toggleMask(show) {
mask.value.toggle()
}
function maskShow() {
mask.value.open()
}
function maskHide() {
mask.value.close()
}
const query = {
page: 0,
size: 10,
areaId: 0
}
const tables = reactive({
hasAjax: false,
originList: [],
list: [],
area: {
list: [],
sel: ''
}
})
function changeAreaSel(item) {
tables.area.sel = item.id
query.areaId = item.id
}
async function getTable() {
const {
content
} = await $table.get(query)
tables.hasAjax = true
tables.list = content
tables.originList = content
}
async function getArea() {
const {
content
} = await $tableArea.get({
page: 0,
size: 300
})
tables.area.list = content
}
watch(() => tables.area.sel, (newval) => {
console.log(newval);
query.page = 0
getTable()
})
watch(() => status.active, (newval) => {
query.page = 0
if (newval === 0) {
return tables.list = tables.originList
}
tables.list = tables.originList.filter((v) => {
return v.status == status.list[status.active].key
});
})
watch(() => times.active, (newval) => {
setTimer()
})
function tableUpdate() {
query.page = 0
getTable()
}
let timer = null
function getData() {
getTable()
getArea()
}
function setTimer() {
clearInterval(timer)
getData()
timer = setInterval(() => {
getData()
}, times.list[times.active] * 1000)
}
watch(() => times.active, (newval) => {
setTimer()
})
onHide(()=>{
clearInterval(timer)
})
onShow(opt => {
setTimer()
})
</script>
<style lang="scss" scoped>
.fixed-top {
z-index: 10;
}
.table-type {
flex-wrap: wrap;
padding: 0 10rpx 0 10rpx;
.item {
width: 25%;
margin-bottom: 10rpx;
.box {
position: relative;
padding: 10rpx;
border-radius: 10rpx;
&::after {
position: absolute;
display: block;
content: '';
top: 0;
bottom: 0;
width: 2px;
border-radius: 2px;
right: -20rpx;
background-color: rgba(255, 255, 255, .5);
}
}
&:nth-of-type(4n) {
.box::after {
background-color: transparent;
}
}
&.sel {
.box {
background-color: rgba(255, 255, 255, .6);
}
}
}
}
.search-box {
background-color: #fff;
padding: 16rpx 0;
top: 0;
bottom: 0;
position: absolute;
right: 30rpx;
display: flex;
.search-btn {
padding: 0 30rpx;
box-sizing: border-box;
display: flex;
align-items: center;
// width: 164rpx;
transition: all .3s ease-in-out;
background-color: rgb(247, 247, 247);
border-radius: 100px;
}
}
.status {
position: absolute;
top: 100%;
left: 0;
right: 0;
z-index: 10;
background-color: #fff;
}
.icon-arrow-down-fill {
width: 16rpx;
height: 10rpx;
}
.list {
margin-top: 52px;
}
</style>