jwyu il y a 2 ans
Parent
commit
c96112728a
100 fichiers modifiés avec 4358 ajouts et 2448 suppressions
  1. 44 0
      api/businessTrip/index.js
  2. 6 0
      api/common.js
  3. 438 0
      pages-approve/businessTrip/add.vue
  4. 230 0
      pages-approve/businessTrip/detail.vue
  5. 142 0
      pages-approve/businessTrip/list.vue
  6. 104 0
      pages-approve/businessTrip/reason.vue
  7. BIN
      pages-approve/static/add.png
  8. BIN
      pages-approve/static/del.png
  9. 171 0
      pages-businessTrip/apply/list.vue
  10. 33 0
      pages-businessTrip/calendar/index.vue
  11. 69 15
      pages-todomessages/list/list.vue
  12. BIN
      pages-todomessages/static/icon-7.png
  13. 46 1
      pages.json
  14. 1 0
      pages/index/index.vue
  15. 26 0
      pages/workbench/index.vue
  16. BIN
      static/icon-7.png
  17. BIN
      static/icon-businesstrip-apply.png
  18. BIN
      static/icon-businesstrip-approve.png
  19. BIN
      static/icon-businesstrip-calendar.png
  20. 409 0
      utils/area.js
  21. 65 64
      wxcomponents/vant/action-sheet/index.js
  22. 2 2
      wxcomponents/vant/action-sheet/index.wxml
  23. 0 0
      wxcomponents/vant/action-sheet/index.wxss
  24. 210 225
      wxcomponents/vant/area/index.js
  25. 1 1
      wxcomponents/vant/area/index.wxml
  26. 53 58
      wxcomponents/vant/button/index.js
  27. 2 1
      wxcomponents/vant/button/index.wxml
  28. 0 0
      wxcomponents/vant/button/index.wxss
  29. 3 2
      wxcomponents/vant/calendar/calendar.wxml
  30. 31 28
      wxcomponents/vant/calendar/components/header/index.js
  31. 1 1
      wxcomponents/vant/calendar/components/header/index.wxml
  32. 1 1
      wxcomponents/vant/calendar/components/header/index.wxss
  33. 6 1
      wxcomponents/vant/calendar/components/month/index.d.ts
  34. 148 157
      wxcomponents/vant/calendar/components/month/index.js
  35. 1 1
      wxcomponents/vant/calendar/components/month/index.wxml
  36. 0 0
      wxcomponents/vant/calendar/components/month/index.wxss
  37. 331 298
      wxcomponents/vant/calendar/index.js
  38. 3 2
      wxcomponents/vant/calendar/index.wxml
  39. 2 2
      wxcomponents/vant/calendar/index.wxs
  40. 1 1
      wxcomponents/vant/calendar/index.wxss
  41. 3 8
      wxcomponents/vant/calendar/utils.d.ts
  42. 62 57
      wxcomponents/vant/calendar/utils.js
  43. 43 43
      wxcomponents/vant/card/index.js
  44. 0 0
      wxcomponents/vant/card/index.wxss
  45. 1 0
      wxcomponents/vant/cascader/index.d.ts
  46. 208 0
      wxcomponents/vant/cascader/index.js
  47. 8 0
      wxcomponents/vant/cascader/index.json
  48. 53 0
      wxcomponents/vant/cascader/index.wxml
  49. 24 0
      wxcomponents/vant/cascader/index.wxs
  50. 1 0
      wxcomponents/vant/cascader/index.wxss
  51. 7 6
      wxcomponents/vant/cell-group/index.js
  52. 4 2
      wxcomponents/vant/cell-group/index.wxml
  53. 1 1
      wxcomponents/vant/cell-group/index.wxss
  54. 32 32
      wxcomponents/vant/cell/index.js
  55. 0 0
      wxcomponents/vant/cell/index.wxss
  56. 30 30
      wxcomponents/vant/checkbox-group/index.js
  57. 1 1
      wxcomponents/vant/checkbox-group/index.wxss
  58. 68 66
      wxcomponents/vant/checkbox/index.js
  59. 1 1
      wxcomponents/vant/checkbox/index.wxss
  60. 2 4
      wxcomponents/vant/circle/canvas.d.ts
  61. 41 41
      wxcomponents/vant/circle/canvas.js
  62. 175 172
      wxcomponents/vant/circle/index.js
  63. 1 1
      wxcomponents/vant/circle/index.wxss
  64. 5 5
      wxcomponents/vant/col/index.js
  65. 1 1
      wxcomponents/vant/col/index.wxss
  66. 1 5
      wxcomponents/vant/collapse-item/animate.d.ts
  67. 30 61
      wxcomponents/vant/collapse-item/animate.js
  68. 51 50
      wxcomponents/vant/collapse-item/index.js
  69. 1 0
      wxcomponents/vant/collapse-item/index.wxml
  70. 1 1
      wxcomponents/vant/collapse-item/index.wxss
  71. 40 38
      wxcomponents/vant/collapse/index.js
  72. 2 6
      wxcomponents/vant/common/component.d.ts
  73. 40 39
      wxcomponents/vant/common/component.js
  74. 1 1
      wxcomponents/vant/common/index.wxss
  75. 11 17
      wxcomponents/vant/common/relation.d.ts
  76. 50 58
      wxcomponents/vant/common/relation.js
  77. 1 1
      wxcomponents/vant/common/style/clearfix.wxss
  78. 1 1
      wxcomponents/vant/common/style/ellipsis.wxss
  79. 1 1
      wxcomponents/vant/common/style/hairline.wxss
  80. 0 0
      wxcomponents/vant/common/style/theme.wxss
  81. 11 25
      wxcomponents/vant/common/utils.d.ts
  82. 50 64
      wxcomponents/vant/common/utils.js
  83. 1 3
      wxcomponents/vant/common/validator.d.ts
  84. 10 10
      wxcomponents/vant/common/validator.js
  85. 2 0
      wxcomponents/vant/common/version.d.ts
  86. 39 28
      wxcomponents/vant/common/version.js
  87. 5 5
      wxcomponents/vant/config-provider/index.js
  88. 90 89
      wxcomponents/vant/count-down/index.js
  89. 1 1
      wxcomponents/vant/count-down/index.wxss
  90. 1 1
      wxcomponents/vant/count-down/utils.d.ts
  91. 45 41
      wxcomponents/vant/count-down/utils.js
  92. 267 293
      wxcomponents/vant/datetime-picker/index.js
  93. 24 39
      wxcomponents/vant/definitions/index.d.ts
  94. 49 52
      wxcomponents/vant/dialog/dialog.d.ts
  95. 56 63
      wxcomponents/vant/dialog/dialog.js
  96. 111 110
      wxcomponents/vant/dialog/index.js
  97. 2 2
      wxcomponents/vant/dialog/index.wxml
  98. 1 1
      wxcomponents/vant/dialog/index.wxss
  99. 9 9
      wxcomponents/vant/divider/index.js
  100. 1 1
      wxcomponents/vant/divider/index.wxss

+ 44 - 0
api/businessTrip/index.js

@@ -0,0 +1,44 @@
+import {
+	httpGet,
+	httpPost
+} from "@/utils/request.js"
+
+// 新增申请
+export const apiAddApply=params=>{
+    return httpPost('/business_trip/apply/add',params)
+}
+
+//申请列表
+export const apiApplyList=params=>{
+    return httpGet('/business_trip/apply/list',params)
+}
+
+//出差详情
+export const apiBusinessTripDetail=params=>{
+    return httpGet('/business_trip/apply/detail',params)
+}
+
+//出差申请撤回
+export const apiBusinessTripRecall=params=>{
+    return httpPost('/business_trip/apply/back',params)
+}
+
+//出差重新申请
+export const apiEditApply=params=>{
+    return httpPost('/business_trip/apply/edit',params)
+}
+
+//出差审批单审批
+export const apiBusinessApplyApprove=params=>{
+    return httpPost('/business_trip/apply/approve',params)
+}
+
+//审批列表
+export const apiApproveList=params=>{
+    return httpGet('/business_trip/approve/list',params)
+}
+
+// 删除审批单
+export const apiDelApply=params=>{
+    return httpPost('/business_trip/apply/delete',params)
+}

+ 6 - 0
api/common.js

@@ -0,0 +1,6 @@
+import {httpGet,httpPost} from "@/utils/request.js"
+
+//系统中所有用户
+export const apiSystemUsers=()=>{
+	return httpGet('/system/role/seller/list',{})
+}

+ 438 - 0
pages-approve/businessTrip/add.vue

@@ -0,0 +1,438 @@
+<template>
+    <view class="add-apply-page">
+        <view class="form-item has-arrow">
+            <view class="label">到达日期</view>
+            <view class="content">
+                <picker
+                    class="picker-box" 
+                    mode="date" 
+                    :value="formData.arriveDate" 
+                    :start="startDate" 
+                    :end="endDate" 
+                    @change="arriveDateChange"
+                >
+					<view :class="['text',formData.arriveDate?'':'placeholde-text']">{{formData.arriveDate||'请选择日期'}}</view>
+				</picker>
+            </view>
+        </view>
+        <view class="form-item has-arrow">
+            <view class="label">返程日期</view>
+            <view class="content">
+                <picker
+                    class="picker-box" 
+                    mode="date" 
+                    :value="formData.backDate" 
+                    :start="startDate" 
+                    :end="endDate" 
+                    @change="backDateChange"
+                >
+					<view :class="['text',formData.backDate?'':'placeholde-text']">{{formData.backDate||'请选择日期'}}</view>
+				</picker>
+            </view>
+        </view>
+        <view class="form-item has-arrow">
+            <view class="label">目的地</view>
+            <view class="content" @click="showDestination=true">
+                <view :class="['text',formData.destination.length?'':'placeholde-text']">{{formData.destination.join('')||'请选择目的地'}}</view>
+            </view>
+        </view>
+        <view class="form-item has-arrow">
+            <view class="label">出差事由</view>
+            <view class="content" @click="showReason=true">
+                <view :class="['text',formData.reason?'':'placeholde-text']">{{formData.reason||'请选择出差事由'}}</view>
+            </view>
+        </view>
+        <view class="form-item has-arrow">
+            <view class="label">交通工具</view>
+            <view class="content" @click="showVehicle=true">
+                <view :class="['text',formData.vehicle?'':'placeholde-text']">{{formData.vehicle||'请选择交通工具'}}</view>
+            </view>
+        </view>
+        <view class="form-item" v-if="formData.vehicle=='其他'">
+            <view class="label">其他工具</view>
+            <view class="content">
+                <input v-model="formData.otherVehicle" style="width:100%;height:100%" type="text" placeholder="请输入交通工具">
+            </view>
+        </view>
+
+        <view class="partner-box" style="margin-top:20rpx">
+            <view class="form-item" v-for="(item,index) in formData.partner" :key="item.AdminId">
+                <view class="label">同行人</view>
+                <view class="content">{{item.RealName}}</view>
+                <image class="del-icon" src="../static/del.png" mode="aspectFill" @click="handleDelPartner(index)"/>
+            </view>
+            <view class="add-partner-box" @click="showPartner=true">
+                <image class="del-icon" src="../static/add.png" mode="aspectFill"/>
+                <text>同行人</text>
+            </view>
+              
+        </view>
+
+        <view class="fix-bottom-wrap btns-wrap flex">
+            <button class="refuse-btn" @click="handleRefuse">取消</button>
+			<button class="pass-btn" @click="handleApply">确定</button>
+		</view>
+          
+
+
+        <!-- 选择目的地弹窗 -->
+        <van-popup :show="showDestination" @close="showDestination=false" position="bottom">
+            <van-area
+				:value="formData.destination"
+				:area-list="areaList" 
+				:columns-num="2"
+				@confirm="confrimDestination" 
+				@cancel="showDestination = false"
+			/>
+        </van-popup>
+
+        <!-- 出差事由 -->
+        <van-popup :show="showReason" @close="showReason=false" position="bottom">
+            <van-picker 
+                show-toolbar 
+                title="出差事由" 
+                :columns="reasonOpt" 
+                @confirm="onReasonChange" 
+                @cancel="showReason=false"
+            />
+        </van-popup>
+
+        <!-- 交通工具 -->
+        <van-popup :show="showVehicle" @close="showVehicle=false" position="bottom">
+            <van-picker 
+                show-toolbar 
+                title="交通工具" 
+                :columns="vehicleOpts" 
+                @confirm="onvehicleChange" 
+                @cancel="showVehicle=false"
+            />
+        </van-popup>
+
+        <!-- 选择同行人 -->
+        <van-popup :show="showPartner" @close="showPartner=false" position="bottom">
+            <van-cascader
+                v-if="showPartner"
+                title="请选择同行人"
+                :options="systemUserList"
+                :field-names="systemUserListOpt"
+                @close="showPartner=false"
+                @finish="onSelectPartnerFinish"
+            />
+        </van-popup>
+    </view>
+
+      
+      
+</template>
+
+<script>
+import { areaList } from '@/utils/area.js';
+import {apiSystemUsers} from '@/api/common'
+import {apiAddApply,apiEditApply,apiBusinessTripDetail} from '@/api/businessTrip/index'
+export default {
+    computed: {
+        startDate() {
+            return this.getDate('start');
+        },
+        endDate() {
+            return this.getDate('end');
+        }
+    },
+    data() {
+        const currentDate = this.getDate()
+        return {
+            id:0,
+            formData:{
+                arriveDate:'',
+                backDate:'',
+                destination:[],
+                reason:'',
+                vehicle:'',
+                otherVehicle:'',
+                partner:[]
+            },
+            areaList,
+            showDestination:false,
+
+            showReason:false,
+            reasonOpt:['路演','调研','培训','会议'],
+
+            showVehicle:false,
+            vehicleOpts:['飞机','火车','汽车','其他'],
+
+            showPartner:false,
+            systemUserList:[],
+            systemUserListOpt:{
+                text: 'RealName',
+                value: 'AdminId',
+                children: 'ChildrenList',
+            }
+        }
+    },
+    onLoad(opt){
+        this.id=opt.id
+        if(opt.id){
+            this.getDetail()
+        }
+        this.getSystemUsers()
+    },
+    methods: {
+        async handleApply(){
+            const pids=[],pnames=[];
+            this.formData.partner.forEach(item => {
+                pids.push(item.AdminId)
+                pnames.push(item.RealName)
+            });
+            let params={
+                ArriveDate:this.formData.arriveDate,
+                ReturnDate:this.formData.backDate,
+                Province:this.formData.destination[0],
+                City:this.formData.destination[1],
+                Reason:this.formData.reason,
+                Transportation:this.formData.otherVehicle?`${this.formData.vehicle}-${this.formData.otherVehicle}`:this.formData.vehicle,
+                PeerPeopleId:pids.join(','),
+                PeerPeopleName:pnames.join(',')
+            }
+            if(!params.ArriveDate){
+                uni.showToast({
+                    title:'请选择到达日期',
+                    icon:'none'
+                })
+                return
+            }
+            if(!params.ReturnDate){
+                uni.showToast({
+                    title:'请选择返程日期',
+                    icon:'none'
+                })
+                return
+            }
+            if(!params.City){
+                uni.showToast({
+                    title:'请选择目的地',
+                    icon:'none'
+                })
+                return
+            }
+            if(!params.Reason){
+                uni.showToast({
+                    title:'请选择出差事由',
+                    icon:'none'
+                })
+                return
+            }
+            if(!params.Transportation){
+                uni.showToast({
+                    title:'请选择交通工具',
+                    icon:'none'
+                })
+                return
+            }
+
+            const res=this.id?await apiEditApply({...params,BusinessApplyId:Number(this.id)}):await apiAddApply(params)
+            if(res.code===200){
+                uni.showToast({
+                    title:"提交成功",
+                    icon:'success'
+                })
+                uni.$emit('businessApproveListUpdate')
+                setTimeout(()=>{
+					this.handleRefuse()
+				},1500)
+            }
+            
+        },
+
+        handleRefuse(){
+            uni.navigateBack({
+                delta:1
+            })
+        },
+
+
+        getDate(type) {
+            const date = new Date();
+            let year = date.getFullYear();
+            let month = date.getMonth() + 1;
+            let day = date.getDate();
+
+            if (type === 'start') {
+                year = year - 60;
+            } else if (type === 'end') {
+                year = year + 2;
+            }
+            month = month > 9 ? month : '0' + month;
+            day = day > 9 ? day : '0' + day;
+            return `${year}-${month}-${day}`;
+        },
+        arriveDateChange(e){
+            this.formData.arriveDate=e.detail.value
+        },
+        backDateChange(e){
+            this.formData.backDate=e.detail.value
+        },
+
+        confrimDestination(e){
+            this.formData.destination=[e.detail.values[0].name,e.detail.values[1].name]
+            this.showDestination=false
+        },
+
+        onReasonChange(e){
+            this.formData.reason=e.detail.value
+            this.showReason=false
+        },
+
+        onvehicleChange(e){
+            this.formData.vehicle=e.detail.value
+            this.showVehicle=false
+        },
+
+        // 选择同行人
+        onSelectPartnerFinish(e){
+            // console.log(e);
+            const item=e.detail.selectedOptions[e.detail.selectedOptions.length-1]
+            this.formData.partner.push(item)
+            this.showPartner=false
+        },
+        handleDelPartner(index){
+            this.formData.partner.splice(index,1)
+        },
+
+        getSystemUsers(){
+            apiSystemUsers().then(res=>{
+                if(res.code===200){
+                    this.systemUserList=res.data.List||[]
+                }
+            })
+        },
+
+        // 获取详情
+        getDetail(){
+            apiBusinessTripDetail({BusinessApplyId:this.id}).then(res=>{
+                if(res.code===200){
+                    this.formData.arriveDate=res.data.ArriveDate
+                    this.formData.backDate=res.data.ReturnDate
+                    this.formData.destination=[res.data.Province,res.data.City]
+                    this.formData.reason=res.data.Reason
+                    this.formData.vehicle=res.data.Transportation.split('-')[0]
+                    this.formData.otherVehicle=res.data.Transportation.split('-')[1]?res.data.Transportation.split('-')[1]:''
+                    const temPartnerName=res.data.PeerPeopleName.split(',')
+                    const temPartnerId=res.data.PeerPeopleId.split(',')
+                    temPartnerName.forEach((item,index)=>{
+                        this.formData.partner.push({
+                            AdminId:temPartnerId[index],
+                            RealName:item
+                        })
+                    })
+                }
+            })
+        }
+
+    },
+}
+</script>
+
+<style lang="scss" scoped>
+.add-apply-page{
+    padding-top: 10rpx;
+    padding-bottom: calc(150rpx + constant(safe-area-inset-bottom));
+	padding-bottom: calc(150rpx + env(safe-area-inset-bottom));
+    .form-item{
+        display: flex;
+        align-items: center;
+        border-bottom: 1px solid #f5f5f5;
+        padding: 20rpx 34rpx;
+        position: relative;
+        background-color: #fff;
+        font-size: 32rpx;
+        .label{
+            width: 130rpx;
+            flex-shrink: 0;
+            text-align: right;
+            margin-right: 30rpx;
+        }
+        .content{
+            flex: 1;
+            min-height: 40rpx;
+            .picker-box{
+                width: 100%;
+                height: 100%;
+            }
+            .placeholde-text{
+                color: #999;
+            }
+        }
+        .del-icon{
+            width: 34rpx;
+            height: 34rpx;
+        }
+        
+    }
+    .has-arrow::after{
+            content: '';
+            display: block;
+            transform:rotate(45deg);
+            width: 18rpx;
+            height: 18rpx;
+            border-top: 2rpx solid #333;
+            border-right: 2rpx solid #333;
+    }
+    .picker-box{
+        height: 500rpx;
+        .item {
+            line-height: 100rpx;
+            text-align: center;
+        }
+    }
+    .destination-popup-top-btn{
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        padding: 20rpx 34rpx;
+        view:first-child{
+            color: #999;
+        }
+        view:last-child{
+            color: #3385FF;
+        }
+    }
+    .add-partner-box{
+        display: flex;
+        padding: 20rpx 34rpx;
+        align-items: center;
+        font-size: 32rpx;
+        color: #3385FF;
+        background-color: #fff;
+        image{
+            width: 34rpx;
+            height: 34rpx;
+            margin-right: 20rpx;
+            display: block;
+        }
+    }
+
+    .btns-wrap {
+		justify-content: center;
+		button {
+			width: 260rpx;
+			height: 70rpx;
+			border-radius: 28px;
+			border: none;
+			margin: 0 15px;
+			font-size: 15px;
+			color: #fff;
+			line-height: 70rpx;
+		}
+
+		.pass-btn {
+			background-color: #3385FF;
+		}
+
+		.refuse-btn {
+			background-color: #fff;
+            color: #3385FF;
+            border: 1px solid #3385FF;
+		}
+	}
+}
+</style>

+ 230 - 0
pages-approve/businessTrip/detail.vue

@@ -0,0 +1,230 @@
+<template>
+    <view class="detail-page" v-if="info">
+        <view class="section">
+            <image :src="statusImg" mode="aspectFill" class="status-img"></image>
+            <view class="info-item" v-for="item in infoOpts" :key="item.key">
+                <view class="label">{{item.name}}</view>
+                <view class="content">
+                    <text v-if="item.key=='place'">{{info.Province}}{{info.City}}</text>
+                    <text>{{info[item.key]}}</text>
+                </view>
+            </view>
+        </view>
+        <view class="section" v-if="info.Status!=='待审批'&&(info.ApproveTime||info.RefuseTime)">
+            <view class="info-item">
+                <view class="label">审批时间</view>
+                <view class="content">{{info.ApproveTime||info.RefuseTime}}</view>
+            </view>
+            <view class="info-item" style="color:#C54322" v-if="info.Status==='已驳回'">
+                <view class="label">驳回理由</view>
+                <view class="content">{{info.RefuseReason}}</view>
+            </view>
+        </view>
+
+        <view class="fix-bottom-wrap btns-wrap flex" v-if="info.ApplyAdminId==adminId&&info.Status=='待审批'">
+			<button class="pass-btn" @click="handleRecall">撤回</button>
+		</view>
+        <view class="fix-bottom-wrap btns-wrap flex" v-if="info.ApplyAdminId==adminId&&info.Status=='已驳回'">
+			<button class="pass-btn" @click="handleEdit">重新申请</button>
+		</view>
+        <view class="fix-bottom-wrap btns-wrap flex" v-if="info.ApplyAdminId==adminId&&info.Status=='已撤回'">
+            <button class="refuse-btn" @click="handleDel">删除</button>
+			<button class="pass-btn" @click="handleEdit">重新申请</button>
+		</view>
+        <view class="fix-bottom-wrap btns-wrap flex" v-if="info.IsApprove&&info.Status=='待审批'">
+            <button class="pass-btn" @click="handlePass">通过</button>
+			<button class="refuse-btn" @click="handleRefuse">驳回</button>
+		</view>
+
+        <van-dialog id="van-dialog" />
+    </view>
+      
+</template>
+
+<script>
+import {apiBusinessTripDetail,apiBusinessTripRecall,apiBusinessApplyApprove,apiDelApply} from '@/api/businessTrip/index'
+export default {
+    computed:{
+        adminId(){
+            const userInfo=uni.getStorageSync('userInfo');
+            return userInfo?JSON.parse(userInfo).AdminId:0
+        }
+    },
+    data() {
+        return {
+            infoOpts:[
+                {name:'申请人',key:'ApplyRealName'},
+                {name:'到达日期',key:'ArriveDate'},
+                {name:'返程日期',key:'ReturnDate'},
+                {name:'目的地',key:'place'},
+                {name:'出差事由',key:'Reason'},
+                {name:'交通工具',key:'Transportation'},
+                {name:'同行人',key:'PeerPeopleName'},
+                {name:'提交时间',key:'ModifyTime'},
+            ],
+            id:0,
+            info:null,
+            statusImg:'',
+        }
+    },
+    onLoad(opt){
+        this.id=opt.id
+    },
+    onShow(){
+        this.getDetail()
+    },
+    methods: {
+        getDetail(){
+            this.info=null
+            apiBusinessTripDetail({BusinessApplyId:this.id}).then(res=>{
+                if(res.code===200){
+                    this.info=res.data
+                    if(this.info.Status==='已审批'){
+                        this.statusImg= require('../static/pass-icon.png')
+                    }else if(this.info.Status==='已驳回'){
+                        this.statusImg= require('../static/fail-icon.png')
+                    }else if(this.info.Status==='已过期'){
+                        this.statusImg= require('../static/cancel-icon.png')
+                    }else if(this.info.Status==='已撤回'){
+                        this.statusImg= require('../static/recall-icon.png')
+                    }
+                }
+            })
+        },
+
+        // 撤回
+        handleRecall(){
+            const that=this
+            uni.showModal({
+                title: '',
+                content: '确定要撤回该出差申请吗?',
+                success: function (res) {
+                    if (res.confirm) {
+                        console.log('用户点击确定');
+                        apiBusinessTripRecall({BusinessApplyId:Number(that.id)}).then(res=>{
+                            if(res.code===200){
+                                uni.$emit('businessApproveListUpdate')
+                                uni.navigateBack({
+                                    delta: 1
+                                });
+                                
+                            }
+                        })
+                    } else if (res.cancel) {
+                        console.log('用户点击取消');
+                    }
+                }
+            });
+        },
+
+        // 重新申请
+        handleEdit(){
+            uni.navigateTo({
+				url:"/pages-approve/businessTrip/add?id="+this.id
+			})
+        },
+
+        // 删除
+        handleDel(){
+            apiDelApply({BusinessApplyId:Number(this.id)}).then(res=>{
+                if(res.code===200){
+                    uni.$emit('businessApproveListUpdate')
+                    uni.showToast({
+                        title:"删除成功",
+                        icon:'success'
+                    })
+                    setTimeout(() => {
+                        uni.navigateBack({
+                            delta: 1
+                        });
+                    }, 1500);
+                    
+                }
+            })
+        },
+
+        //审批驳回
+		handleRefuse(){
+			uni.navigateTo({
+				url:"./reason?id="+this.id
+			})
+		},
+
+        //审批通过
+		async handlePass(){
+				const res=await apiBusinessApplyApprove({
+                    BusinessApplyId:Number(this.id),
+					ApproveStatus:1,
+					Remark:''
+                })
+				if(res.code===200){
+					this.$dialog.alert({
+						title: "处理成功",
+						confirmButtonColor: "#5890FB",
+					}).then(() => {
+						// on close
+ 						this.getDetail()
+						// 更新列表
+						uni.$emit('businessApproveListUpdate')
+					});
+				}
+	    },
+    },
+}
+</script>
+
+<style lang="scss" scoped> 
+.detail-page{
+    padding-bottom: calc(150rpx + constant(safe-area-inset-bottom));
+	padding-bottom: calc(150rpx + env(safe-area-inset-bottom));
+}
+.section{
+    margin-top: 20rpx;
+    background-color: #fff;
+    padding: 30rpx 34rpx;
+    position: relative;
+		.status-img{
+			position: absolute;
+			width: 222rpx;
+			height: 222rpx;
+			right: 0;
+			top: 150rpx;
+			z-index: 10;
+		}
+}
+.info-item{
+    font-size: 32rpx;
+    display: flex;
+    margin-bottom: 20rpx;
+    .label{
+        width: 150rpx;
+        flex-shrink: 0;
+        margin-right: 30rpx;
+        text-align: right;
+    }
+    .content{
+        flex: 1;
+    }
+}
+.btns-wrap {
+		justify-content: center;
+		button {
+			width: 260rpx;
+			height: 70rpx;
+			border-radius: 28px;
+			border: none;
+			margin: 0 15px;
+			font-size: 15px;
+			color: #fff;
+			line-height: 70rpx;
+		}
+
+		.pass-btn {
+			background-color: #3385FF;
+		}
+
+		.refuse-btn {
+			background-color: #f55768;
+		}
+}
+</style>

+ 142 - 0
pages-approve/businessTrip/list.vue

@@ -0,0 +1,142 @@
+<template>
+    <view  class="list-page">
+        <van-sticky>
+            <van-tabs swipeable id="tabs" :active="status" title-active-color="#3385FF" color="#3385FF" @change="typeChange">
+				<van-tab title="待审批" name="待审批"></van-tab>
+				<van-tab title="已审批" name="已审批"></van-tab>
+			</van-tabs>
+        </van-sticky>
+        <van-empty description="暂无数据" :image="require('@/static/empty.png')" v-if="finished&&list.length===0"/>
+		<view class="list-wrap" v-else>
+			<view class="item" v-for="item in list" :key="item.BusinessApplyId" @click="goDetail(item)">
+                <view class="info-item" v-for="info in itemOpt" :key="info.key">
+                    <view class="label">{{info.lable}}:</view>
+                    <view class="content">
+                        <text v-if="info.key=='place'">{{item.Province}}{{item.City}}</text>
+                        <text v-else>{{item[info.key]}}</text>
+                    </view>
+                </view>
+                <view class="status approve-list-status-wait" v-if="item.Status==='待审批'">待审批</view>
+                <view class="status approve-list-status-success" v-if="item.Status==='已审批'">已审批</view>
+                <view class="status approve-list-status-fail" v-if="item.Status==='已驳回'">已驳回</view>
+                <view class="status approve-list-status-cancel" v-if="item.Status==='已过期'">已过期</view>
+                <view class="status approve-list-status-back" v-if="item.Status==='已撤回'">已撤回</view>
+            </view>
+		</view>
+          
+    </view>
+</template>
+
+<script>
+import {apiApproveList} from '@/api/businessTrip/index'
+export default {
+    data() {
+		return {
+			status: '待审批',
+			list:[],
+			page:1,
+			finished:false,
+            PageSize:20,
+            itemOpt:[
+                {lable:'申请人',key:'ApplyRealName'},
+                {lable:'目的地',key:'place'},
+                {lable:'出差事由',key:'Reason'},
+                {lable:'提交时间',key:'CreateTime'},
+            ]
+		}
+	},
+    onLoad(){
+        this.getList()
+        // 更新列表
+		uni.$on('businessApproveListUpdate',(e)=>{
+			console.log('更新列表');
+			this.page=1
+            this.finished=false
+            this.list=[]
+            this.getList()
+		})
+    },
+    onShow() {
+		this.selectComponent('#tabs').resize();// 解决初始渲染 vant tab 底部条
+	},
+    onUnload(){
+		uni.$off('businessApproveListUpdate')
+	},
+    onPullDownRefresh() {
+		this.page=1
+		this.finished=false
+		this.list=[]
+		this.getList()
+		setTimeout(()=>{
+			uni.stopPullDownRefresh()
+		},1500)
+	},
+	onReachBottom() {
+		if(this.finished) return
+		this.page++
+		this.getList()
+	},
+    methods: {
+        typeChange(e){
+			this.status=e.detail.name
+			this.page=1
+			this.finished=false
+			this.list=[]
+			this.getList()
+		},
+        
+        async getList(){
+            const res=await apiApproveList({
+                PageSize:this.PageSize,
+                CurrentIndex:this.page,
+                Status:this.status
+            })
+            if(res.code===200){
+                const arr=res.data.List||[]
+                this.list=[...this.list,...arr]
+                this.finished=res.data.Paging.IsEnd
+            }
+        },
+
+        goDetail(item){
+            uni.navigateTo({
+                url: '/pages-approve/businessTrip/detail?id='+item.BusinessApplyId,
+                success: (result) => {},
+                fail: () => {},
+                complete: () => {}
+            });
+        }
+    },
+}
+</script>
+
+<style lang="scss" scoped>
+.list-page{
+    min-height: 100vh;
+}
+.list-wrap{
+    padding: 20rpx;
+    .item{
+        padding: 30rpx;
+        background-color: #fff;
+        margin-bottom: 20rpx;
+        border-radius: 8rpx;
+        .info-item{
+            display: flex;
+            font-size: 32rpx;
+            margin-bottom: 30rpx;
+            .label{
+                width: 180rpx;
+                flex-shrink: 0;
+                text-align: right;
+            }
+            .content{
+                flex: 1;
+            }
+        }
+        .status{
+            text-align: right;
+        }
+    }
+}
+</style>

+ 104 - 0
pages-approve/businessTrip/reason.vue

@@ -0,0 +1,104 @@
+<template>
+	<view>
+		<view class="textarea-wrap white-wrap">
+			<textarea placeholder="请输入驳回理由" v-model="reason" maxlength="-1"></textarea>
+		</view>
+		<view class="btns-wrap flex">
+			<button class="confirm-btn" @click="handleSubmit">提交</button>
+			<button class="cancel-btn" @click="handleCancel">取消</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {apiBusinessApplyApprove} from '@/api/businessTrip/index'
+	export default {
+		data() {
+			return {
+				reason: '',
+				id:null,
+			}
+		},
+		onLoad(options) {
+			this.id=options.id
+		},
+		methods: {
+			async handleSubmit() {
+				if(!this.reason){
+					uni.showToast({
+						title:'请填写理由',
+						icon:"none"
+					})
+					return
+				}
+				const res=await apiBusinessApplyApprove({
+					BusinessApplyId:Number(this.id),
+					ApproveStatus:2,
+					RefuseReason:this.reason
+				})
+				if(res.code===200){
+					uni.showToast({
+						title:"审批成功",
+						icon:'success'
+					})
+					uni.$emit('businessApproveListUpdate')
+					setTimeout(()=>{
+						this.handleCancel()
+					},1000)
+				}
+			},
+			
+			handleCancel(){
+				uni.navigateBack({
+					delta:1
+				})
+			}
+			
+		},
+	}
+</script>
+
+<style lang="scss">
+	.textarea-wrap {
+		padding: 17px;
+
+		textarea {
+			resize: none;
+			display: block;
+			box-sizing: border-box;
+			width: 100%;
+			height: 200px;
+			border: none;
+			font-size: 14px;
+			/* no */
+		}
+	}
+
+	.btns-wrap {
+		justify-content: center;
+		padding-top: 50px;
+		padding-bottom: 50px;
+
+		button {
+			width: 90px;
+			height: 28px;
+			border-radius: 28px;
+			border: none;
+			margin: 0 10px;
+			font-size: 14px;
+			/* no */
+			color: #fff;
+			line-height: 28px;
+		}
+
+		.confirm-btn {
+			background-color: #5890fb;
+		}
+
+		.cancel-btn {
+			border: 1px solid #5890fb;
+			color: #5890fb;
+			background-color: #fff;
+		}
+	}
+</style>

BIN
pages-approve/static/add.png


BIN
pages-approve/static/del.png


+ 171 - 0
pages-businessTrip/apply/list.vue

@@ -0,0 +1,171 @@
+<template>
+    <view  class="list-page">
+        <van-sticky>
+            <van-tabs swipeable id="tabs" :active="status" title-active-color="#3385FF" color="#3385FF" @change="typeChange">
+				<van-tab title="待审批" name="待审批"></van-tab>
+				<van-tab title="已处理" name="已处理"></van-tab>
+			</van-tabs>
+        </van-sticky>
+        <van-empty description="暂无数据" :image="require('@/static/empty.png')" v-if="finished&&list.length===0"/>
+		<view class="list-wrap" v-else>
+			<view class="item" v-for="item in list" :key="item.BusinessApplyId" @click="goDetail(item)">
+                <view class="info-item" v-for="info in itemOpt" :key="info.key">
+                    <view class="label">{{info.lable}}:</view>
+                    <view class="content">
+                        <text v-if="info.key=='date'">{{item.ArriveDate|formatTime}}-{{item.ReturnDate|formatTime}}</text>
+                        <text v-else-if="info.key=='place'">{{item.Province}}{{item.City}}</text>
+                        <text v-else>{{item[info.key]}}</text>
+                    </view>
+                </view>
+                <view class="status approve-list-status-wait" v-if="item.Status==='待审批'">待审批</view>
+                <view class="status approve-list-status-success" v-if="item.Status==='已审批'">已审批</view>
+                <view class="status approve-list-status-fail" v-if="item.Status==='已驳回'">已驳回</view>
+                <view class="status approve-list-status-cancel" v-if="item.Status==='已过期'">已过期</view>
+                <view class="status approve-list-status-back" v-if="item.Status==='已撤回'">已撤回</view>
+            </view>
+		</view>
+
+        <view class="fix-bottom-wrap">
+            <view class="btn" @click="goAddApply">添加申请</view>
+        </view>
+          
+    </view>
+</template>
+
+<script>
+import {apiApplyList} from '@/api/businessTrip/index'
+export default {
+    data() {
+		return {
+			status: '待审批',
+			list:[],
+			page:1,
+			finished:false,
+            PageSize:20,
+            itemOpt:[
+                {lable:'出差日期',key:'date'},
+                {lable:'目的地',key:'place'},
+                {lable:'出差事由',key:'Reason'},
+                {lable:'提交时间',key:'CreateTime'},
+            ]
+		}
+	},
+    onLoad(){
+        this.getList()
+        // 更新列表
+		uni.$on('businessApproveListUpdate',(e)=>{
+			console.log('更新列表');
+			this.page=1
+            this.finished=false
+            this.list=[]
+            this.getList()
+		})
+    },
+    onShow() {
+		this.selectComponent('#tabs').resize();// 解决初始渲染 vant tab 底部条
+	},
+    onUnload(){
+		uni.$off('businessApproveListUpdate')
+	},
+    onPullDownRefresh() {
+		this.page=1
+		this.finished=false
+		this.list=[]
+		this.getList()
+		setTimeout(()=>{
+			uni.stopPullDownRefresh()
+		},1500)
+	},
+	onReachBottom() {
+		if(this.finished) return
+		this.page++
+		this.getList()
+	},
+    methods: {
+        typeChange(e){
+			this.status=e.detail.name
+			this.page=1
+			this.finished=false
+			this.list=[]
+			this.getList()
+		},
+        
+        async getList(){
+            const res=await apiApplyList({
+                PageSize:this.PageSize,
+                CurrentIndex:this.page,
+                Status:this.status
+            })
+            if(res.code===200){
+                const arr=res.data.List||[]
+                this.list=[...this.list,...arr]
+                this.finished=res.data.Paging.IsEnd
+            }
+        },
+
+        goAddApply(){
+            uni.navigateTo({
+                url: '/pages-approve/businessTrip/add',
+                success: (result) => {},
+                fail: () => {},
+                complete: () => {}
+            });
+        },
+
+        goDetail(item){
+            uni.navigateTo({
+                url: '/pages-approve/businessTrip/detail?id='+item.BusinessApplyId,
+                success: (result) => {},
+                fail: () => {},
+                complete: () => {}
+            });
+        }
+    },
+}
+</script>
+
+<style lang="scss" scoped>
+.list-page{
+    min-height: 100vh;
+	padding-bottom: calc(150rpx + constant(safe-area-inset-bottom));
+	padding-bottom: calc(150rpx + env(safe-area-inset-bottom));
+}
+.list-wrap{
+    padding: 20rpx;
+    .item{
+        padding: 30rpx;
+        background-color: #fff;
+        margin-bottom: 20rpx;
+        border-radius: 8rpx;
+        .info-item{
+            display: flex;
+            font-size: 32rpx;
+            margin-bottom: 30rpx;
+            .label{
+                width: 180rpx;
+                flex-shrink: 0;
+                text-align: right;
+            }
+            .content{
+                flex: 1;
+            }
+        }
+        .status{
+            text-align: right;
+        }
+    }
+}
+.fix-bottom-wrap{
+    .btn{
+        width: 60%;
+        text-align: center;
+        line-height: 64rpx;
+        height: 64rpx;
+        color: #fff;
+        background-color: #5890fb;
+        border-radius: 50rpx;
+        margin-left: auto;
+        margin-right: auto;
+    }
+}
+</style>

+ 33 - 0
pages-businessTrip/calendar/index.vue

@@ -0,0 +1,33 @@
+<template>
+    <web-view :src="url"></web-view>
+      
+      
+</template>
+
+<script>
+import { linkRoadshowUrl } from '@/utils/config.js';
+export default {
+    data() {
+        return {
+            url:''
+        }
+    },
+    onLoad(){
+        const queryObj={
+            IsBusinessTrip:this.$store.state.userInfo.IsBusinessTrip||false,
+            token:uni.getStorageSync("token")||'',
+            timestamp:new Date().getTime(),//防止缓存
+        }
+        let queryObjStr=''
+        for (const key in queryObj) {
+            if(!queryObjStr){
+                    queryObjStr=`${key}=${queryObj[key]}`
+            }else{
+                queryObjStr=`${queryObjStr}&${key}=${queryObj[key]}`
+            }
+        }
+        console.log('拼接字符串:',queryObjStr);
+        this.url=`${linkRoadshowUrl}/businesstrip/calendar?${queryObjStr}#wechat_redirect`
+    }
+}
+</script>

+ 69 - 15
pages-todomessages/list/list.vue

@@ -39,7 +39,20 @@
 						<image src="@/static/icon-look.png" mode="aspectFill" class="new-status" v-if="item.ApprovalStatus === 1"></image>
                      </template>
                   </template>
-                  
+
+				  <!-- 出差申请 -->
+                  <template v-else-if="type === 10">
+					<view class="businessTrip-type">出差申请</view>
+					<view class="info">目的地: {{item.BusinessTripInfo.Province}}{{item.BusinessTripInfo.City}}</view>
+					<view class="info">出差事由: {{item.BusinessTripInfo.Reason}}</view>
+					<template v-if="item.BusinessTripInfo">
+						<view class="info" v-if="item.BusinessTripInfo.Status==='待审批'">提交时间:{{item.BusinessTripInfo.CreateTime|formatTime}}</view>
+                    	<view class="info" v-else>审批时间:{{item.BusinessTripInfo.ApproveTime|formatTime}}</view>
+					</template>
+					<image :src="item.statusImg" mode="aspectFill" class="status-img"></image>
+				  </template>
+
+
                   <template v-else> 
                      <view class="type">{{item.ApprovalInfo.Type}}</view>
                      <view class="title">{{item.CompanyName}}</view>
@@ -79,7 +92,7 @@
 			return {
 				scrollViewId:'',
 
-				type: null, //类型对应的数字: 1客户(custome)、2合同(contract)、3用印(seal) 5问答 6问答评论
+				type: null, //类型对应的数字: 1客户(custome)、2合同(contract)、3用印(seal) 5问答 6问答评论 10 出差申请
 				typeName:null,//类型对应的英文 客户(custome)、合同(contract)、用印(seal) question questionComment
 				page: 1, //页码
 				list: [],
@@ -120,6 +133,7 @@
 				'seal': `/pages-approve/seal/detail?ContractApprovalId=0&ContractApprovalRecordId=${e.CompanyApprovalId}`,
 				'question':`/pages-question/detail/index?type=question&id=${e.CompanyApprovalId}`,
 				'questionComment':`/pages-question/detail/index?type=comment&id=${e.CompanyApprovalId}`,
+				'businessTrip':'/pages-approve/businessTrip/detail?id='+e.CompanyApprovalId,
 				}
 
 				// 如果是questionComment 则如果是视频则跳转到视频
@@ -143,20 +157,39 @@
 					}else{
 						let arr=res.data.List.map(item=>{
 							let statusImg='',statusName='';
-							switch(item.ApprovalStatus){
-								case 1:
-									statusImg=require('../static/icon-2.png')
-									statusName='待审批'
-									break;
-								case 2:
-									statusImg=require('../static/icon-3.png')
-									statusName='已审批'
-									break;
-								case 3:
-									statusImg=require('../static/icon-4.png')
-									statusName='已驳回'
-									break
+							if(item.SourceType==10&&item.BusinessTripInfo){
+								switch(item.BusinessTripInfo.Status){
+									case '待审批':
+										statusImg=require('../static/icon-2.png')
+										statusName='待审批'
+										break;
+									case '已审批':
+										statusImg=require('../static/icon-3.png')
+										statusName='已审批'
+										break;
+									case '已驳回':
+										statusImg=require('../static/icon-4.png')
+										statusName='已驳回'
+										break
+								}
+							}else{
+								switch(item.ApprovalStatus){
+									case 1:
+										statusImg=require('../static/icon-2.png')
+										statusName='待审批'
+										break;
+									case 2:
+										statusImg=require('../static/icon-3.png')
+										statusName='已审批'
+										break;
+									case 3:
+										statusImg=require('../static/icon-4.png')
+										statusName='已驳回'
+										break
+								}
 							}
+							
+
                      
 
 							// 处理消息时间
@@ -244,6 +277,12 @@
 						_this.typeName='questionComment'
 						_this.avatar=require('../../static/icon-comment.png')
 						break;
+					case '10':
+						navBarTitle = '出差审批'
+						_this.type = 10
+						_this.typeName='businessTrip'
+						_this.avatar=require('../../static/icon-2.png')
+						break;
 				}
 				uni.setNavigationBarTitle({
 					title: navBarTitle
@@ -305,6 +344,21 @@
 					top: 4rpx;
 				}
 			}
+			.businessTrip-type{
+				color: #3385FF;
+				font-size: 32rpx;
+				&::before{
+					content: '';
+					display: inline-block;
+					width: 32rpx;
+					height: 22rpx;
+					background-image: url(../static/icon-7.png);
+					background-size: cover;
+					margin-right: 20rpx;
+					position: relative;
+					top: 4rpx;
+				}
+			}
 			.title{
 				font-size: 16px;
 				font-weight: bold;

BIN
pages-todomessages/static/icon-7.png


+ 46 - 1
pages.json

@@ -145,6 +145,31 @@
           "style": {
             "navigationBarTitleText": "拒绝理由"
           }
+        },
+        {
+            "path": "businessTrip/list",
+            "style": {
+              "navigationBarTitleText": "出差审批",
+              "enablePullDownRefresh": true
+            }
+        },
+        {
+            "path": "businessTrip/detail",
+            "style": {
+              "navigationBarTitleText": "审批详情"
+            }
+        },
+        {
+            "path": "businessTrip/add",
+            "style": {
+              "navigationBarTitleText": "添加申请"
+            }
+        },
+        {
+          "path": "businessTrip/reason",
+          "style": {
+            "navigationBarTitleText": "拒绝理由"
+          }
         }
       ]
     },
@@ -206,6 +231,25 @@
             }
          }
       ]
+    },
+    {
+      "root": "pages-businessTrip",//出差管理
+      "pages": [
+          {
+            "path": "calendar/index",
+            "style": {
+              "navigationBarTitleText": "出差日历"
+            }
+          },
+          {
+            "path": "apply/list",
+            "style": {
+              "navigationBarTitleText": "出差申请",
+              "enablePullDownRefresh": true
+            }
+          }
+
+      ]
     }
   ],
   "globalStyle": {
@@ -232,7 +276,8 @@
       "van-datetime-picker": "/wxcomponents/vant/datetime-picker/index",
       "van-tree-select": "/wxcomponents/vant/tree-select/index",
       "van-icon": "/wxcomponents/vant/icon/index",
-      "van-area": "/wxcomponents/vant/area/index"
+      "van-area": "/wxcomponents/vant/area/index",
+      "van-cascader": "/wxcomponents/vant/cascader/index"
     }
   },
   "tabBar": {

+ 1 - 0
pages/index/index.vue

@@ -55,6 +55,7 @@
                   3: require('../../static/icon-3.png'),
                   5: require('../../static/icon-question.png'),
                   6: require('../../static/icon-comment.png'),
+				  10:require('../../static/icon-7.png'),
                }
 					this.list=res.data&&res.data.map(item=>{
 						let img=imgMap[item.SourceType]

+ 26 - 0
pages/workbench/index.vue

@@ -71,6 +71,26 @@
 							}
 						]
 					},
+					{
+						label: '出差管理',
+						child: [
+							{
+								label: '出差日历',
+								url: '/pages-businessTrip/calendar/index',
+								img: require('@/static/icon-businesstrip-calendar.png')
+							},
+							{
+								label: '出差申请',
+								url: '/pages-businessTrip/apply/list',
+								img: require('@/static/icon-businesstrip-apply.png')
+							},
+							{
+								label: '出差审批',
+								url: '/pages-approve/businessTrip/list',
+								img: require('@/static/icon-businesstrip-approve.png')
+							},
+						]
+					},
 					{
 						label: '视频',
 						child: [
@@ -102,6 +122,12 @@
          init() {
             const userInfo = this.$store.state.userInfo;
             this.my_tabs =  !['ficc_admin','admin'].includes(userInfo.RoleTypeCode) ? this.tabs.filter(_ => _.label !== '问答社区') : this.tabs;
+			if(!userInfo.IsBusinessTrip){//删除出差审批
+				this.my_tabs=this.my_tabs.map(item=>{
+					item.child=item.child.filter(_=>_.label!=='出差审批')
+					return item
+				})
+			}
          }
 		},
 	}

BIN
static/icon-7.png


BIN
static/icon-businesstrip-apply.png


BIN
static/icon-businesstrip-approve.png


BIN
static/icon-businesstrip-calendar.png


+ 409 - 0
utils/area.js

@@ -0,0 +1,409 @@
+export const areaList = {
+  province_list: {
+    110000: '北京市',
+    120000: '天津市',
+    130000: '河北省',
+    140000: '山西省',
+    150000: '内蒙古自治区',
+    210000: '辽宁省',
+    220000: '吉林省',
+    230000: '黑龙江省',
+    310000: '上海市',
+    320000: '江苏省',
+    330000: '浙江省',
+    340000: '安徽省',
+    350000: '福建省',
+    360000: '江西省',
+    370000: '山东省',
+    410000: '河南省',
+    420000: '湖北省',
+    430000: '湖南省',
+    440000: '广东省',
+    450000: '广西壮族自治区',
+    460000: '海南省',
+    500000: '重庆市',
+    510000: '四川省',
+    520000: '贵州省',
+    530000: '云南省',
+    540000: '西藏自治区',
+    610000: '陕西省',
+    620000: '甘肃省',
+    630000: '青海省',
+    640000: '宁夏回族自治区',
+    650000: '新疆维吾尔自治区',
+    710000: '台湾省',
+    810000: '香港特别行政区',
+    820000: '澳门特别行政区',
+  },
+  city_list: {
+    110100: '北京市',
+    120100: '天津市',
+    130100: '石家庄市',
+    130200: '唐山市',
+    130300: '秦皇岛市',
+    130400: '邯郸市',
+    130500: '邢台市',
+    130600: '保定市',
+    130700: '张家口市',
+    130800: '承德市',
+    130900: '沧州市',
+    131000: '廊坊市',
+    131100: '衡水市',
+    140100: '太原市',
+    140200: '大同市',
+    140300: '阳泉市',
+    140400: '长治市',
+    140500: '晋城市',
+    140600: '朔州市',
+    140700: '晋中市',
+    140800: '运城市',
+    140900: '忻州市',
+    141000: '临汾市',
+    141100: '吕梁市',
+    150100: '呼和浩特市',
+    150200: '包头市',
+    150300: '乌海市',
+    150400: '赤峰市',
+    150500: '通辽市',
+    150600: '鄂尔多斯市',
+    150700: '呼伦贝尔市',
+    150800: '巴彦淖尔市',
+    150900: '乌兰察布市',
+    152200: '兴安盟',
+    152500: '锡林郭勒盟',
+    152900: '阿拉善盟',
+    210100: '沈阳市',
+    210200: '大连市',
+    210300: '鞍山市',
+    210400: '抚顺市',
+    210500: '本溪市',
+    210600: '丹东市',
+    210700: '锦州市',
+    210800: '营口市',
+    210900: '阜新市',
+    211000: '辽阳市',
+    211100: '盘锦市',
+    211200: '铁岭市',
+    211300: '朝阳市',
+    211400: '葫芦岛市',
+    220100: '长春市',
+    220200: '吉林市',
+    220300: '四平市',
+    220400: '辽源市',
+    220500: '通化市',
+    220600: '白山市',
+    220700: '松原市',
+    220800: '白城市',
+    222400: '延边朝鲜族自治州',
+    230100: '哈尔滨市',
+    230200: '齐齐哈尔市',
+    230300: '鸡西市',
+    230400: '鹤岗市',
+    230500: '双鸭山市',
+    230600: '大庆市',
+    230700: '伊春市',
+    230800: '佳木斯市',
+    230900: '七台河市',
+    231000: '牡丹江市',
+    231100: '黑河市',
+    231200: '绥化市',
+    232700: '大兴安岭地区',
+    310100: '上海市',
+    320100: '南京市',
+    320200: '无锡市',
+    320300: '徐州市',
+    320400: '常州市',
+    320500: '苏州市',
+    320600: '南通市',
+    320700: '连云港市',
+    320800: '淮安市',
+    320900: '盐城市',
+    321000: '扬州市',
+    321100: '镇江市',
+    321200: '泰州市',
+    321300: '宿迁市',
+    330100: '杭州市',
+    330200: '宁波市',
+    330300: '温州市',
+    330400: '嘉兴市',
+    330500: '湖州市',
+    330600: '绍兴市',
+    330700: '金华市',
+    330800: '衢州市',
+    330900: '舟山市',
+    331000: '台州市',
+    331100: '丽水市',
+    340100: '合肥市',
+    340200: '芜湖市',
+    340300: '蚌埠市',
+    340400: '淮南市',
+    340500: '马鞍山市',
+    340600: '淮北市',
+    340700: '铜陵市',
+    340800: '安庆市',
+    341000: '黄山市',
+    341100: '滁州市',
+    341200: '阜阳市',
+    341300: '宿州市',
+    341500: '六安市',
+    341600: '亳州市',
+    341700: '池州市',
+    341800: '宣城市',
+    350100: '福州市',
+    350200: '厦门市',
+    350300: '莆田市',
+    350400: '三明市',
+    350500: '泉州市',
+    350600: '漳州市',
+    350700: '南平市',
+    350800: '龙岩市',
+    350900: '宁德市',
+    360100: '南昌市',
+    360200: '景德镇市',
+    360300: '萍乡市',
+    360400: '九江市',
+    360500: '新余市',
+    360600: '鹰潭市',
+    360700: '赣州市',
+    360800: '吉安市',
+    360900: '宜春市',
+    361000: '抚州市',
+    361100: '上饶市',
+    370100: '济南市',
+    370200: '青岛市',
+    370300: '淄博市',
+    370400: '枣庄市',
+    370500: '东营市',
+    370600: '烟台市',
+    370700: '潍坊市',
+    370800: '济宁市',
+    370900: '泰安市',
+    371000: '威海市',
+    371100: '日照市',
+    371300: '临沂市',
+    371400: '德州市',
+    371500: '聊城市',
+    371600: '滨州市',
+    371700: '菏泽市',
+    410100: '郑州市',
+    410200: '开封市',
+    410300: '洛阳市',
+    410400: '平顶山市',
+    410500: '安阳市',
+    410600: '鹤壁市',
+    410700: '新乡市',
+    410800: '焦作市',
+    410900: '濮阳市',
+    411000: '许昌市',
+    411100: '漯河市',
+    411200: '三门峡市',
+    411300: '南阳市',
+    411400: '商丘市',
+    411500: '信阳市',
+    411600: '周口市',
+    411700: '驻马店市',
+    419000: '省直辖县',
+    420100: '武汉市',
+    420200: '黄石市',
+    420300: '十堰市',
+    420500: '宜昌市',
+    420600: '襄阳市',
+    420700: '鄂州市',
+    420800: '荆门市',
+    420900: '孝感市',
+    421000: '荆州市',
+    421100: '黄冈市',
+    421200: '咸宁市',
+    421300: '随州市',
+    422800: '恩施土家族苗族自治州',
+    429000: '省直辖县',
+    430100: '长沙市',
+    430200: '株洲市',
+    430300: '湘潭市',
+    430400: '衡阳市',
+    430500: '邵阳市',
+    430600: '岳阳市',
+    430700: '常德市',
+    430800: '张家界市',
+    430900: '益阳市',
+    431000: '郴州市',
+    431100: '永州市',
+    431200: '怀化市',
+    431300: '娄底市',
+    433100: '湘西土家族苗族自治州',
+    440100: '广州市',
+    440200: '韶关市',
+    440300: '深圳市',
+    440400: '珠海市',
+    440500: '汕头市',
+    440600: '佛山市',
+    440700: '江门市',
+    440800: '湛江市',
+    440900: '茂名市',
+    441200: '肇庆市',
+    441300: '惠州市',
+    441400: '梅州市',
+    441500: '汕尾市',
+    441600: '河源市',
+    441700: '阳江市',
+    441800: '清远市',
+    441900: '东莞市',
+    442000: '中山市',
+    445100: '潮州市',
+    445200: '揭阳市',
+    445300: '云浮市',
+    450100: '南宁市',
+    450200: '柳州市',
+    450300: '桂林市',
+    450400: '梧州市',
+    450500: '北海市',
+    450600: '防城港市',
+    450700: '钦州市',
+    450800: '贵港市',
+    450900: '玉林市',
+    451000: '百色市',
+    451100: '贺州市',
+    451200: '河池市',
+    451300: '来宾市',
+    451400: '崇左市',
+    460100: '海口市',
+    460200: '三亚市',
+    460300: '三沙市',
+    460400: '儋州市',
+    469000: '省直辖县',
+    500100: '重庆市',
+    500200: '县',
+    510100: '成都市',
+    510300: '自贡市',
+    510400: '攀枝花市',
+    510500: '泸州市',
+    510600: '德阳市',
+    510700: '绵阳市',
+    510800: '广元市',
+    510900: '遂宁市',
+    511000: '内江市',
+    511100: '乐山市',
+    511300: '南充市',
+    511400: '眉山市',
+    511500: '宜宾市',
+    511600: '广安市',
+    511700: '达州市',
+    511800: '雅安市',
+    511900: '巴中市',
+    512000: '资阳市',
+    513200: '阿坝藏族羌族自治州',
+    513300: '甘孜藏族自治州',
+    513400: '凉山彝族自治州',
+    520100: '贵阳市',
+    520200: '六盘水市',
+    520300: '遵义市',
+    520400: '安顺市',
+    520500: '毕节市',
+    520600: '铜仁市',
+    522300: '黔西南布依族苗族自治州',
+    522600: '黔东南苗族侗族自治州',
+    522700: '黔南布依族苗族自治州',
+    530100: '昆明市',
+    530300: '曲靖市',
+    530400: '玉溪市',
+    530500: '保山市',
+    530600: '昭通市',
+    530700: '丽江市',
+    530800: '普洱市',
+    530900: '临沧市',
+    532300: '楚雄彝族自治州',
+    532500: '红河哈尼族彝族自治州',
+    532600: '文山壮族苗族自治州',
+    532800: '西双版纳傣族自治州',
+    532900: '大理白族自治州',
+    533100: '德宏傣族景颇族自治州',
+    533300: '怒江傈僳族自治州',
+    533400: '迪庆藏族自治州',
+    540100: '拉萨市',
+    540200: '日喀则市',
+    540300: '昌都市',
+    540400: '林芝市',
+    540500: '山南市',
+    540600: '那曲市',
+    542500: '阿里地区',
+    610100: '西安市',
+    610200: '铜川市',
+    610300: '宝鸡市',
+    610400: '咸阳市',
+    610500: '渭南市',
+    610600: '延安市',
+    610700: '汉中市',
+    610800: '榆林市',
+    610900: '安康市',
+    611000: '商洛市',
+    620100: '兰州市',
+    620200: '嘉峪关市',
+    620300: '金昌市',
+    620400: '白银市',
+    620500: '天水市',
+    620600: '武威市',
+    620700: '张掖市',
+    620800: '平凉市',
+    620900: '酒泉市',
+    621000: '庆阳市',
+    621100: '定西市',
+    621200: '陇南市',
+    622900: '临夏回族自治州',
+    623000: '甘南藏族自治州',
+    630100: '西宁市',
+    630200: '海东市',
+    632200: '海北藏族自治州',
+    632300: '黄南藏族自治州',
+    632500: '海南藏族自治州',
+    632600: '果洛藏族自治州',
+    632700: '玉树藏族自治州',
+    632800: '海西蒙古族藏族自治州',
+    640100: '银川市',
+    640200: '石嘴山市',
+    640300: '吴忠市',
+    640400: '固原市',
+    640500: '中卫市',
+    650100: '乌鲁木齐市',
+    650200: '克拉玛依市',
+    650400: '吐鲁番市',
+    650500: '哈密市',
+    652300: '昌吉回族自治州',
+    652700: '博尔塔拉蒙古自治州',
+    652800: '巴音郭楞蒙古自治州',
+    652900: '阿克苏地区',
+    653000: '克孜勒苏柯尔克孜自治州',
+    653100: '喀什地区',
+    653200: '和田地区',
+    654000: '伊犁哈萨克自治州',
+    654200: '塔城地区',
+    654300: '阿勒泰地区',
+    659000: '自治区直辖县级行政区划',
+    710100: '台北市',
+    710200: '高雄市',
+    710300: '台南市',
+    710400: '台中市',
+    710500: '金门县',
+    710600: '南投县',
+    710700: '基隆市',
+    710800: '新竹市',
+    710900: '嘉义市',
+    711100: '新北市',
+    711200: '宜兰县',
+    711300: '新竹县',
+    711400: '桃园市',
+    711500: '苗栗县',
+    711700: '彰化县',
+    711900: '嘉义县',
+    712100: '云林县',
+    712400: '屏东县',
+    712500: '台东县',
+    712600: '花莲县',
+    712700: '澎湖县',
+    712800: '连江县',
+    810100: '香港岛',
+    810200: '九龙',
+    810300: '新界',
+    820100: '澳门半岛',
+    820200: '离岛',
+  }
+};

+ 65 - 64
wxcomponents/vant/action-sheet/index.js

@@ -1,70 +1,71 @@
 import { VantComponent } from '../common/component';
 import { button } from '../mixins/button';
 VantComponent({
-  mixins: [button],
-  props: {
-    show: Boolean,
-    title: String,
-    cancelText: String,
-    description: String,
-    round: {
-      type: Boolean,
-      value: true,
+    classes: ['list-class'],
+    mixins: [button],
+    props: {
+        show: Boolean,
+        title: String,
+        cancelText: String,
+        description: String,
+        round: {
+            type: Boolean,
+            value: true,
+        },
+        zIndex: {
+            type: Number,
+            value: 100,
+        },
+        actions: {
+            type: Array,
+            value: [],
+        },
+        overlay: {
+            type: Boolean,
+            value: true,
+        },
+        closeOnClickOverlay: {
+            type: Boolean,
+            value: true,
+        },
+        closeOnClickAction: {
+            type: Boolean,
+            value: true,
+        },
+        safeAreaInsetBottom: {
+            type: Boolean,
+            value: true,
+        },
     },
-    zIndex: {
-      type: Number,
-      value: 100,
+    methods: {
+        onSelect(event) {
+            const { index } = event.currentTarget.dataset;
+            const { actions, closeOnClickAction, canIUseGetUserProfile } = this.data;
+            const item = actions[index];
+            if (item) {
+                this.$emit('select', item);
+                if (closeOnClickAction) {
+                    this.onClose();
+                }
+                if (item.openType === 'getUserInfo' && canIUseGetUserProfile) {
+                    wx.getUserProfile({
+                        desc: item.getUserProfileDesc || '  ',
+                        complete: (userProfile) => {
+                            this.$emit('getuserinfo', userProfile);
+                        },
+                    });
+                }
+            }
+        },
+        onCancel() {
+            this.$emit('cancel');
+        },
+        onClose() {
+            this.$emit('close');
+        },
+        onClickOverlay() {
+            this.$emit('click-overlay');
+            this.onClose();
+        },
     },
-    actions: {
-      type: Array,
-      value: [],
-    },
-    overlay: {
-      type: Boolean,
-      value: true,
-    },
-    closeOnClickOverlay: {
-      type: Boolean,
-      value: true,
-    },
-    closeOnClickAction: {
-      type: Boolean,
-      value: true,
-    },
-    safeAreaInsetBottom: {
-      type: Boolean,
-      value: true,
-    },
-  },
-  methods: {
-    onSelect(event) {
-      const { index } = event.currentTarget.dataset;
-      const { actions, closeOnClickAction, canIUseGetUserProfile } = this.data;
-      const item = actions[index];
-      if (item) {
-        this.$emit('select', item);
-        if (closeOnClickAction) {
-          this.onClose();
-        }
-        if (item.openType === 'getUserInfo' && canIUseGetUserProfile) {
-          wx.getUserProfile({
-            desc: item.getUserProfileDesc || '  ',
-            complete: (userProfile) => {
-              this.$emit('getuserinfo', userProfile);
-            },
-          });
-        }
-      }
-    },
-    onCancel() {
-      this.$emit('cancel');
-    },
-    onClose() {
-      this.$emit('close');
-    },
-    onClickOverlay() {
-      this.$emit('click-overlay');
-      this.onClose();
-    },
-  },
 });

+ 2 - 2
wxcomponents/vant/action-sheet/index.wxml

@@ -6,7 +6,7 @@
   round="{{ round }}"
   z-index="{{ zIndex }}"
   overlay="{{ overlay }}"
-  custom-class="van-action-sheet"
+  custom-class="van-action-sheet custom-class"
   safe-area-inset-bottom="{{ safeAreaInsetBottom }}"
   close-on-click-overlay="{{ closeOnClickOverlay }}"
   bind:close="onClickOverlay"
@@ -22,7 +22,7 @@
   <view wx:if="{{ description }}" class="van-action-sheet__description van-hairline--bottom">
     {{ description }}
   </view>
-  <view wx:if="{{ actions && actions.length }}">
+  <view wx:if="{{ actions && actions.length }}" class="list-class">
     <!-- button外包一层view,防止actions动态变化,导致渲染时button被打散 -->
     <button
       wx:for="{{ actions }}"

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
wxcomponents/vant/action-sheet/index.wxss


+ 210 - 225
wxcomponents/vant/area/index.js

@@ -3,233 +3,218 @@ import { pickerProps } from '../picker/shared';
 import { requestAnimationFrame } from '../common/utils';
 const EMPTY_CODE = '000000';
 VantComponent({
-  classes: ['active-class', 'toolbar-class', 'column-class'],
-  props: Object.assign(Object.assign({}, pickerProps), {
-    value: {
-      type: String,
-      observer(value) {
-        this.code = value;
-        this.setValues();
-      },
-    },
-    areaList: {
-      type: Object,
-      value: {},
-      observer: 'setValues',
-    },
-    columnsNum: {
-      type: null,
-      value: 3,
-    },
-    columnsPlaceholder: {
-      type: Array,
-      observer(val) {
-        this.setData({
-          typeToColumnsPlaceholder: {
-            province: val[0] || '',
-            city: val[1] || '',
-            county: val[2] || '',
-          },
+    classes: ['active-class', 'toolbar-class', 'column-class'],
+    props: Object.assign(Object.assign({}, pickerProps), { showToolbar: {
+            type: Boolean,
+            value: true,
+        }, value: {
+            type: String,
+            observer(value) {
+                this.code = value;
+                this.setValues();
+            },
+        }, areaList: {
+            type: Object,
+            value: {},
+            observer: 'setValues',
+        }, columnsNum: {
+            type: null,
+            value: 3,
+        }, columnsPlaceholder: {
+            type: Array,
+            observer(val) {
+                this.setData({
+                    typeToColumnsPlaceholder: {
+                        province: val[0] || '',
+                        city: val[1] || '',
+                        county: val[2] || '',
+                    },
+                });
+            },
+        } }),
+    data: {
+        columns: [{ values: [] }, { values: [] }, { values: [] }],
+        typeToColumnsPlaceholder: {},
+    },
+    mounted() {
+        requestAnimationFrame(() => {
+            this.setValues();
         });
-      },
-    },
-  }),
-  data: {
-    columns: [{ values: [] }, { values: [] }, { values: [] }],
-    typeToColumnsPlaceholder: {},
-  },
-  mounted() {
-    requestAnimationFrame(() => {
-      this.setValues();
-    });
-  },
-  methods: {
-    getPicker() {
-      if (this.picker == null) {
-        this.picker = this.selectComponent('.van-area__picker');
-      }
-      return this.picker;
-    },
-    onCancel(event) {
-      this.emit('cancel', event.detail);
     },
-    onConfirm(event) {
-      const { index } = event.detail;
-      let { value } = event.detail;
-      value = this.parseValues(value);
-      this.emit('confirm', { value, index });
-    },
-    emit(type, detail) {
-      detail.values = detail.value;
-      delete detail.value;
-      this.$emit(type, detail);
-    },
-    parseValues(values) {
-      const { columnsPlaceholder } = this.data;
-      return values.map((value, index) => {
-        if (
-          value &&
-          (!value.code || value.name === columnsPlaceholder[index])
-        ) {
-          return Object.assign(Object.assign({}, value), {
-            code: '',
-            name: '',
-          });
-        }
-        return value;
-      });
-    },
-    onChange(event) {
-      var _a;
-      const { index, picker, value } = event.detail;
-      this.code = value[index].code;
-      (_a = this.setValues()) === null || _a === void 0
-        ? void 0
-        : _a.then(() => {
-            this.$emit('change', {
-              picker,
-              values: this.parseValues(picker.getValues()),
-              index,
+    methods: {
+        getPicker() {
+            if (this.picker == null) {
+                this.picker = this.selectComponent('.van-area__picker');
+            }
+            return this.picker;
+        },
+        onCancel(event) {
+            this.emit('cancel', event.detail);
+        },
+        onConfirm(event) {
+            const { index } = event.detail;
+            let { value } = event.detail;
+            value = this.parseValues(value);
+            this.emit('confirm', { value, index });
+        },
+        emit(type, detail) {
+            detail.values = detail.value;
+            delete detail.value;
+            this.$emit(type, detail);
+        },
+        parseValues(values) {
+            const { columnsPlaceholder } = this.data;
+            return values.map((value, index) => {
+                if (value &&
+                    (!value.code || value.name === columnsPlaceholder[index])) {
+                    return Object.assign(Object.assign({}, value), { code: '', name: '' });
+                }
+                return value;
             });
-          });
-    },
-    getConfig(type) {
-      const { areaList } = this.data;
-      return (areaList && areaList[`${type}_list`]) || {};
-    },
-    getList(type, code) {
-      if (type !== 'province' && !code) {
-        return [];
-      }
-      const { typeToColumnsPlaceholder } = this.data;
-      const list = this.getConfig(type);
-      let result = Object.keys(list).map((code) => ({
-        code,
-        name: list[code],
-      }));
-      if (code != null) {
-        // oversea code
-        if (code[0] === '9' && type === 'city') {
-          code = '9';
-        }
-        result = result.filter((item) => item.code.indexOf(code) === 0);
-      }
-      if (typeToColumnsPlaceholder[type] && result.length) {
-        // set columns placeholder
-        const codeFill =
-          type === 'province'
-            ? ''
-            : type === 'city'
-            ? EMPTY_CODE.slice(2, 4)
-            : EMPTY_CODE.slice(4, 6);
-        result.unshift({
-          code: `${code}${codeFill}`,
-          name: typeToColumnsPlaceholder[type],
-        });
-      }
-      return result;
-    },
-    getIndex(type, code) {
-      let compareNum = type === 'province' ? 2 : type === 'city' ? 4 : 6;
-      const list = this.getList(type, code.slice(0, compareNum - 2));
-      // oversea code
-      if (code[0] === '9' && type === 'province') {
-        compareNum = 1;
-      }
-      code = code.slice(0, compareNum);
-      for (let i = 0; i < list.length; i++) {
-        if (list[i].code.slice(0, compareNum) === code) {
-          return i;
-        }
-      }
-      return 0;
-    },
-    setValues() {
-      const picker = this.getPicker();
-      if (!picker) {
-        return;
-      }
-      let code = this.code || this.getDefaultCode();
-      const provinceList = this.getList('province');
-      const cityList = this.getList('city', code.slice(0, 2));
-      const stack = [];
-      const indexes = [];
-      const { columnsNum } = this.data;
-      if (columnsNum >= 1) {
-        stack.push(picker.setColumnValues(0, provinceList, false));
-        indexes.push(this.getIndex('province', code));
-      }
-      if (columnsNum >= 2) {
-        stack.push(picker.setColumnValues(1, cityList, false));
-        indexes.push(this.getIndex('city', code));
-        if (cityList.length && code.slice(2, 4) === '00') {
-          [{ code }] = cityList;
-        }
-      }
-      if (columnsNum === 3) {
-        stack.push(
-          picker.setColumnValues(
-            2,
-            this.getList('county', code.slice(0, 4)),
-            false
-          )
-        );
-        indexes.push(this.getIndex('county', code));
-      }
-      return Promise.all(stack)
-        .catch(() => {})
-        .then(() => picker.setIndexes(indexes))
-        .catch(() => {});
-    },
-    getDefaultCode() {
-      const { columnsPlaceholder } = this.data;
-      if (columnsPlaceholder.length) {
-        return EMPTY_CODE;
-      }
-      const countyCodes = Object.keys(this.getConfig('county'));
-      if (countyCodes[0]) {
-        return countyCodes[0];
-      }
-      const cityCodes = Object.keys(this.getConfig('city'));
-      if (cityCodes[0]) {
-        return cityCodes[0];
-      }
-      return '';
-    },
-    getValues() {
-      const picker = this.getPicker();
-      if (!picker) {
-        return [];
-      }
-      return this.parseValues(picker.getValues().filter((value) => !!value));
-    },
-    getDetail() {
-      const values = this.getValues();
-      const area = {
-        code: '',
-        country: '',
-        province: '',
-        city: '',
-        county: '',
-      };
-      if (!values.length) {
-        return area;
-      }
-      const names = values.map((item) => item.name);
-      area.code = values[values.length - 1].code;
-      if (area.code[0] === '9') {
-        area.country = names[1] || '';
-        area.province = names[2] || '';
-      } else {
-        area.province = names[0] || '';
-        area.city = names[1] || '';
-        area.county = names[2] || '';
-      }
-      return area;
-    },
-    reset(code) {
-      this.code = code || '';
-      return this.setValues();
+        },
+        onChange(event) {
+            var _a;
+            const { index, picker, value } = event.detail;
+            this.code = value[index].code;
+            (_a = this.setValues()) === null || _a === void 0 ? void 0 : _a.then(() => {
+                this.$emit('change', {
+                    picker,
+                    values: this.parseValues(picker.getValues()),
+                    index,
+                });
+            });
+        },
+        getConfig(type) {
+            const { areaList } = this.data;
+            return (areaList && areaList[`${type}_list`]) || {};
+        },
+        getList(type, code) {
+            if (type !== 'province' && !code) {
+                return [];
+            }
+            const { typeToColumnsPlaceholder } = this.data;
+            const list = this.getConfig(type);
+            let result = Object.keys(list).map((code) => ({
+                code,
+                name: list[code],
+            }));
+            if (code != null) {
+                // oversea code
+                if (code[0] === '9' && type === 'city') {
+                    code = '9';
+                }
+                result = result.filter((item) => item.code.indexOf(code) === 0);
+            }
+            if (typeToColumnsPlaceholder[type] && result.length) {
+                // set columns placeholder
+                const codeFill = type === 'province'
+                    ? ''
+                    : type === 'city'
+                        ? EMPTY_CODE.slice(2, 4)
+                        : EMPTY_CODE.slice(4, 6);
+                result.unshift({
+                    code: `${code}${codeFill}`,
+                    name: typeToColumnsPlaceholder[type],
+                });
+            }
+            return result;
+        },
+        getIndex(type, code) {
+            let compareNum = type === 'province' ? 2 : type === 'city' ? 4 : 6;
+            const list = this.getList(type, code.slice(0, compareNum - 2));
+            // oversea code
+            if (code[0] === '9' && type === 'province') {
+                compareNum = 1;
+            }
+            code = code.slice(0, compareNum);
+            for (let i = 0; i < list.length; i++) {
+                if (list[i].code.slice(0, compareNum) === code) {
+                    return i;
+                }
+            }
+            return 0;
+        },
+        setValues() {
+            const picker = this.getPicker();
+            if (!picker) {
+                return;
+            }
+            let code = this.code || this.getDefaultCode();
+            const provinceList = this.getList('province');
+            const cityList = this.getList('city', code.slice(0, 2));
+            const stack = [];
+            const indexes = [];
+            const { columnsNum } = this.data;
+            if (columnsNum >= 1) {
+                stack.push(picker.setColumnValues(0, provinceList, false));
+                indexes.push(this.getIndex('province', code));
+            }
+            if (columnsNum >= 2) {
+                stack.push(picker.setColumnValues(1, cityList, false));
+                indexes.push(this.getIndex('city', code));
+                if (cityList.length && code.slice(2, 4) === '00') {
+                    [{ code }] = cityList;
+                }
+            }
+            if (columnsNum === 3) {
+                stack.push(picker.setColumnValues(2, this.getList('county', code.slice(0, 4)), false));
+                indexes.push(this.getIndex('county', code));
+            }
+            return Promise.all(stack)
+                .catch(() => { })
+                .then(() => picker.setIndexes(indexes))
+                .catch(() => { });
+        },
+        getDefaultCode() {
+            const { columnsPlaceholder } = this.data;
+            if (columnsPlaceholder.length) {
+                return EMPTY_CODE;
+            }
+            const countyCodes = Object.keys(this.getConfig('county'));
+            if (countyCodes[0]) {
+                return countyCodes[0];
+            }
+            const cityCodes = Object.keys(this.getConfig('city'));
+            if (cityCodes[0]) {
+                return cityCodes[0];
+            }
+            return '';
+        },
+        getValues() {
+            const picker = this.getPicker();
+            if (!picker) {
+                return [];
+            }
+            return this.parseValues(picker.getValues().filter((value) => !!value));
+        },
+        getDetail() {
+            const values = this.getValues();
+            const area = {
+                code: '',
+                country: '',
+                province: '',
+                city: '',
+                county: '',
+            };
+            if (!values.length) {
+                return area;
+            }
+            const names = values.map((item) => item.name);
+            area.code = values[values.length - 1].code;
+            if (area.code[0] === '9') {
+                area.country = names[1] || '';
+                area.province = names[2] || '';
+            }
+            else {
+                area.province = names[0] || '';
+                area.city = names[1] || '';
+                area.county = names[2] || '';
+            }
+            return area;
+        },
+        reset(code) {
+            this.code = code || '';
+            return this.setValues();
+        },
     },
-  },
 });

+ 1 - 1
wxcomponents/vant/area/index.wxml

@@ -5,7 +5,7 @@
   active-class="active-class"
   toolbar-class="toolbar-class"
   column-class="column-class"
-  show-toolbar
+  show-toolbar="{{ showToolbar }}"
   value-key="name"
   title="{{ title }}"
   loading="{{ loading }}"

+ 53 - 58
wxcomponents/vant/button/index.js

@@ -3,67 +3,62 @@ import { button } from '../mixins/button';
 import { canIUseFormFieldButton } from '../common/version';
 const mixins = [button];
 if (canIUseFormFieldButton()) {
-  mixins.push('wx://form-field-button');
+    mixins.push('wx://form-field-button');
 }
 VantComponent({
-  mixins,
-  classes: ['hover-class', 'loading-class'],
-  data: {
-    baseStyle: '',
-  },
-  props: {
-    formType: String,
-    icon: String,
-    classPrefix: {
-      type: String,
-      value: 'van-icon',
+    mixins,
+    classes: ['hover-class', 'loading-class'],
+    data: {
+        baseStyle: '',
     },
-    plain: Boolean,
-    block: Boolean,
-    round: Boolean,
-    square: Boolean,
-    loading: Boolean,
-    hairline: Boolean,
-    disabled: Boolean,
-    loadingText: String,
-    customStyle: String,
-    loadingType: {
-      type: String,
-      value: 'circular',
+    props: {
+        formType: String,
+        icon: String,
+        classPrefix: {
+            type: String,
+            value: 'van-icon',
+        },
+        plain: Boolean,
+        block: Boolean,
+        round: Boolean,
+        square: Boolean,
+        loading: Boolean,
+        hairline: Boolean,
+        disabled: Boolean,
+        loadingText: String,
+        customStyle: String,
+        loadingType: {
+            type: String,
+            value: 'circular',
+        },
+        type: {
+            type: String,
+            value: 'default',
+        },
+        dataset: null,
+        size: {
+            type: String,
+            value: 'normal',
+        },
+        loadingSize: {
+            type: String,
+            value: '20px',
+        },
+        color: String,
     },
-    type: {
-      type: String,
-      value: 'default',
+    methods: {
+        onClick(event) {
+            this.$emit('click', event);
+            const { canIUseGetUserProfile, openType, getUserProfileDesc, lang, } = this.data;
+            if (openType === 'getUserInfo' && canIUseGetUserProfile) {
+                wx.getUserProfile({
+                    desc: getUserProfileDesc || '  ',
+                    lang: lang || 'en',
+                    complete: (userProfile) => {
+                        this.$emit('getuserinfo', userProfile);
+                    },
+                });
+            }
+        },
     },
-    dataset: null,
-    size: {
-      type: String,
-      value: 'normal',
-    },
-    loadingSize: {
-      type: String,
-      value: '20px',
-    },
-    color: String,
-  },
-  methods: {
-    onClick(event) {
-      this.$emit('click', event);
-      const {
-        canIUseGetUserProfile,
-        openType,
-        getUserProfileDesc,
-        lang,
-      } = this.data;
-      if (openType === 'getUserInfo' && canIUseGetUserProfile) {
-        wx.getUserProfile({
-          desc: getUserProfileDesc || '  ',
-          lang: lang || 'en',
-          complete: (userProfile) => {
-            this.$emit('getuserinfo', userProfile);
-          },
-        });
-      }
-    },
-  },
 });

+ 2 - 1
wxcomponents/vant/button/index.wxml

@@ -5,7 +5,7 @@
   id="{{ id }}"
   data-detail="{{ dataset }}"
   class="custom-class {{ utils.bem('button', [type, size, { block, round, plain, square, loading, disabled, hairline, unclickable: disabled || loading }]) }} {{ hairline ? 'van-hairline--surround' : '' }}"
-  hover-class="van-button--active hover-class"
+  hover-class="{{ disabled || loading ? '' : 'van-button--active hover-class'}}"
   lang="{{ lang }}"
   form-type="{{ formType }}"
   style="{{ computed.rootStyle({ plain, color, customStyle }) }}"
@@ -25,6 +25,7 @@
   binderror="onError"
   bindlaunchapp="onLaunchApp"
   bindopensetting="onOpenSetting"
+  bindchooseavatar="onChooseAvatar"
 >
   <block wx:if="{{ loading }}">
     <van-loading

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
wxcomponents/vant/button/index.wxss


+ 3 - 2
wxcomponents/vant/calendar/calendar.wxml

@@ -5,6 +5,7 @@
     subtitle="{{ subtitle }}"
     showSubtitle="{{ showSubtitle }}"
     firstDayOfWeek="{{ firstDayOfWeek }}"
+    bind:click-subtitle="onClickSubtitle"
   >
     <slot name="title" slot="title"></slot>
   </header>
@@ -53,12 +54,12 @@
       type="danger"
       color="{{ color }}"
       custom-class="van-calendar__confirm"
-      disabled="{{ computed.getButtonDisabled(type, currentDate) }}"
+      disabled="{{ computed.getButtonDisabled(type, currentDate, minRange) }}"
       nativeType="text"
       bind:click="onConfirm"
     >
       {{
-        computed.getButtonDisabled(type, currentDate)
+        computed.getButtonDisabled(type, currentDate, minRange)
           ? confirmDisabledText
           : confirmText
       }}

+ 31 - 28
wxcomponents/vant/calendar/components/header/index.js

@@ -1,34 +1,37 @@
 import { VantComponent } from '../../../common/component';
 VantComponent({
-  props: {
-    title: {
-      type: String,
-      value: '日期选择',
+    props: {
+        title: {
+            type: String,
+            value: '日期选择',
+        },
+        subtitle: String,
+        showTitle: Boolean,
+        showSubtitle: Boolean,
+        firstDayOfWeek: {
+            type: Number,
+            observer: 'initWeekDay',
+        },
     },
-    subtitle: String,
-    showTitle: Boolean,
-    showSubtitle: Boolean,
-    firstDayOfWeek: {
-      type: Number,
-      observer: 'initWeekDay',
+    data: {
+        weekdays: [],
     },
-  },
-  data: {
-    weekdays: [],
-  },
-  created() {
-    this.initWeekDay();
-  },
-  methods: {
-    initWeekDay() {
-      const defaultWeeks = ['日', '一', '二', '三', '四', '五', '六'];
-      const firstDayOfWeek = this.data.firstDayOfWeek || 0;
-      this.setData({
-        weekdays: [
-          ...defaultWeeks.slice(firstDayOfWeek, 7),
-          ...defaultWeeks.slice(0, firstDayOfWeek),
-        ],
-      });
+    created() {
+        this.initWeekDay();
+    },
+    methods: {
+        initWeekDay() {
+            const defaultWeeks = ['日', '一', '二', '三', '四', '五', '六'];
+            const firstDayOfWeek = this.data.firstDayOfWeek || 0;
+            this.setData({
+                weekdays: [
+                    ...defaultWeeks.slice(firstDayOfWeek, 7),
+                    ...defaultWeeks.slice(0, firstDayOfWeek),
+                ],
+            });
+        },
+        onClickSubtitle(event) {
+            this.$emit('click-subtitle', event);
+        },
     },
-  },
 });

+ 1 - 1
wxcomponents/vant/calendar/components/header/index.wxml

@@ -4,7 +4,7 @@
     <view class="van-calendar__header-title">{{ title }}</view>
   </block>
 
-  <view wx:if="{{ showSubtitle }}" class="van-calendar__header-subtitle">
+  <view wx:if="{{ showSubtitle }}" class="van-calendar__header-subtitle" bind:tap="onClickSubtitle">
     {{ subtitle }}
   </view>
 

+ 1 - 1
wxcomponents/vant/calendar/components/header/index.wxss

@@ -1 +1 @@
-@import '../../../common/index.wxss';.van-calendar__header{-webkit-flex-shrink:0;flex-shrink:0;box-shadow:0 2px 10px rgba(125,126,128,.16);box-shadow:var(--calendar-header-box-shadow,0 2px 10px rgba(125,126,128,.16))}.van-calendar__header-subtitle,.van-calendar__header-title{text-align:center;height:44px;height:var(--calendar-header-title-height,44px);font-weight:500;font-weight:var(--font-weight-bold,500);line-height:44px;line-height:var(--calendar-header-title-height,44px)}.van-calendar__header-title+.van-calendar__header-title,.van-calendar__header-title:empty{display:none}.van-calendar__header-title:empty+.van-calendar__header-title{display:block!important}.van-calendar__weekdays{display:-webkit-flex;display:flex}.van-calendar__weekday{-webkit-flex:1;flex:1;text-align:center;font-size:12px;font-size:var(--calendar-weekdays-font-size,12px);line-height:30px;line-height:var(--calendar-weekdays-height,30px)}
+@import '../../../common/index.wxss';.van-calendar__header{box-shadow:var(--calendar-header-box-shadow,0 2px 10px hsla(220,1%,50%,.16));flex-shrink:0}.van-calendar__header-subtitle,.van-calendar__header-title{font-weight:var(--font-weight-bold,500);height:var(--calendar-header-title-height,44px);line-height:var(--calendar-header-title-height,44px);text-align:center}.van-calendar__header-title+.van-calendar__header-title,.van-calendar__header-title:empty{display:none}.van-calendar__header-title:empty+.van-calendar__header-title{display:block!important}.van-calendar__weekdays{display:flex}.van-calendar__weekday{flex:1;font-size:var(--calendar-weekdays-font-size,12px);line-height:var(--calendar-weekdays-height,30px);text-align:center}

+ 6 - 1
wxcomponents/vant/calendar/components/month/index.d.ts

@@ -1 +1,6 @@
-export {};
+export interface Day {
+    date: Date;
+    type: string;
+    text: number;
+    bottomInfo?: string;
+}

+ 148 - 157
wxcomponents/vant/calendar/components/month/index.js

@@ -1,163 +1,154 @@
 import { VantComponent } from '../../../common/component';
-import {
-  getMonthEndDay,
-  compareDay,
-  getPrevDay,
-  getNextDay,
-} from '../../utils';
+import { getMonthEndDay, compareDay, getPrevDay, getNextDay, } from '../../utils';
 VantComponent({
-  props: {
-    date: {
-      type: null,
-      observer: 'setDays',
+    props: {
+        date: {
+            type: null,
+            observer: 'setDays',
+        },
+        type: {
+            type: String,
+            observer: 'setDays',
+        },
+        color: String,
+        minDate: {
+            type: null,
+            observer: 'setDays',
+        },
+        maxDate: {
+            type: null,
+            observer: 'setDays',
+        },
+        showMark: Boolean,
+        rowHeight: null,
+        formatter: {
+            type: null,
+            observer: 'setDays',
+        },
+        currentDate: {
+            type: null,
+            observer: 'setDays',
+        },
+        firstDayOfWeek: {
+            type: Number,
+            observer: 'setDays',
+        },
+        allowSameDay: Boolean,
+        showSubtitle: Boolean,
+        showMonthTitle: Boolean,
     },
-    type: {
-      type: String,
-      observer: 'setDays',
+    data: {
+        visible: true,
+        days: [],
     },
-    color: String,
-    minDate: {
-      type: null,
-      observer: 'setDays',
+    methods: {
+        onClick(event) {
+            const { index } = event.currentTarget.dataset;
+            const item = this.data.days[index];
+            if (item.type !== 'disabled') {
+                this.$emit('click', item);
+            }
+        },
+        setDays() {
+            const days = [];
+            const startDate = new Date(this.data.date);
+            const year = startDate.getFullYear();
+            const month = startDate.getMonth();
+            const totalDay = getMonthEndDay(startDate.getFullYear(), startDate.getMonth() + 1);
+            for (let day = 1; day <= totalDay; day++) {
+                const date = new Date(year, month, day);
+                const type = this.getDayType(date);
+                let config = {
+                    date,
+                    type,
+                    text: day,
+                    bottomInfo: this.getBottomInfo(type),
+                };
+                if (this.data.formatter) {
+                    config = this.data.formatter(config);
+                }
+                days.push(config);
+            }
+            this.setData({ days });
+        },
+        getMultipleDayType(day) {
+            const { currentDate } = this.data;
+            if (!Array.isArray(currentDate)) {
+                return '';
+            }
+            const isSelected = (date) => currentDate.some((item) => compareDay(item, date) === 0);
+            if (isSelected(day)) {
+                const prevDay = getPrevDay(day);
+                const nextDay = getNextDay(day);
+                const prevSelected = isSelected(prevDay);
+                const nextSelected = isSelected(nextDay);
+                if (prevSelected && nextSelected) {
+                    return 'multiple-middle';
+                }
+                if (prevSelected) {
+                    return 'end';
+                }
+                return nextSelected ? 'start' : 'multiple-selected';
+            }
+            return '';
+        },
+        getRangeDayType(day) {
+            const { currentDate, allowSameDay } = this.data;
+            if (!Array.isArray(currentDate)) {
+                return '';
+            }
+            const [startDay, endDay] = currentDate;
+            if (!startDay) {
+                return '';
+            }
+            const compareToStart = compareDay(day, startDay);
+            if (!endDay) {
+                return compareToStart === 0 ? 'start' : '';
+            }
+            const compareToEnd = compareDay(day, endDay);
+            if (compareToStart === 0 && compareToEnd === 0 && allowSameDay) {
+                return 'start-end';
+            }
+            if (compareToStart === 0) {
+                return 'start';
+            }
+            if (compareToEnd === 0) {
+                return 'end';
+            }
+            if (compareToStart > 0 && compareToEnd < 0) {
+                return 'middle';
+            }
+            return '';
+        },
+        getDayType(day) {
+            const { type, minDate, maxDate, currentDate } = this.data;
+            if (compareDay(day, minDate) < 0 || compareDay(day, maxDate) > 0) {
+                return 'disabled';
+            }
+            if (type === 'single') {
+                return compareDay(day, currentDate) === 0 ? 'selected' : '';
+            }
+            if (type === 'multiple') {
+                return this.getMultipleDayType(day);
+            }
+            /* istanbul ignore else */
+            if (type === 'range') {
+                return this.getRangeDayType(day);
+            }
+            return '';
+        },
+        getBottomInfo(type) {
+            if (this.data.type === 'range') {
+                if (type === 'start') {
+                    return '开始';
+                }
+                if (type === 'end') {
+                    return '结束';
+                }
+                if (type === 'start-end') {
+                    return '开始/结束';
+                }
+            }
+        },
     },
-    maxDate: {
-      type: null,
-      observer: 'setDays',
-    },
-    showMark: Boolean,
-    rowHeight: null,
-    formatter: {
-      type: null,
-      observer: 'setDays',
-    },
-    currentDate: {
-      type: null,
-      observer: 'setDays',
-    },
-    firstDayOfWeek: {
-      type: Number,
-      observer: 'setDays',
-    },
-    allowSameDay: Boolean,
-    showSubtitle: Boolean,
-    showMonthTitle: Boolean,
-  },
-  data: {
-    visible: true,
-    days: [],
-  },
-  methods: {
-    onClick(event) {
-      const { index } = event.currentTarget.dataset;
-      const item = this.data.days[index];
-      if (item.type !== 'disabled') {
-        this.$emit('click', item);
-      }
-    },
-    setDays() {
-      const days = [];
-      const startDate = new Date(this.data.date);
-      const year = startDate.getFullYear();
-      const month = startDate.getMonth();
-      const totalDay = getMonthEndDay(
-        startDate.getFullYear(),
-        startDate.getMonth() + 1
-      );
-      for (let day = 1; day <= totalDay; day++) {
-        const date = new Date(year, month, day);
-        const type = this.getDayType(date);
-        let config = {
-          date,
-          type,
-          text: day,
-          bottomInfo: this.getBottomInfo(type),
-        };
-        if (this.data.formatter) {
-          config = this.data.formatter(config);
-        }
-        days.push(config);
-      }
-      this.setData({ days });
-    },
-    getMultipleDayType(day) {
-      const { currentDate } = this.data;
-      if (!Array.isArray(currentDate)) {
-        return '';
-      }
-      const isSelected = (date) =>
-        currentDate.some((item) => compareDay(item, date) === 0);
-      if (isSelected(day)) {
-        const prevDay = getPrevDay(day);
-        const nextDay = getNextDay(day);
-        const prevSelected = isSelected(prevDay);
-        const nextSelected = isSelected(nextDay);
-        if (prevSelected && nextSelected) {
-          return 'multiple-middle';
-        }
-        if (prevSelected) {
-          return 'end';
-        }
-        return nextSelected ? 'start' : 'multiple-selected';
-      }
-      return '';
-    },
-    getRangeDayType(day) {
-      const { currentDate, allowSameDay } = this.data;
-      if (!Array.isArray(currentDate)) {
-        return '';
-      }
-      const [startDay, endDay] = currentDate;
-      if (!startDay) {
-        return '';
-      }
-      const compareToStart = compareDay(day, startDay);
-      if (!endDay) {
-        return compareToStart === 0 ? 'start' : '';
-      }
-      const compareToEnd = compareDay(day, endDay);
-      if (compareToStart === 0 && compareToEnd === 0 && allowSameDay) {
-        return 'start-end';
-      }
-      if (compareToStart === 0) {
-        return 'start';
-      }
-      if (compareToEnd === 0) {
-        return 'end';
-      }
-      if (compareToStart > 0 && compareToEnd < 0) {
-        return 'middle';
-      }
-      return '';
-    },
-    getDayType(day) {
-      const { type, minDate, maxDate, currentDate } = this.data;
-      if (compareDay(day, minDate) < 0 || compareDay(day, maxDate) > 0) {
-        return 'disabled';
-      }
-      if (type === 'single') {
-        return compareDay(day, currentDate) === 0 ? 'selected' : '';
-      }
-      if (type === 'multiple') {
-        return this.getMultipleDayType(day);
-      }
-      /* istanbul ignore else */
-      if (type === 'range') {
-        return this.getRangeDayType(day);
-      }
-      return '';
-    },
-    getBottomInfo(type) {
-      if (this.data.type === 'range') {
-        if (type === 'start') {
-          return '开始';
-        }
-        if (type === 'end') {
-          return '结束';
-        }
-        if (type === 'start-end') {
-          return '开始/结束';
-        }
-      }
-    },
-  },
 });

+ 1 - 1
wxcomponents/vant/calendar/components/month/index.wxml

@@ -19,7 +19,7 @@
       data-index="{{ index }}"
       bindtap="onClick"
     >
-      <view wx:if="{{ item.type === 'selected' }}" class="van-calendar__selected-day" style="background: {{ color }}">
+      <view wx:if="{{ item.type === 'selected' }}" class="van-calendar__selected-day" style="width: {{ rowHeight }}px; height: {{ rowHeight }}px; background: {{ color }}">
         <view wx:if="{{ item.topInfo }}" class="van-calendar__top-info">{{ item.topInfo }}</view>
         {{ item.text }}
         <view wx:if="{{ item.bottomInfo }}" class="van-calendar__bottom-info">

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
wxcomponents/vant/calendar/components/month/index.wxss


+ 331 - 298
wxcomponents/vant/calendar/index.js

@@ -1,309 +1,342 @@
 import { VantComponent } from '../common/component';
-import {
-  ROW_HEIGHT,
-  getNextDay,
-  compareDay,
-  copyDates,
-  calcDateNum,
-  formatMonthTitle,
-  compareMonth,
-  getMonths,
-  getDayByOffset,
-} from './utils';
+import { ROW_HEIGHT, getPrevDay, getNextDay, getToday, compareDay, copyDates, calcDateNum, formatMonthTitle, compareMonth, getMonths, getDayByOffset, } from './utils';
 import Toast from '../toast/toast';
 import { requestAnimationFrame } from '../common/utils';
+const initialMinDate = getToday().getTime();
+const initialMaxDate = (() => {
+    const now = getToday();
+    return new Date(now.getFullYear(), now.getMonth() + 6, now.getDate()).getTime();
+})();
+const getTime = (date) => date instanceof Date ? date.getTime() : date;
 VantComponent({
-  props: {
-    title: {
-      type: String,
-      value: '日期选择',
-    },
-    color: String,
-    show: {
-      type: Boolean,
-      observer(val) {
-        if (val) {
-          this.initRect();
-          this.scrollIntoView();
-        }
-      },
-    },
-    formatter: null,
-    confirmText: {
-      type: String,
-      value: '确定',
-    },
-    rangePrompt: String,
-    showRangePrompt: {
-      type: Boolean,
-      value: true,
-    },
-    defaultDate: {
-      type: null,
-      observer(val) {
-        this.setData({ currentDate: val });
-        this.scrollIntoView();
-      },
-    },
-    allowSameDay: Boolean,
-    confirmDisabledText: String,
-    type: {
-      type: String,
-      value: 'single',
-      observer: 'reset',
-    },
-    minDate: {
-      type: null,
-      value: Date.now(),
-    },
-    maxDate: {
-      type: null,
-      value: new Date(
-        new Date().getFullYear(),
-        new Date().getMonth() + 6,
-        new Date().getDate()
-      ).getTime(),
-    },
-    position: {
-      type: String,
-      value: 'bottom',
-    },
-    rowHeight: {
-      type: null,
-      value: ROW_HEIGHT,
-    },
-    round: {
-      type: Boolean,
-      value: true,
-    },
-    poppable: {
-      type: Boolean,
-      value: true,
-    },
-    showMark: {
-      type: Boolean,
-      value: true,
-    },
-    showTitle: {
-      type: Boolean,
-      value: true,
-    },
-    showConfirm: {
-      type: Boolean,
-      value: true,
-    },
-    showSubtitle: {
-      type: Boolean,
-      value: true,
-    },
-    safeAreaInsetBottom: {
-      type: Boolean,
-      value: true,
-    },
-    closeOnClickOverlay: {
-      type: Boolean,
-      value: true,
-    },
-    maxRange: {
-      type: null,
-      value: null,
-    },
-    firstDayOfWeek: {
-      type: Number,
-      value: 0,
-    },
-  },
-  data: {
-    subtitle: '',
-    currentDate: null,
-    scrollIntoView: '',
-  },
-  created() {
-    this.setData({
-      currentDate: this.getInitialDate(),
-    });
-  },
-  mounted() {
-    if (this.data.show || !this.data.poppable) {
-      this.initRect();
-      this.scrollIntoView();
-    }
-  },
-  methods: {
-    reset() {
-      this.setData({ currentDate: this.getInitialDate() });
-      this.scrollIntoView();
-    },
-    initRect() {
-      if (this.contentObserver != null) {
-        this.contentObserver.disconnect();
-      }
-      const contentObserver = this.createIntersectionObserver({
-        thresholds: [0, 0.1, 0.9, 1],
-        observeAll: true,
-      });
-      this.contentObserver = contentObserver;
-      contentObserver.relativeTo('.van-calendar__body');
-      contentObserver.observe('.month', (res) => {
-        if (res.boundingClientRect.top <= res.relativeRect.top) {
-          // @ts-ignore
-          this.setData({ subtitle: formatMonthTitle(res.dataset.date) });
-        }
-      });
-    },
-    getInitialDate() {
-      const { type, defaultDate, minDate } = this.data;
-      if (type === 'range') {
-        const [startDay, endDay] = defaultDate || [];
-        return [
-          startDay || minDate,
-          endDay || getNextDay(new Date(minDate)).getTime(),
-        ];
-      }
-      if (type === 'multiple') {
-        return defaultDate || [minDate];
-      }
-      return defaultDate || minDate;
-    },
-    scrollIntoView() {
-      requestAnimationFrame(() => {
-        const {
-          currentDate,
-          type,
-          show,
-          poppable,
-          minDate,
-          maxDate,
-        } = this.data;
-        // @ts-ignore
-        const targetDate = type === 'single' ? currentDate : currentDate[0];
-        const displayed = show || !poppable;
-        if (!targetDate || !displayed) {
-          return;
-        }
-        const months = getMonths(minDate, maxDate);
-        months.some((month, index) => {
-          if (compareMonth(month, targetDate) === 0) {
-            this.setData({ scrollIntoView: `month${index}` });
-            return true;
-          }
-          return false;
+    props: {
+        title: {
+            type: String,
+            value: '日期选择',
+        },
+        color: String,
+        show: {
+            type: Boolean,
+            observer(val) {
+                if (val) {
+                    this.initRect();
+                    this.scrollIntoView();
+                }
+            },
+        },
+        formatter: null,
+        confirmText: {
+            type: String,
+            value: '确定',
+        },
+        confirmDisabledText: {
+            type: String,
+            value: '确定',
+        },
+        rangePrompt: String,
+        showRangePrompt: {
+            type: Boolean,
+            value: true,
+        },
+        defaultDate: {
+            type: null,
+            observer(val) {
+                this.setData({ currentDate: val });
+                this.scrollIntoView();
+            },
+        },
+        allowSameDay: Boolean,
+        type: {
+            type: String,
+            value: 'single',
+            observer: 'reset',
+        },
+        minDate: {
+            type: Number,
+            value: initialMinDate,
+        },
+        maxDate: {
+            type: Number,
+            value: initialMaxDate,
+        },
+        position: {
+            type: String,
+            value: 'bottom',
+        },
+        rowHeight: {
+            type: null,
+            value: ROW_HEIGHT,
+        },
+        round: {
+            type: Boolean,
+            value: true,
+        },
+        poppable: {
+            type: Boolean,
+            value: true,
+        },
+        showMark: {
+            type: Boolean,
+            value: true,
+        },
+        showTitle: {
+            type: Boolean,
+            value: true,
+        },
+        showConfirm: {
+            type: Boolean,
+            value: true,
+        },
+        showSubtitle: {
+            type: Boolean,
+            value: true,
+        },
+        safeAreaInsetBottom: {
+            type: Boolean,
+            value: true,
+        },
+        closeOnClickOverlay: {
+            type: Boolean,
+            value: true,
+        },
+        maxRange: {
+            type: null,
+            value: null,
+        },
+        minRange: {
+            type: Number,
+            value: 1,
+        },
+        firstDayOfWeek: {
+            type: Number,
+            value: 0,
+        },
+        readonly: Boolean,
+    },
+    data: {
+        subtitle: '',
+        currentDate: null,
+        scrollIntoView: '',
+    },
+    created() {
+        this.setData({
+            currentDate: this.getInitialDate(this.data.defaultDate),
         });
-      });
-    },
-    onOpen() {
-      this.$emit('open');
-    },
-    onOpened() {
-      this.$emit('opened');
-    },
-    onClose() {
-      this.$emit('close');
     },
-    onClosed() {
-      this.$emit('closed');
-    },
-    onClickDay(event) {
-      const { date } = event.detail;
-      const { type, currentDate, allowSameDay } = this.data;
-      if (type === 'range') {
-        // @ts-ignore
-        const [startDay, endDay] = currentDate;
-        if (startDay && !endDay) {
-          const compareToStart = compareDay(date, startDay);
-          if (compareToStart === 1) {
-            this.select([startDay, date], true);
-          } else if (compareToStart === -1) {
-            this.select([date, null]);
-          } else if (allowSameDay) {
-            this.select([date, date]);
-          }
-        } else {
-          this.select([date, null]);
-        }
-      } else if (type === 'multiple') {
-        let selectedIndex;
-        // @ts-ignore
-        const selected = currentDate.some((dateItem, index) => {
-          const equal = compareDay(dateItem, date) === 0;
-          if (equal) {
-            selectedIndex = index;
-          }
-          return equal;
-        });
-        if (selected) {
-          // @ts-ignore
-          const cancelDate = currentDate.splice(selectedIndex, 1);
-          this.setData({ currentDate });
-          this.unselect(cancelDate);
-        } else {
-          // @ts-ignore
-          this.select([...currentDate, date]);
+    mounted() {
+        if (this.data.show || !this.data.poppable) {
+            this.initRect();
+            this.scrollIntoView();
         }
-      } else {
-        this.select(date, true);
-      }
     },
-    unselect(dateArray) {
-      const date = dateArray[0];
-      if (date) {
-        this.$emit('unselect', copyDates(date));
-      }
-    },
-    select(date, complete) {
-      if (complete && this.data.type === 'range') {
-        const valid = this.checkRange(date);
-        if (!valid) {
-          // auto selected to max range if showConfirm
-          if (this.data.showConfirm) {
-            this.emit([
-              date[0],
-              getDayByOffset(date[0], this.data.maxRange - 1),
-            ]);
-          } else {
+    methods: {
+        reset() {
+            this.setData({ currentDate: this.getInitialDate() });
+            this.scrollIntoView();
+        },
+        initRect() {
+            if (this.contentObserver != null) {
+                this.contentObserver.disconnect();
+            }
+            const contentObserver = this.createIntersectionObserver({
+                thresholds: [0, 0.1, 0.9, 1],
+                observeAll: true,
+            });
+            this.contentObserver = contentObserver;
+            contentObserver.relativeTo('.van-calendar__body');
+            contentObserver.observe('.month', (res) => {
+                if (res.boundingClientRect.top <= res.relativeRect.top) {
+                    // @ts-ignore
+                    this.setData({ subtitle: formatMonthTitle(res.dataset.date) });
+                }
+            });
+        },
+        limitDateRange(date, minDate = null, maxDate = null) {
+            minDate = minDate || this.data.minDate;
+            maxDate = maxDate || this.data.maxDate;
+            if (compareDay(date, minDate) === -1) {
+                return minDate;
+            }
+            if (compareDay(date, maxDate) === 1) {
+                return maxDate;
+            }
+            return date;
+        },
+        getInitialDate(defaultDate = null) {
+            const { type, minDate, maxDate, allowSameDay } = this.data;
+            const now = getToday().getTime();
+            if (type === 'range') {
+                if (!Array.isArray(defaultDate)) {
+                    defaultDate = [];
+                }
+                const [startDay, endDay] = defaultDate || [];
+                const start = this.limitDateRange(startDay || now, minDate, getPrevDay(new Date(maxDate)).getTime());
+                const date = getTime(endDay || now);
+                const end = this.limitDateRange(date, allowSameDay ? date : getNextDay(new Date(minDate)).getTime());
+                return [start, end];
+            }
+            if (type === 'multiple') {
+                if (Array.isArray(defaultDate)) {
+                    return defaultDate.map((date) => this.limitDateRange(date));
+                }
+                return [this.limitDateRange(now)];
+            }
+            if (!defaultDate || Array.isArray(defaultDate)) {
+                defaultDate = now;
+            }
+            return this.limitDateRange(defaultDate);
+        },
+        scrollIntoView() {
+            requestAnimationFrame(() => {
+                const { currentDate, type, show, poppable, minDate, maxDate } = this.data;
+                // @ts-ignore
+                const targetDate = type === 'single' ? currentDate : currentDate[0];
+                const displayed = show || !poppable;
+                if (!targetDate || !displayed) {
+                    return;
+                }
+                const months = getMonths(minDate, maxDate);
+                months.some((month, index) => {
+                    if (compareMonth(month, targetDate) === 0) {
+                        this.setData({ scrollIntoView: `month${index}` });
+                        return true;
+                    }
+                    return false;
+                });
+            });
+        },
+        onOpen() {
+            this.$emit('open');
+        },
+        onOpened() {
+            this.$emit('opened');
+        },
+        onClose() {
+            this.$emit('close');
+        },
+        onClosed() {
+            this.$emit('closed');
+        },
+        onClickDay(event) {
+            if (this.data.readonly) {
+                return;
+            }
+            let { date } = event.detail;
+            const { type, currentDate, allowSameDay } = this.data;
+            if (type === 'range') {
+                // @ts-ignore
+                const [startDay, endDay] = currentDate;
+                if (startDay && !endDay) {
+                    const compareToStart = compareDay(date, startDay);
+                    if (compareToStart === 1) {
+                        const { days } = this.selectComponent('.month').data;
+                        days.some((day, index) => {
+                            const isDisabled = day.type === 'disabled' &&
+                                getTime(startDay) < getTime(day.date) &&
+                                getTime(day.date) < getTime(date);
+                            if (isDisabled) {
+                                ({ date } = days[index - 1]);
+                            }
+                            return isDisabled;
+                        });
+                        this.select([startDay, date], true);
+                    }
+                    else if (compareToStart === -1) {
+                        this.select([date, null]);
+                    }
+                    else if (allowSameDay) {
+                        this.select([date, date]);
+                    }
+                }
+                else {
+                    this.select([date, null]);
+                }
+            }
+            else if (type === 'multiple') {
+                let selectedIndex;
+                // @ts-ignore
+                const selected = currentDate.some((dateItem, index) => {
+                    const equal = compareDay(dateItem, date) === 0;
+                    if (equal) {
+                        selectedIndex = index;
+                    }
+                    return equal;
+                });
+                if (selected) {
+                    // @ts-ignore
+                    const cancelDate = currentDate.splice(selectedIndex, 1);
+                    this.setData({ currentDate });
+                    this.unselect(cancelDate);
+                }
+                else {
+                    // @ts-ignore
+                    this.select([...currentDate, date]);
+                }
+            }
+            else {
+                this.select(date, true);
+            }
+        },
+        unselect(dateArray) {
+            const date = dateArray[0];
+            if (date) {
+                this.$emit('unselect', copyDates(date));
+            }
+        },
+        select(date, complete) {
+            if (complete && this.data.type === 'range') {
+                const valid = this.checkRange(date);
+                if (!valid) {
+                    // auto selected to max range if showConfirm
+                    if (this.data.showConfirm) {
+                        this.emit([
+                            date[0],
+                            getDayByOffset(date[0], this.data.maxRange - 1),
+                        ]);
+                    }
+                    else {
+                        this.emit(date);
+                    }
+                    return;
+                }
+            }
             this.emit(date);
-          }
-          return;
-        }
-      }
-      this.emit(date);
-      if (complete && !this.data.showConfirm) {
-        this.onConfirm();
-      }
-    },
-    emit(date) {
-      const getTime = (date) => (date instanceof Date ? date.getTime() : date);
-      this.setData({
-        currentDate: Array.isArray(date) ? date.map(getTime) : getTime(date),
-      });
-      this.$emit('select', copyDates(date));
-    },
-    checkRange(date) {
-      const { maxRange, rangePrompt, showRangePrompt } = this.data;
-      if (maxRange && calcDateNum(date) > maxRange) {
-        if (showRangePrompt) {
-          Toast({
-            duration: 0,
-            context: this,
-            message: rangePrompt || `选择天数不能超过 ${maxRange} 天`,
-          });
-        }
-        this.$emit('over-range');
-        return false;
-      }
-      return true;
-    },
-    onConfirm() {
-      if (
-        this.data.type === 'range' &&
-        !this.checkRange(this.data.currentDate)
-      ) {
-        return;
-      }
-      wx.nextTick(() => {
-        // @ts-ignore
-        this.$emit('confirm', copyDates(this.data.currentDate));
-      });
+            if (complete && !this.data.showConfirm) {
+                this.onConfirm();
+            }
+        },
+        emit(date) {
+            this.setData({
+                currentDate: Array.isArray(date) ? date.map(getTime) : getTime(date),
+            });
+            this.$emit('select', copyDates(date));
+        },
+        checkRange(date) {
+            const { maxRange, rangePrompt, showRangePrompt } = this.data;
+            if (maxRange && calcDateNum(date) > maxRange) {
+                if (showRangePrompt) {
+                    Toast({
+                        context: this,
+                        message: rangePrompt || `选择天数不能超过 ${maxRange} 天`,
+                    });
+                }
+                this.$emit('over-range');
+                return false;
+            }
+            return true;
+        },
+        onConfirm() {
+            if (this.data.type === 'range' &&
+                !this.checkRange(this.data.currentDate)) {
+                return;
+            }
+            wx.nextTick(() => {
+                // @ts-ignore
+                this.$emit('confirm', copyDates(this.data.currentDate));
+            });
+        },
+        onClickSubtitle(event) {
+            this.$emit('click-subtitle', event);
+        },
     },
-  },
 });

+ 3 - 2
wxcomponents/vant/calendar/index.wxml

@@ -12,14 +12,15 @@
   position="{{ position }}"
   closeable="{{ showTitle || showSubtitle }}"
   close-on-click-overlay="{{ closeOnClickOverlay }}"
+  safe-area-inset-bottom="{{ safeAreaInsetBottom }}"
   bind:enter="onOpen"
   bind:close="onClose"
   bind:after-enter="onOpened"
   bind:after-leave="onClosed"
 >
-  <include src="calendar.wxml" />
+  <include src="./calendar.wxml" />
 </van-popup>
 
-<include wx:else src="calendar.wxml" />
+<include wx:else src="./calendar.wxml" />
 
 <van-toast id="van-toast" />

+ 2 - 2
wxcomponents/vant/calendar/index.wxs

@@ -15,7 +15,7 @@ function getMonths(minDate, maxDate) {
   return months;
 }
 
-function getButtonDisabled(type, currentDate) {
+function getButtonDisabled(type, currentDate, minRange) {
   if (currentDate == null) {
     return true;
   }
@@ -25,7 +25,7 @@ function getButtonDisabled(type, currentDate) {
   }
 
   if (type === 'multiple') {
-    return !currentDate.length;
+    return currentDate.length < minRange;
   }
 
   return !currentDate;

+ 1 - 1
wxcomponents/vant/calendar/index.wxss

@@ -1 +1 @@
-@import '../common/index.wxss';.van-calendar{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;height:100%;height:var(--calendar-height,100%);background-color:#fff;background-color:var(--calendar-background-color,#fff)}.van-calendar__close-icon{top:11px}.van-calendar__popup--bottom,.van-calendar__popup--top{height:80%;height:var(--calendar-popup-height,80%)}.van-calendar__popup--left,.van-calendar__popup--right{height:100%}.van-calendar__body{-webkit-flex:1;flex:1;overflow:auto;-webkit-overflow-scrolling:touch}.van-calendar__footer{-webkit-flex-shrink:0;flex-shrink:0;padding:0 16px;padding:0 var(--padding-md,16px)}.van-calendar__footer--safe-area-inset-bottom{padding-bottom:env(safe-area-inset-bottom)}.van-calendar__footer+.van-calendar__footer,.van-calendar__footer:empty{display:none}.van-calendar__footer:empty+.van-calendar__footer{display:block!important}.van-calendar__confirm{height:36px!important;height:var(--calendar-confirm-button-height,36px)!important;margin:7px 0!important;margin:var(--calendar-confirm-button-margin,7px 0)!important;line-height:34px!important;line-height:var(--calendar-confirm-button-line-height,34px)!important}
+@import '../common/index.wxss';.van-calendar{background-color:var(--calendar-background-color,#fff);display:flex;flex-direction:column;height:var(--calendar-height,100%)}.van-calendar__close-icon{top:11px}.van-calendar__popup--bottom,.van-calendar__popup--top{height:var(--calendar-popup-height,80%)}.van-calendar__popup--left,.van-calendar__popup--right{height:100%}.van-calendar__body{-webkit-overflow-scrolling:touch;flex:1;overflow:auto}.van-calendar__footer{flex-shrink:0;padding:0 var(--padding-md,16px)}.van-calendar__footer--safe-area-inset-bottom{padding-bottom:env(safe-area-inset-bottom)}.van-calendar__footer+.van-calendar__footer,.van-calendar__footer:empty{display:none}.van-calendar__footer:empty+.van-calendar__footer{display:block!important}.van-calendar__confirm{height:var(--calendar-confirm-button-height,36px)!important;line-height:var(--calendar-confirm-button-line-height,34px)!important;margin:var(--calendar-confirm-button-margin,7px 0)!important}

+ 3 - 8
wxcomponents/vant/calendar/utils.d.ts

@@ -1,16 +1,11 @@
 export declare const ROW_HEIGHT = 64;
 export declare function formatMonthTitle(date: Date): string;
-export declare function compareMonth(
-  date1: Date | number,
-  date2: Date | number
-): 1 | -1 | 0;
-export declare function compareDay(
-  day1: Date | number,
-  day2: Date | number
-): 1 | -1 | 0;
+export declare function compareMonth(date1: Date | number, date2: Date | number): 0 | 1 | -1;
+export declare function compareDay(day1: Date | number, day2: Date | number): 0 | 1 | -1;
 export declare function getDayByOffset(date: Date, offset: number): Date;
 export declare function getPrevDay(date: Date): Date;
 export declare function getNextDay(date: Date): Date;
+export declare function getToday(): Date;
 export declare function calcDateNum(date: [Date, Date]): number;
 export declare function copyDates(dates: Date | Date[]): Date | Date[];
 export declare function getMonthEndDay(year: number, month: number): number;

+ 62 - 57
wxcomponents/vant/calendar/utils.js

@@ -1,78 +1,83 @@
 export const ROW_HEIGHT = 64;
 export function formatMonthTitle(date) {
-  if (!(date instanceof Date)) {
-    date = new Date(date);
-  }
-  return `${date.getFullYear()}年${date.getMonth() + 1}月`;
+    if (!(date instanceof Date)) {
+        date = new Date(date);
+    }
+    return `${date.getFullYear()}年${date.getMonth() + 1}月`;
 }
 export function compareMonth(date1, date2) {
-  if (!(date1 instanceof Date)) {
-    date1 = new Date(date1);
-  }
-  if (!(date2 instanceof Date)) {
-    date2 = new Date(date2);
-  }
-  const year1 = date1.getFullYear();
-  const year2 = date2.getFullYear();
-  const month1 = date1.getMonth();
-  const month2 = date2.getMonth();
-  if (year1 === year2) {
-    return month1 === month2 ? 0 : month1 > month2 ? 1 : -1;
-  }
-  return year1 > year2 ? 1 : -1;
+    if (!(date1 instanceof Date)) {
+        date1 = new Date(date1);
+    }
+    if (!(date2 instanceof Date)) {
+        date2 = new Date(date2);
+    }
+    const year1 = date1.getFullYear();
+    const year2 = date2.getFullYear();
+    const month1 = date1.getMonth();
+    const month2 = date2.getMonth();
+    if (year1 === year2) {
+        return month1 === month2 ? 0 : month1 > month2 ? 1 : -1;
+    }
+    return year1 > year2 ? 1 : -1;
 }
 export function compareDay(day1, day2) {
-  if (!(day1 instanceof Date)) {
-    day1 = new Date(day1);
-  }
-  if (!(day2 instanceof Date)) {
-    day2 = new Date(day2);
-  }
-  const compareMonthResult = compareMonth(day1, day2);
-  if (compareMonthResult === 0) {
-    const date1 = day1.getDate();
-    const date2 = day2.getDate();
-    return date1 === date2 ? 0 : date1 > date2 ? 1 : -1;
-  }
-  return compareMonthResult;
+    if (!(day1 instanceof Date)) {
+        day1 = new Date(day1);
+    }
+    if (!(day2 instanceof Date)) {
+        day2 = new Date(day2);
+    }
+    const compareMonthResult = compareMonth(day1, day2);
+    if (compareMonthResult === 0) {
+        const date1 = day1.getDate();
+        const date2 = day2.getDate();
+        return date1 === date2 ? 0 : date1 > date2 ? 1 : -1;
+    }
+    return compareMonthResult;
 }
 export function getDayByOffset(date, offset) {
-  date = new Date(date);
-  date.setDate(date.getDate() + offset);
-  return date;
+    date = new Date(date);
+    date.setDate(date.getDate() + offset);
+    return date;
 }
 export function getPrevDay(date) {
-  return getDayByOffset(date, -1);
+    return getDayByOffset(date, -1);
 }
 export function getNextDay(date) {
-  return getDayByOffset(date, 1);
+    return getDayByOffset(date, 1);
+}
+export function getToday() {
+    const today = new Date();
+    today.setHours(0, 0, 0, 0);
+    return today;
 }
 export function calcDateNum(date) {
-  const day1 = new Date(date[0]).getTime();
-  const day2 = new Date(date[1]).getTime();
-  return (day2 - day1) / (1000 * 60 * 60 * 24) + 1;
+    const day1 = new Date(date[0]).getTime();
+    const day2 = new Date(date[1]).getTime();
+    return (day2 - day1) / (1000 * 60 * 60 * 24) + 1;
 }
 export function copyDates(dates) {
-  if (Array.isArray(dates)) {
-    return dates.map((date) => {
-      if (date === null) {
-        return date;
-      }
-      return new Date(date);
-    });
-  }
-  return new Date(dates);
+    if (Array.isArray(dates)) {
+        return dates.map((date) => {
+            if (date === null) {
+                return date;
+            }
+            return new Date(date);
+        });
+    }
+    return new Date(dates);
 }
 export function getMonthEndDay(year, month) {
-  return 32 - new Date(year, month - 1, 32).getDate();
+    return 32 - new Date(year, month - 1, 32).getDate();
 }
 export function getMonths(minDate, maxDate) {
-  const months = [];
-  const cursor = new Date(minDate);
-  cursor.setDate(1);
-  do {
-    months.push(cursor.getTime());
-    cursor.setMonth(cursor.getMonth() + 1);
-  } while (compareMonth(cursor, maxDate) !== 1);
-  return months;
+    const months = [];
+    const cursor = new Date(minDate);
+    cursor.setDate(1);
+    do {
+        months.push(cursor.getTime());
+        cursor.setMonth(cursor.getMonth() + 1);
+    } while (compareMonth(cursor, maxDate) !== 1);
+    return months;
 }

+ 43 - 43
wxcomponents/vant/card/index.js

@@ -1,49 +1,49 @@
 import { link } from '../mixins/link';
 import { VantComponent } from '../common/component';
 VantComponent({
-  classes: [
-    'num-class',
-    'desc-class',
-    'thumb-class',
-    'title-class',
-    'price-class',
-    'origin-price-class',
-  ],
-  mixins: [link],
-  props: {
-    tag: String,
-    num: String,
-    desc: String,
-    thumb: String,
-    title: String,
-    price: {
-      type: String,
-      observer: 'updatePrice',
+    classes: [
+        'num-class',
+        'desc-class',
+        'thumb-class',
+        'title-class',
+        'price-class',
+        'origin-price-class',
+    ],
+    mixins: [link],
+    props: {
+        tag: String,
+        num: String,
+        desc: String,
+        thumb: String,
+        title: String,
+        price: {
+            type: String,
+            observer: 'updatePrice',
+        },
+        centered: Boolean,
+        lazyLoad: Boolean,
+        thumbLink: String,
+        originPrice: String,
+        thumbMode: {
+            type: String,
+            value: 'aspectFit',
+        },
+        currency: {
+            type: String,
+            value: '¥',
+        },
     },
-    centered: Boolean,
-    lazyLoad: Boolean,
-    thumbLink: String,
-    originPrice: String,
-    thumbMode: {
-      type: String,
-      value: 'aspectFit',
+    methods: {
+        updatePrice() {
+            const { price } = this.data;
+            const priceArr = price.toString().split('.');
+            this.setData({
+                integerStr: priceArr[0],
+                decimalStr: priceArr[1] ? `.${priceArr[1]}` : '',
+            });
+        },
+        onClickThumb() {
+            this.jumpLink('thumbLink');
+        },
     },
-    currency: {
-      type: String,
-      value: '¥',
-    },
-  },
-  methods: {
-    updatePrice() {
-      const { price } = this.data;
-      const priceArr = price.toString().split('.');
-      this.setData({
-        integerStr: priceArr[0],
-        decimalStr: priceArr[1] ? `.${priceArr[1]}` : '',
-      });
-    },
-    onClickThumb() {
-      this.jumpLink('thumbLink');
-    },
-  },
 });

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
wxcomponents/vant/card/index.wxss


+ 1 - 0
wxcomponents/vant/cascader/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 208 - 0
wxcomponents/vant/cascader/index.js

@@ -0,0 +1,208 @@
+import { VantComponent } from '../common/component';
+var FieldName;
+(function (FieldName) {
+    FieldName["TEXT"] = "text";
+    FieldName["VALUE"] = "value";
+    FieldName["CHILDREN"] = "children";
+})(FieldName || (FieldName = {}));
+const defaultFieldNames = {
+    text: FieldName.TEXT,
+    value: FieldName.VALUE,
+    children: FieldName.CHILDREN,
+};
+VantComponent({
+    props: {
+        title: String,
+        value: {
+            type: String,
+            observer: 'updateValue',
+        },
+        placeholder: {
+            type: String,
+            value: '请选择',
+        },
+        activeColor: {
+            type: String,
+            value: '#1989fa',
+        },
+        options: {
+            type: Array,
+            value: [],
+            observer: 'updateOptions',
+        },
+        swipeable: {
+            type: Boolean,
+            value: false,
+        },
+        closeable: {
+            type: Boolean,
+            value: true,
+        },
+        showHeader: {
+            type: Boolean,
+            value: true,
+        },
+        closeIcon: {
+            type: String,
+            value: 'cross',
+        },
+        fieldNames: {
+            type: Object,
+            value: defaultFieldNames,
+            observer: 'updateFieldNames',
+        },
+    },
+    data: {
+        tabs: [],
+        activeTab: 0,
+        textKey: FieldName.TEXT,
+        valueKey: FieldName.VALUE,
+        childrenKey: FieldName.CHILDREN,
+    },
+    created() {
+        this.updateTabs();
+    },
+    methods: {
+        updateOptions(val, oldVal) {
+            const isAsync = !!(val.length && oldVal.length);
+            this.updateTabs(isAsync);
+        },
+        updateValue(val) {
+            if (val !== undefined) {
+                const values = this.data.tabs.map((tab) => tab.selected && tab.selected[this.data.valueKey]);
+                if (values.indexOf(val) > -1) {
+                    return;
+                }
+            }
+            this.updateTabs();
+        },
+        updateFieldNames() {
+            const { text = 'text', value = 'value', children = 'children', } = this.data.fieldNames || defaultFieldNames;
+            this.setData({
+                textKey: text,
+                valueKey: value,
+                childrenKey: children,
+            });
+        },
+        getSelectedOptionsByValue(options, value) {
+            for (let i = 0; i < options.length; i++) {
+                const option = options[i];
+                if (option[this.data.valueKey] === value) {
+                    return [option];
+                }
+                if (option[this.data.childrenKey]) {
+                    const selectedOptions = this.getSelectedOptionsByValue(option[this.data.childrenKey], value);
+                    if (selectedOptions) {
+                        return [option, ...selectedOptions];
+                    }
+                }
+            }
+        },
+        updateTabs(isAsync = false) {
+            const { options, value } = this.data;
+            if (value !== undefined) {
+                const selectedOptions = this.getSelectedOptionsByValue(options, value);
+                if (selectedOptions) {
+                    let optionsCursor = options;
+                    const tabs = selectedOptions.map((option) => {
+                        const tab = {
+                            options: optionsCursor,
+                            selected: option,
+                        };
+                        const next = optionsCursor.find((item) => item[this.data.valueKey] === option[this.data.valueKey]);
+                        if (next) {
+                            optionsCursor = next[this.data.childrenKey];
+                        }
+                        return tab;
+                    });
+                    if (optionsCursor) {
+                        tabs.push({
+                            options: optionsCursor,
+                            selected: null,
+                        });
+                    }
+                    this.setData({
+                        tabs,
+                    });
+                    wx.nextTick(() => {
+                        this.setData({
+                            activeTab: tabs.length - 1,
+                        });
+                    });
+                    return;
+                }
+            }
+            // 异步更新
+            if (isAsync) {
+                const { tabs } = this.data;
+                tabs[tabs.length - 1].options =
+                    options[options.length - 1][this.data.childrenKey];
+                this.setData({
+                    tabs,
+                });
+                return;
+            }
+            this.setData({
+                tabs: [
+                    {
+                        options,
+                        selected: null,
+                    },
+                ],
+            });
+        },
+        onClose() {
+            this.$emit('close');
+        },
+        onClickTab(e) {
+            const { index: tabIndex, title } = e.detail;
+            this.$emit('click-tab', { title, tabIndex });
+            this.setData({
+                activeTab: tabIndex,
+            });
+        },
+        // 选中
+        onSelect(e) {
+            const { option, tabIndex } = e.currentTarget.dataset;
+            if (option && option.disabled) {
+                return;
+            }
+            const { valueKey, childrenKey } = this.data;
+            let { tabs } = this.data;
+            tabs[tabIndex].selected = option;
+            if (tabs.length > tabIndex + 1) {
+                tabs = tabs.slice(0, tabIndex + 1);
+            }
+            if (option[childrenKey]) {
+                const nextTab = {
+                    options: option[childrenKey],
+                    selected: null,
+                };
+                if (tabs[tabIndex + 1]) {
+                    tabs[tabIndex + 1] = nextTab;
+                }
+                else {
+                    tabs.push(nextTab);
+                }
+                wx.nextTick(() => {
+                    this.setData({
+                        activeTab: tabIndex + 1,
+                    });
+                });
+            }
+            this.setData({
+                tabs,
+            });
+            const selectedOptions = tabs.map((tab) => tab.selected).filter(Boolean);
+            const params = {
+                value: option[valueKey],
+                tabIndex,
+                selectedOptions,
+            };
+            this.$emit('change', params);
+            if (!option[childrenKey]) {
+                this.$emit('finish', params);
+            }
+        },
+    },
+});

+ 8 - 0
wxcomponents/vant/cascader/index.json

@@ -0,0 +1,8 @@
+{
+  "component": true,
+  "usingComponents": {
+    "van-icon": "../icon/index",
+    "van-tab":  "../tab/index",
+    "van-tabs": "../tabs/index"
+  }
+}

+ 53 - 0
wxcomponents/vant/cascader/index.wxml

@@ -0,0 +1,53 @@
+<wxs src="./index.wxs" module="utils" />
+
+<view wx:if="{{ showHeader }}" class="van-cascader__header">
+  <text class="van-cascader__title"><slot name="title"></slot>{{ title }}</text>
+  <van-icon
+    wx:if="{{ closeable }}"
+    name="{{ closeIcon }}"
+    class="van-cascader__close-icon"
+    bind:tap="onClose"
+  />
+</view>
+
+<van-tabs
+  active="{{ activeTab }}"
+  custom-class="van-cascader__tabs"
+  wrap-class="van-cascader__tabs-wrap"
+  tab-class="van-cascader__tab"
+  color="{{ activeColor }}"
+  border="{{ false }}"
+  swipeable="{{ swipeable }}"
+  bind:click="onClickTab"
+>
+  <van-tab
+    wx:for="{{ tabs }}"
+    wx:for-item="tab"
+    wx:for-index="tabIndex"
+    wx:key="tabIndex"
+    title="{{ tab.selected ? tab.selected[textKey] : placeholder }}"
+    style="width: 100%;"
+    title-style="{{ !tab.selected ? 'color: #969799;font-weight:normal;' : '' }}"
+  >
+    <!-- 暂不支持 -->
+    <!-- <slot name="options-top"></slot> -->
+
+    <view class="van-cascader__options">
+      <view
+        wx:for="{{ tab.options }}"
+        wx:for-item="option"
+        wx:key="index"
+        class="{{ option.className }} {{ utils.optionClass(tab, textKey, option) }}"
+        style="{{ utils.optionStyle({ tab, textKey, option, activeColor }) }}"
+        data-option="{{ option }}"
+        data-tab-index="{{ tabIndex }}"
+        bind:tap="onSelect"
+      >
+        <text>{{ option[textKey] }}</text>
+        <van-icon wx:if="{{ utils.isSelected(tab, textKey, option) }}" name="success" size="18" />
+      </view>
+    </view>
+    <!-- 暂不支持 -->
+    <!-- <slot name="options-bottom"></slot> -->
+  </van-tab>
+</van-tabs>

+ 24 - 0
wxcomponents/vant/cascader/index.wxs

@@ -0,0 +1,24 @@
+var utils = require('../wxs/utils.wxs');
+var style = require('../wxs/style.wxs');
+
+function isSelected(tab, textKey, option) {
+  return tab.selected && tab.selected[textKey] === option[textKey]
+}
+
+function optionClass(tab, textKey, option) {
+  return utils.bem('cascader__option', { selected: isSelected({ tab, textKey, option }), disabled: option.disabled })
+}
+
+function optionStyle(data) {
+  var color = data.option.color || (isSelected(data.tab, data.textKey, data.option) ? data.activeColor : undefined);
+  return style({
+    color
+  });
+}
+
+
+module.exports = {
+  isSelected: isSelected,
+  optionClass: optionClass,
+  optionStyle: optionStyle,
+};

+ 1 - 0
wxcomponents/vant/cascader/index.wxss

@@ -0,0 +1 @@
+@import '../common/index.wxss';.van-cascader__header{align-items:center;display:flex;height:48px;justify-content:space-between;padding:0 16px}.van-cascader__title{font-size:16px;font-weight:600;line-height:20px}.van-cascader__close-icon{color:#c8c9cc;font-size:22px;height:22px}.van-cascader__tabs-wrap{height:48px!important;padding:0 8px}.van-cascader__tab{color:#323233!important;flex:none!important;font-weight:600!important;padding:0 8px!important}.van-cascader__tab--unselected{color:#969799!important;font-weight:400!important}.van-cascader__option{align-items:center;cursor:pointer;display:flex;font-size:14px;justify-content:space-between;line-height:20px;padding:10px 16px}.van-cascader__option:active{background-color:#f2f3f5}.van-cascader__option--selected{color:#1989fa;font-weight:600}.van-cascader__option--disabled{color:#c8c9cc;cursor:not-allowed}.van-cascader__option--disabled:active{background-color:initial}.van-cascader__options{-webkit-overflow-scrolling:touch;box-sizing:border-box;height:384px;overflow-y:auto;padding-top:6px}

+ 7 - 6
wxcomponents/vant/cell-group/index.js

@@ -1,10 +1,11 @@
 import { VantComponent } from '../common/component';
 VantComponent({
-  props: {
-    title: String,
-    border: {
-      type: Boolean,
-      value: true,
+    props: {
+        title: String,
+        border: {
+            type: Boolean,
+            value: true,
+        },
+        inset: Boolean,
     },
-  },
 });

+ 4 - 2
wxcomponents/vant/cell-group/index.wxml

@@ -1,9 +1,11 @@
+<wxs src="../wxs/utils.wxs" module="utils" />
+
 <view
   wx:if="{{ title }}"
-  class="van-cell-group__title"
+  class="{{ utils.bem('cell-group__title', { inset }) }}"
 >
   {{ title }}
 </view>
-<view class="custom-class van-cell-group {{ border ? 'van-hairline--top-bottom' : '' }}">
+<view class="custom-class {{ utils.bem('cell-group', { inset }) }} {{ border ? 'van-hairline--top-bottom' : '' }}">
   <slot />
 </view>

+ 1 - 1
wxcomponents/vant/cell-group/index.wxss

@@ -1 +1 @@
-@import '../common/index.wxss';.van-cell-group__title{padding:16px 16px 8px;padding:var(--cell-group-title-padding,16px 16px 8px);font-size:14px;font-size:var(--cell-group-title-font-size,14px);line-height:16px;line-height:var(--cell-group-title-line-height,16px);color:#969799;color:var(--cell-group-title-color,#969799)}
+@import '../common/index.wxss';.van-cell-group--inset{border-radius:var(--cell-group-inset-border-radius,8px);margin:var(--cell-group-inset-padding,0 16px);overflow:hidden}.van-cell-group__title{color:var(--cell-group-title-color,#969799);font-size:var(--cell-group-title-font-size,14px);line-height:var(--cell-group-title-line-height,16px);padding:var(--cell-group-title-padding,16px 16px 8px)}.van-cell-group__title--inset{padding:var(--cell-group-inset-title-padding,16px 16px 8px 32px)}

+ 32 - 32
wxcomponents/vant/cell/index.js

@@ -1,38 +1,38 @@
 import { link } from '../mixins/link';
 import { VantComponent } from '../common/component';
 VantComponent({
-  classes: [
-    'title-class',
-    'label-class',
-    'value-class',
-    'right-icon-class',
-    'hover-class',
-  ],
-  mixins: [link],
-  props: {
-    title: null,
-    value: null,
-    icon: String,
-    size: String,
-    label: String,
-    center: Boolean,
-    isLink: Boolean,
-    required: Boolean,
-    clickable: Boolean,
-    titleWidth: String,
-    customStyle: String,
-    arrowDirection: String,
-    useLabelSlot: Boolean,
-    border: {
-      type: Boolean,
-      value: true,
+    classes: [
+        'title-class',
+        'label-class',
+        'value-class',
+        'right-icon-class',
+        'hover-class',
+    ],
+    mixins: [link],
+    props: {
+        title: null,
+        value: null,
+        icon: String,
+        size: String,
+        label: String,
+        center: Boolean,
+        isLink: Boolean,
+        required: Boolean,
+        clickable: Boolean,
+        titleWidth: String,
+        customStyle: String,
+        arrowDirection: String,
+        useLabelSlot: Boolean,
+        border: {
+            type: Boolean,
+            value: true,
+        },
+        titleStyle: String,
     },
-    titleStyle: String,
-  },
-  methods: {
-    onClick(event) {
-      this.$emit('click', event.detail);
-      this.jumpLink();
+    methods: {
+        onClick(event) {
+            this.$emit('click', event.detail);
+            this.jumpLink();
+        },
     },
-  },
 });

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
wxcomponents/vant/cell/index.wxss


+ 30 - 30
wxcomponents/vant/checkbox-group/index.js

@@ -1,36 +1,36 @@
 import { useChildren } from '../common/relation';
 import { VantComponent } from '../common/component';
 VantComponent({
-  field: true,
-  relation: useChildren('checkbox', function (target) {
-    this.updateChild(target);
-  }),
-  props: {
-    max: Number,
-    value: {
-      type: Array,
-      observer: 'updateChildren',
+    field: true,
+    relation: useChildren('checkbox', function (target) {
+        this.updateChild(target);
+    }),
+    props: {
+        max: Number,
+        value: {
+            type: Array,
+            observer: 'updateChildren',
+        },
+        disabled: {
+            type: Boolean,
+            observer: 'updateChildren',
+        },
+        direction: {
+            type: String,
+            value: 'vertical',
+        },
     },
-    disabled: {
-      type: Boolean,
-      observer: 'updateChildren',
+    methods: {
+        updateChildren() {
+            this.children.forEach((child) => this.updateChild(child));
+        },
+        updateChild(child) {
+            const { value, disabled, direction } = this.data;
+            child.setData({
+                value: value.indexOf(child.data.name) !== -1,
+                parentDisabled: disabled,
+                direction,
+            });
+        },
     },
-    direction: {
-      type: String,
-      value: 'vertical',
-    },
-  },
-  methods: {
-    updateChildren() {
-      this.children.forEach((child) => this.updateChild(child));
-    },
-    updateChild(child) {
-      const { value, disabled, direction } = this.data;
-      child.setData({
-        value: value.indexOf(child.data.name) !== -1,
-        parentDisabled: disabled,
-        direction,
-      });
-    },
-  },
 });

+ 1 - 1
wxcomponents/vant/checkbox-group/index.wxss

@@ -1 +1 @@
-@import '../common/index.wxss';.van-checkbox-group--horizontal{display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap}
+@import '../common/index.wxss';.van-checkbox-group--horizontal{display:flex;flex-wrap:wrap}

+ 68 - 66
wxcomponents/vant/checkbox/index.js

@@ -1,75 +1,77 @@
 import { useParent } from '../common/relation';
 import { VantComponent } from '../common/component';
 function emit(target, value) {
-  target.$emit('input', value);
-  target.$emit('change', value);
+    target.$emit('input', value);
+    target.$emit('change', value);
 }
 VantComponent({
-  field: true,
-  relation: useParent('checkbox-group'),
-  classes: ['icon-class', 'label-class'],
-  props: {
-    value: Boolean,
-    disabled: Boolean,
-    useIconSlot: Boolean,
-    checkedColor: String,
-    labelPosition: {
-      type: String,
-      value: 'right',
+    field: true,
+    relation: useParent('checkbox-group'),
+    classes: ['icon-class', 'label-class'],
+    props: {
+        value: Boolean,
+        disabled: Boolean,
+        useIconSlot: Boolean,
+        checkedColor: String,
+        labelPosition: {
+            type: String,
+            value: 'right',
+        },
+        labelDisabled: Boolean,
+        shape: {
+            type: String,
+            value: 'round',
+        },
+        iconSize: {
+            type: null,
+            value: 20,
+        },
     },
-    labelDisabled: Boolean,
-    shape: {
-      type: String,
-      value: 'round',
+    data: {
+        parentDisabled: false,
+        direction: 'vertical',
     },
-    iconSize: {
-      type: null,
-      value: 20,
+    methods: {
+        emitChange(value) {
+            if (this.parent) {
+                this.setParentValue(this.parent, value);
+            }
+            else {
+                emit(this, value);
+            }
+        },
+        toggle() {
+            const { parentDisabled, disabled, value } = this.data;
+            if (!disabled && !parentDisabled) {
+                this.emitChange(!value);
+            }
+        },
+        onClickLabel() {
+            const { labelDisabled, parentDisabled, disabled, value } = this.data;
+            if (!disabled && !labelDisabled && !parentDisabled) {
+                this.emitChange(!value);
+            }
+        },
+        setParentValue(parent, value) {
+            const parentValue = parent.data.value.slice();
+            const { name } = this.data;
+            const { max } = parent.data;
+            if (value) {
+                if (max && parentValue.length >= max) {
+                    return;
+                }
+                if (parentValue.indexOf(name) === -1) {
+                    parentValue.push(name);
+                    emit(parent, parentValue);
+                }
+            }
+            else {
+                const index = parentValue.indexOf(name);
+                if (index !== -1) {
+                    parentValue.splice(index, 1);
+                    emit(parent, parentValue);
+                }
+            }
+        },
     },
-  },
-  data: {
-    parentDisabled: false,
-    direction: 'vertical',
-  },
-  methods: {
-    emitChange(value) {
-      if (this.parent) {
-        this.setParentValue(this.parent, value);
-      } else {
-        emit(this, value);
-      }
-    },
-    toggle() {
-      const { parentDisabled, disabled, value } = this.data;
-      if (!disabled && !parentDisabled) {
-        this.emitChange(!value);
-      }
-    },
-    onClickLabel() {
-      const { labelDisabled, parentDisabled, disabled, value } = this.data;
-      if (!disabled && !labelDisabled && !parentDisabled) {
-        this.emitChange(!value);
-      }
-    },
-    setParentValue(parent, value) {
-      const parentValue = parent.data.value.slice();
-      const { name } = this.data;
-      const { max } = parent.data;
-      if (value) {
-        if (max && parentValue.length >= max) {
-          return;
-        }
-        if (parentValue.indexOf(name) === -1) {
-          parentValue.push(name);
-          emit(parent, parentValue);
-        }
-      } else {
-        const index = parentValue.indexOf(name);
-        if (index !== -1) {
-          parentValue.splice(index, 1);
-          emit(parent, parentValue);
-        }
-      }
-    },
-  },
 });

+ 1 - 1
wxcomponents/vant/checkbox/index.wxss

@@ -1 +1 @@
-@import '../common/index.wxss';.van-checkbox{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;overflow:hidden;-webkit-user-select:none;user-select:none}.van-checkbox--horizontal{margin-right:12px}.van-checkbox__icon-wrap,.van-checkbox__label{line-height:20px;line-height:var(--checkbox-size,20px)}.van-checkbox__icon-wrap{-webkit-flex:none;flex:none}.van-checkbox__icon{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;box-sizing:border-box;width:1em;height:1em;color:transparent;text-align:center;transition-property:color,border-color,background-color;font-size:20px;font-size:var(--checkbox-size,20px);border:1px solid #c8c9cc;border:1px solid var(--checkbox-border-color,#c8c9cc);transition-duration:.2s;transition-duration:var(--checkbox-transition-duration,.2s)}.van-checkbox__icon--round{border-radius:100%}.van-checkbox__icon--checked{color:#fff;color:var(--white,#fff);background-color:#1989fa;background-color:var(--checkbox-checked-icon-color,#1989fa);border-color:#1989fa;border-color:var(--checkbox-checked-icon-color,#1989fa)}.van-checkbox__icon--disabled{background-color:#ebedf0;background-color:var(--checkbox-disabled-background-color,#ebedf0);border-color:#c8c9cc;border-color:var(--checkbox-disabled-icon-color,#c8c9cc)}.van-checkbox__icon--disabled.van-checkbox__icon--checked{color:#c8c9cc;color:var(--checkbox-disabled-icon-color,#c8c9cc)}.van-checkbox__label{word-wrap:break-word;margin-left:10px;margin-left:var(--checkbox-label-margin,10px);color:#323233;color:var(--checkbox-label-color,#323233)}.van-checkbox__label--left{float:left;margin:0 10px 0 0;margin:0 var(--checkbox-label-margin,10px) 0 0}.van-checkbox__label--disabled{color:#c8c9cc;color:var(--checkbox-disabled-label-color,#c8c9cc)}.van-checkbox__label:empty{margin:0}
+@import '../common/index.wxss';.van-checkbox{align-items:center;display:flex;overflow:hidden;-webkit-user-select:none;user-select:none}.van-checkbox--horizontal{margin-right:12px}.van-checkbox__icon-wrap,.van-checkbox__label{line-height:var(--checkbox-size,20px)}.van-checkbox__icon-wrap{flex:none}.van-checkbox__icon{align-items:center;border:1px solid var(--checkbox-border-color,#c8c9cc);box-sizing:border-box;color:transparent;display:flex;font-size:var(--checkbox-size,20px);height:1em;justify-content:center;text-align:center;transition-duration:var(--checkbox-transition-duration,.2s);transition-property:color,border-color,background-color;width:1em}.van-checkbox__icon--round{border-radius:100%}.van-checkbox__icon--checked{background-color:var(--checkbox-checked-icon-color,#1989fa);border-color:var(--checkbox-checked-icon-color,#1989fa);color:#fff}.van-checkbox__icon--disabled{background-color:var(--checkbox-disabled-background-color,#ebedf0);border-color:var(--checkbox-disabled-icon-color,#c8c9cc)}.van-checkbox__icon--disabled.van-checkbox__icon--checked{color:var(--checkbox-disabled-icon-color,#c8c9cc)}.van-checkbox__label{word-wrap:break-word;color:var(--checkbox-label-color,#323233);padding-left:var(--checkbox-label-margin,10px)}.van-checkbox__label--left{float:left;margin:0 var(--checkbox-label-margin,10px) 0 0}.van-checkbox__label--disabled{color:var(--checkbox-disabled-label-color,#c8c9cc)}.van-checkbox__label:empty{margin:0}

+ 2 - 4
wxcomponents/vant/circle/canvas.d.ts

@@ -1,6 +1,4 @@
 /// <reference types="miniprogram-api-typings" />
-declare type CanvasContext = WechatMiniprogram.CanvasContext;
-export declare function adaptor(
-  ctx: CanvasContext & Record<string, unknown>
-): CanvasContext;
+type CanvasContext = WechatMiniprogram.CanvasContext;
+export declare function adaptor(ctx: CanvasContext & Record<string, unknown>): CanvasContext;
 export {};

+ 41 - 41
wxcomponents/vant/circle/canvas.js

@@ -1,43 +1,43 @@
 export function adaptor(ctx) {
-  // @ts-ignore
-  return Object.assign(ctx, {
-    setStrokeStyle(val) {
-      ctx.strokeStyle = val;
-    },
-    setLineWidth(val) {
-      ctx.lineWidth = val;
-    },
-    setLineCap(val) {
-      ctx.lineCap = val;
-    },
-    setFillStyle(val) {
-      ctx.fillStyle = val;
-    },
-    setFontSize(val) {
-      ctx.font = String(val);
-    },
-    setGlobalAlpha(val) {
-      ctx.globalAlpha = val;
-    },
-    setLineJoin(val) {
-      ctx.lineJoin = val;
-    },
-    setTextAlign(val) {
-      ctx.textAlign = val;
-    },
-    setMiterLimit(val) {
-      ctx.miterLimit = val;
-    },
-    setShadow(offsetX, offsetY, blur, color) {
-      ctx.shadowOffsetX = offsetX;
-      ctx.shadowOffsetY = offsetY;
-      ctx.shadowBlur = blur;
-      ctx.shadowColor = color;
-    },
-    setTextBaseline(val) {
-      ctx.textBaseline = val;
-    },
-    createCircularGradient() {},
-    draw() {},
-  });
+    // @ts-ignore
+    return Object.assign(ctx, {
+        setStrokeStyle(val) {
+            ctx.strokeStyle = val;
+        },
+        setLineWidth(val) {
+            ctx.lineWidth = val;
+        },
+        setLineCap(val) {
+            ctx.lineCap = val;
+        },
+        setFillStyle(val) {
+            ctx.fillStyle = val;
+        },
+        setFontSize(val) {
+            ctx.font = String(val);
+        },
+        setGlobalAlpha(val) {
+            ctx.globalAlpha = val;
+        },
+        setLineJoin(val) {
+            ctx.lineJoin = val;
+        },
+        setTextAlign(val) {
+            ctx.textAlign = val;
+        },
+        setMiterLimit(val) {
+            ctx.miterLimit = val;
+        },
+        setShadow(offsetX, offsetY, blur, color) {
+            ctx.shadowOffsetX = offsetX;
+            ctx.shadowOffsetY = offsetY;
+            ctx.shadowBlur = blur;
+            ctx.shadowColor = color;
+        },
+        setTextBaseline(val) {
+            ctx.textBaseline = val;
+        },
+        createCircularGradient() { },
+        draw() { },
+    });
 }

+ 175 - 172
wxcomponents/vant/circle/index.js

@@ -5,186 +5,189 @@ import { isObj } from '../common/validator';
 import { canIUseCanvas2d } from '../common/version';
 import { adaptor } from './canvas';
 function format(rate) {
-  return Math.min(Math.max(rate, 0), 100);
+    return Math.min(Math.max(rate, 0), 100);
 }
 const PERIMETER = 2 * Math.PI;
 const BEGIN_ANGLE = -Math.PI / 2;
 const STEP = 1;
 VantComponent({
-  props: {
-    text: String,
-    lineCap: {
-      type: String,
-      value: 'round',
-    },
-    value: {
-      type: Number,
-      value: 0,
-      observer: 'reRender',
-    },
-    speed: {
-      type: Number,
-      value: 50,
-    },
-    size: {
-      type: Number,
-      value: 100,
-      observer() {
-        this.drawCircle(this.currentValue);
-      },
-    },
-    fill: String,
-    layerColor: {
-      type: String,
-      value: WHITE,
-    },
-    color: {
-      type: null,
-      value: BLUE,
-      observer() {
-        this.setHoverColor().then(() => {
-          this.drawCircle(this.currentValue);
-        });
-      },
-    },
-    type: {
-      type: String,
-      value: '',
-    },
-    strokeWidth: {
-      type: Number,
-      value: 4,
-    },
-    clockwise: {
-      type: Boolean,
-      value: true,
-    },
-  },
-  data: {
-    hoverColor: BLUE,
-  },
-  methods: {
-    getContext() {
-      const { type, size } = this.data;
-      if (type === '' || !canIUseCanvas2d()) {
-        const ctx = wx.createCanvasContext('van-circle', this);
-        return Promise.resolve(ctx);
-      }
-      const dpr = getSystemInfoSync().pixelRatio;
-      return new Promise((resolve) => {
-        wx.createSelectorQuery()
-          .in(this)
-          .select('#van-circle')
-          .node()
-          .exec((res) => {
-            const canvas = res[0].node;
-            const ctx = canvas.getContext(type);
-            if (!this.inited) {
-              this.inited = true;
-              canvas.width = size * dpr;
-              canvas.height = size * dpr;
-              ctx.scale(dpr, dpr);
+    props: {
+        text: String,
+        lineCap: {
+            type: String,
+            value: 'round',
+        },
+        value: {
+            type: Number,
+            value: 0,
+            observer: 'reRender',
+        },
+        speed: {
+            type: Number,
+            value: 50,
+        },
+        size: {
+            type: Number,
+            value: 100,
+            observer() {
+                this.drawCircle(this.currentValue);
+            },
+        },
+        fill: String,
+        layerColor: {
+            type: String,
+            value: WHITE,
+        },
+        color: {
+            type: null,
+            value: BLUE,
+            observer() {
+                this.setHoverColor().then(() => {
+                    this.drawCircle(this.currentValue);
+                });
+            },
+        },
+        type: {
+            type: String,
+            value: '',
+        },
+        strokeWidth: {
+            type: Number,
+            value: 4,
+        },
+        clockwise: {
+            type: Boolean,
+            value: true,
+        },
+    },
+    data: {
+        hoverColor: BLUE,
+    },
+    methods: {
+        getContext() {
+            const { type, size } = this.data;
+            if (type === '' || !canIUseCanvas2d()) {
+                const ctx = wx.createCanvasContext('van-circle', this);
+                return Promise.resolve(ctx);
             }
-            resolve(adaptor(ctx));
-          });
-      });
+            const dpr = getSystemInfoSync().pixelRatio;
+            return new Promise((resolve) => {
+                wx.createSelectorQuery()
+                    .in(this)
+                    .select('#van-circle')
+                    .node()
+                    .exec((res) => {
+                    const canvas = res[0].node;
+                    const ctx = canvas.getContext(type);
+                    if (!this.inited) {
+                        this.inited = true;
+                        canvas.width = size * dpr;
+                        canvas.height = size * dpr;
+                        ctx.scale(dpr, dpr);
+                    }
+                    resolve(adaptor(ctx));
+                });
+            });
+        },
+        setHoverColor() {
+            const { color, size } = this.data;
+            if (isObj(color)) {
+                return this.getContext().then((context) => {
+                    const LinearColor = context.createLinearGradient(size, 0, 0, 0);
+                    Object.keys(color)
+                        .sort((a, b) => parseFloat(a) - parseFloat(b))
+                        .map((key) => LinearColor.addColorStop(parseFloat(key) / 100, color[key]));
+                    this.hoverColor = LinearColor;
+                });
+            }
+            this.hoverColor = color;
+            return Promise.resolve();
+        },
+        presetCanvas(context, strokeStyle, beginAngle, endAngle, fill) {
+            const { strokeWidth, lineCap, clockwise, size } = this.data;
+            const position = size / 2;
+            const radius = position - strokeWidth / 2;
+            context.setStrokeStyle(strokeStyle);
+            context.setLineWidth(strokeWidth);
+            context.setLineCap(lineCap);
+            context.beginPath();
+            context.arc(position, position, radius, beginAngle, endAngle, !clockwise);
+            context.stroke();
+            if (fill) {
+                context.setFillStyle(fill);
+                context.fill();
+            }
+        },
+        renderLayerCircle(context) {
+            const { layerColor, fill } = this.data;
+            this.presetCanvas(context, layerColor, 0, PERIMETER, fill);
+        },
+        renderHoverCircle(context, formatValue) {
+            const { clockwise } = this.data;
+            // 结束角度
+            const progress = PERIMETER * (formatValue / 100);
+            const endAngle = clockwise
+                ? BEGIN_ANGLE + progress
+                : 3 * Math.PI - (BEGIN_ANGLE + progress);
+            this.presetCanvas(context, this.hoverColor, BEGIN_ANGLE, endAngle);
+        },
+        drawCircle(currentValue) {
+            const { size } = this.data;
+            this.getContext().then((context) => {
+                context.clearRect(0, 0, size, size);
+                this.renderLayerCircle(context);
+                const formatValue = format(currentValue);
+                if (formatValue !== 0) {
+                    this.renderHoverCircle(context, formatValue);
+                }
+                context.draw();
+            });
+        },
+        reRender() {
+            // tofector 动画暂时没有想到好的解决方案
+            const { value, speed } = this.data;
+            if (speed <= 0 || speed > 1000) {
+                this.drawCircle(value);
+                return;
+            }
+            this.clearMockInterval();
+            this.currentValue = this.currentValue || 0;
+            const run = () => {
+                this.interval = setTimeout(() => {
+                    if (this.currentValue !== value) {
+                        if (Math.abs(this.currentValue - value) < STEP) {
+                            this.currentValue = value;
+                        }
+                        else if (this.currentValue < value) {
+                            this.currentValue += STEP;
+                        }
+                        else {
+                            this.currentValue -= STEP;
+                        }
+                        this.drawCircle(this.currentValue);
+                        run();
+                    }
+                    else {
+                        this.clearMockInterval();
+                    }
+                }, 1000 / speed);
+            };
+            run();
+        },
+        clearMockInterval() {
+            if (this.interval) {
+                clearTimeout(this.interval);
+                this.interval = null;
+            }
+        },
     },
-    setHoverColor() {
-      const { color, size } = this.data;
-      if (isObj(color)) {
-        return this.getContext().then((context) => {
-          const LinearColor = context.createLinearGradient(size, 0, 0, 0);
-          Object.keys(color)
-            .sort((a, b) => parseFloat(a) - parseFloat(b))
-            .map((key) =>
-              LinearColor.addColorStop(parseFloat(key) / 100, color[key])
-            );
-          this.hoverColor = LinearColor;
+    mounted() {
+        this.currentValue = this.data.value;
+        this.setHoverColor().then(() => {
+            this.drawCircle(this.currentValue);
         });
-      }
-      this.hoverColor = color;
-      return Promise.resolve();
-    },
-    presetCanvas(context, strokeStyle, beginAngle, endAngle, fill) {
-      const { strokeWidth, lineCap, clockwise, size } = this.data;
-      const position = size / 2;
-      const radius = position - strokeWidth / 2;
-      context.setStrokeStyle(strokeStyle);
-      context.setLineWidth(strokeWidth);
-      context.setLineCap(lineCap);
-      context.beginPath();
-      context.arc(position, position, radius, beginAngle, endAngle, !clockwise);
-      context.stroke();
-      if (fill) {
-        context.setFillStyle(fill);
-        context.fill();
-      }
-    },
-    renderLayerCircle(context) {
-      const { layerColor, fill } = this.data;
-      this.presetCanvas(context, layerColor, 0, PERIMETER, fill);
-    },
-    renderHoverCircle(context, formatValue) {
-      const { clockwise } = this.data;
-      // 结束角度
-      const progress = PERIMETER * (formatValue / 100);
-      const endAngle = clockwise
-        ? BEGIN_ANGLE + progress
-        : 3 * Math.PI - (BEGIN_ANGLE + progress);
-      this.presetCanvas(context, this.hoverColor, BEGIN_ANGLE, endAngle);
-    },
-    drawCircle(currentValue) {
-      const { size } = this.data;
-      this.getContext().then((context) => {
-        context.clearRect(0, 0, size, size);
-        this.renderLayerCircle(context);
-        const formatValue = format(currentValue);
-        if (formatValue !== 0) {
-          this.renderHoverCircle(context, formatValue);
-        }
-        context.draw();
-      });
-    },
-    reRender() {
-      // tofector 动画暂时没有想到好的解决方案
-      const { value, speed } = this.data;
-      if (speed <= 0 || speed > 1000) {
-        this.drawCircle(value);
-        return;
-      }
-      this.clearInterval();
-      this.currentValue = this.currentValue || 0;
-      this.interval = setInterval(() => {
-        if (this.currentValue !== value) {
-          if (Math.abs(this.currentValue - value) < STEP) {
-            this.currentValue = value;
-          } else {
-            if (this.currentValue < value) {
-              this.currentValue += STEP;
-            } else {
-              this.currentValue -= STEP;
-            }
-          }
-          this.drawCircle(this.currentValue);
-        } else {
-          this.clearInterval();
-        }
-      }, 1000 / speed);
     },
-    clearInterval() {
-      if (this.interval) {
-        clearInterval(this.interval);
-        this.interval = null;
-      }
+    destroyed() {
+        this.clearMockInterval();
     },
-  },
-  mounted() {
-    this.currentValue = this.data.value;
-    this.setHoverColor().then(() => {
-      this.drawCircle(this.currentValue);
-    });
-  },
-  destroyed() {
-    this.clearInterval();
-  },
 });

+ 1 - 1
wxcomponents/vant/circle/index.wxss

@@ -1 +1 @@
-@import '../common/index.wxss';.van-circle{position:relative;display:inline-block;text-align:center}.van-circle__text{position:absolute;top:50%;left:0;width:100%;-webkit-transform:translateY(-50%);transform:translateY(-50%);color:#323233;color:var(--circle-text-color,#323233)}
+@import '../common/index.wxss';.van-circle{display:inline-block;position:relative;text-align:center}.van-circle__text{color:var(--circle-text-color,#323233);left:0;position:absolute;top:50%;transform:translateY(-50%);width:100%}

+ 5 - 5
wxcomponents/vant/col/index.js

@@ -1,9 +1,9 @@
 import { useParent } from '../common/relation';
 import { VantComponent } from '../common/component';
 VantComponent({
-  relation: useParent('row'),
-  props: {
-    span: Number,
-    offset: Number,
-  },
+    relation: useParent('row'),
+    props: {
+        span: Number,
+        offset: Number,
+    },
 });

+ 1 - 1
wxcomponents/vant/col/index.wxss

@@ -1 +1 @@
-@import '../common/index.wxss';.van-col{float:left;box-sizing:border-box}.van-col--1{width:4.16666667%}.van-col--offset-1{margin-left:4.16666667%}.van-col--2{width:8.33333333%}.van-col--offset-2{margin-left:8.33333333%}.van-col--3{width:12.5%}.van-col--offset-3{margin-left:12.5%}.van-col--4{width:16.66666667%}.van-col--offset-4{margin-left:16.66666667%}.van-col--5{width:20.83333333%}.van-col--offset-5{margin-left:20.83333333%}.van-col--6{width:25%}.van-col--offset-6{margin-left:25%}.van-col--7{width:29.16666667%}.van-col--offset-7{margin-left:29.16666667%}.van-col--8{width:33.33333333%}.van-col--offset-8{margin-left:33.33333333%}.van-col--9{width:37.5%}.van-col--offset-9{margin-left:37.5%}.van-col--10{width:41.66666667%}.van-col--offset-10{margin-left:41.66666667%}.van-col--11{width:45.83333333%}.van-col--offset-11{margin-left:45.83333333%}.van-col--12{width:50%}.van-col--offset-12{margin-left:50%}.van-col--13{width:54.16666667%}.van-col--offset-13{margin-left:54.16666667%}.van-col--14{width:58.33333333%}.van-col--offset-14{margin-left:58.33333333%}.van-col--15{width:62.5%}.van-col--offset-15{margin-left:62.5%}.van-col--16{width:66.66666667%}.van-col--offset-16{margin-left:66.66666667%}.van-col--17{width:70.83333333%}.van-col--offset-17{margin-left:70.83333333%}.van-col--18{width:75%}.van-col--offset-18{margin-left:75%}.van-col--19{width:79.16666667%}.van-col--offset-19{margin-left:79.16666667%}.van-col--20{width:83.33333333%}.van-col--offset-20{margin-left:83.33333333%}.van-col--21{width:87.5%}.van-col--offset-21{margin-left:87.5%}.van-col--22{width:91.66666667%}.van-col--offset-22{margin-left:91.66666667%}.van-col--23{width:95.83333333%}.van-col--offset-23{margin-left:95.83333333%}.van-col--24{width:100%}.van-col--offset-24{margin-left:100%}
+@import '../common/index.wxss';.van-col{box-sizing:border-box;float:left}.van-col--1{width:4.16666667%}.van-col--offset-1{margin-left:4.16666667%}.van-col--2{width:8.33333333%}.van-col--offset-2{margin-left:8.33333333%}.van-col--3{width:12.5%}.van-col--offset-3{margin-left:12.5%}.van-col--4{width:16.66666667%}.van-col--offset-4{margin-left:16.66666667%}.van-col--5{width:20.83333333%}.van-col--offset-5{margin-left:20.83333333%}.van-col--6{width:25%}.van-col--offset-6{margin-left:25%}.van-col--7{width:29.16666667%}.van-col--offset-7{margin-left:29.16666667%}.van-col--8{width:33.33333333%}.van-col--offset-8{margin-left:33.33333333%}.van-col--9{width:37.5%}.van-col--offset-9{margin-left:37.5%}.van-col--10{width:41.66666667%}.van-col--offset-10{margin-left:41.66666667%}.van-col--11{width:45.83333333%}.van-col--offset-11{margin-left:45.83333333%}.van-col--12{width:50%}.van-col--offset-12{margin-left:50%}.van-col--13{width:54.16666667%}.van-col--offset-13{margin-left:54.16666667%}.van-col--14{width:58.33333333%}.van-col--offset-14{margin-left:58.33333333%}.van-col--15{width:62.5%}.van-col--offset-15{margin-left:62.5%}.van-col--16{width:66.66666667%}.van-col--offset-16{margin-left:66.66666667%}.van-col--17{width:70.83333333%}.van-col--offset-17{margin-left:70.83333333%}.van-col--18{width:75%}.van-col--offset-18{margin-left:75%}.van-col--19{width:79.16666667%}.van-col--offset-19{margin-left:79.16666667%}.van-col--20{width:83.33333333%}.van-col--offset-20{margin-left:83.33333333%}.van-col--21{width:87.5%}.van-col--offset-21{margin-left:87.5%}.van-col--22{width:91.66666667%}.van-col--offset-22{margin-left:91.66666667%}.van-col--23{width:95.83333333%}.van-col--offset-23{margin-left:95.83333333%}.van-col--24{width:100%}.van-col--offset-24{margin-left:100%}

+ 1 - 5
wxcomponents/vant/collapse-item/animate.d.ts

@@ -1,6 +1,2 @@
 /// <reference types="miniprogram-api-typings" />
-export declare function setContentAnimate(
-  context: WechatMiniprogram.Component.TrivialInstance,
-  expanded: boolean,
-  mounted: boolean
-): void;
+export declare function setContentAnimate(context: WechatMiniprogram.Component.TrivialInstance, expanded: boolean, mounted: boolean): void;

+ 30 - 61
wxcomponents/vant/collapse-item/animate.js

@@ -1,70 +1,39 @@
-import { canIUseAnimate } from '../common/version';
 import { getRect } from '../common/utils';
-function useAnimate(context, expanded, mounted, height) {
-  const selector = '.van-collapse-item__wrapper';
-  if (expanded) {
-    context.animate(
-      selector,
-      [
-        { height: 0, ease: 'ease-in-out', offset: 0 },
-        { height: `${height}px`, ease: 'ease-in-out', offset: 1 },
-        { height: `auto`, ease: 'ease-in-out', offset: 1 },
-      ],
-      mounted ? 300 : 0,
-      () => {
-        context.clearAnimation(selector);
-      }
-    );
-    return;
-  }
-  context.animate(
-    selector,
-    [
-      { height: `${height}px`, ease: 'ease-in-out', offset: 0 },
-      { height: 0, ease: 'ease-in-out', offset: 1 },
-    ],
-    300,
-    () => {
-      context.clearAnimation(selector);
-    }
-  );
-}
 function useAnimation(context, expanded, mounted, height) {
-  const animation = wx.createAnimation({
-    duration: 0,
-    timingFunction: 'ease-in-out',
-  });
-  if (expanded) {
-    if (height === 0) {
-      animation.height('auto').top(1).step();
-    } else {
-      animation
-        .height(height)
-        .top(1)
-        .step({
-          duration: mounted ? 300 : 1,
-        })
-        .height('auto')
-        .step();
+    const animation = wx.createAnimation({
+        duration: 0,
+        timingFunction: 'ease-in-out',
+    });
+    if (expanded) {
+        if (height === 0) {
+            animation.height('auto').top(1).step();
+        }
+        else {
+            animation
+                .height(height)
+                .top(1)
+                .step({
+                duration: mounted ? 300 : 1,
+            })
+                .height('auto')
+                .step();
+        }
+        context.setData({
+            animation: animation.export(),
+        });
+        return;
     }
+    animation.height(height).top(0).step({ duration: 1 }).height(0).step({
+        duration: 300,
+    });
     context.setData({
-      animation: animation.export(),
+        animation: animation.export(),
     });
-    return;
-  }
-  animation.height(height).top(0).step({ duration: 1 }).height(0).step({
-    duration: 300,
-  });
-  context.setData({
-    animation: animation.export(),
-  });
 }
 export function setContentAnimate(context, expanded, mounted) {
-  getRect(context, '.van-collapse-item__content')
-    .then((rect) => rect.height)
-    .then((height) => {
-      canIUseAnimate()
-        ? useAnimate(context, expanded, mounted, height)
-        : useAnimation(context, expanded, mounted, height);
+    getRect(context, '.van-collapse-item__content')
+        .then((rect) => rect.height)
+        .then((height) => {
+        useAnimation(context, expanded, mounted, height);
     });
 }

+ 51 - 50
wxcomponents/vant/collapse-item/index.js

@@ -2,58 +2,59 @@ import { VantComponent } from '../common/component';
 import { useParent } from '../common/relation';
 import { setContentAnimate } from './animate';
 VantComponent({
-  classes: ['title-class', 'content-class'],
-  relation: useParent('collapse'),
-  props: {
-    name: null,
-    title: null,
-    value: null,
-    icon: String,
-    label: String,
-    disabled: Boolean,
-    clickable: Boolean,
-    border: {
-      type: Boolean,
-      value: true,
+    classes: ['title-class', 'content-class'],
+    relation: useParent('collapse'),
+    props: {
+        size: String,
+        name: null,
+        title: null,
+        value: null,
+        icon: String,
+        label: String,
+        disabled: Boolean,
+        clickable: Boolean,
+        border: {
+            type: Boolean,
+            value: true,
+        },
+        isLink: {
+            type: Boolean,
+            value: true,
+        },
     },
-    isLink: {
-      type: Boolean,
-      value: true,
+    data: {
+        expanded: false,
     },
-  },
-  data: {
-    expanded: false,
-  },
-  mounted() {
-    this.updateExpanded();
-    this.mounted = true;
-  },
-  methods: {
-    updateExpanded() {
-      if (!this.parent) {
-        return;
-      }
-      const { value, accordion } = this.parent.data;
-      const { children = [] } = this.parent;
-      const { name } = this.data;
-      const index = children.indexOf(this);
-      const currentName = name == null ? index : name;
-      const expanded = accordion
-        ? value === currentName
-        : (value || []).some((name) => name === currentName);
-      if (expanded !== this.data.expanded) {
-        setContentAnimate(this, expanded, this.mounted);
-      }
-      this.setData({ index, expanded });
+    mounted() {
+        this.updateExpanded();
+        this.mounted = true;
     },
-    onClick() {
-      if (this.data.disabled) {
-        return;
-      }
-      const { name, expanded } = this.data;
-      const index = this.parent.children.indexOf(this);
-      const currentName = name == null ? index : name;
-      this.parent.switch(currentName, !expanded);
+    methods: {
+        updateExpanded() {
+            if (!this.parent) {
+                return;
+            }
+            const { value, accordion } = this.parent.data;
+            const { children = [] } = this.parent;
+            const { name } = this.data;
+            const index = children.indexOf(this);
+            const currentName = name == null ? index : name;
+            const expanded = accordion
+                ? value === currentName
+                : (value || []).some((name) => name === currentName);
+            if (expanded !== this.data.expanded) {
+                setContentAnimate(this, expanded, this.mounted);
+            }
+            this.setData({ index, expanded });
+        },
+        onClick() {
+            if (this.data.disabled) {
+                return;
+            }
+            const { name, expanded } = this.data;
+            const index = this.parent.children.indexOf(this);
+            const currentName = name == null ? index : name;
+            this.parent.switch(currentName, !expanded);
+        },
     },
-  },
 });

+ 1 - 0
wxcomponents/vant/collapse-item/index.wxml

@@ -2,6 +2,7 @@
 
 <view class="van-collapse-item custom-class {{ index !== 0 ? 'van-hairline--top' : '' }}">
   <van-cell
+    size="{{ size }}"
     title="{{ title }}"
     title-class="title-class"
     icon="{{ icon }}"

+ 1 - 1
wxcomponents/vant/collapse-item/index.wxss

@@ -1 +1 @@
-@import '../common/index.wxss';.van-collapse-item__title .van-cell__right-icon{-webkit-transform:rotate(90deg);transform:rotate(90deg);transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;transition:-webkit-transform var(--collapse-item-transition-duration,.3s);transition:transform var(--collapse-item-transition-duration,.3s);transition:transform var(--collapse-item-transition-duration,.3s),-webkit-transform var(--collapse-item-transition-duration,.3s)}.van-collapse-item__title--expanded .van-cell__right-icon{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.van-collapse-item__title--disabled .van-cell,.van-collapse-item__title--disabled .van-cell__right-icon{color:#c8c9cc!important;color:var(--collapse-item-title-disabled-color,#c8c9cc)!important}.van-collapse-item__title--disabled .van-cell--hover{background-color:#fff!important;background-color:var(--white,#fff)!important}.van-collapse-item__wrapper{overflow:hidden}.van-collapse-item__content{padding:15px;padding:var(--collapse-item-content-padding,15px);color:#969799;color:var(--collapse-item-content-text-color,#969799);font-size:13px;font-size:var(--collapse-item-content-font-size,13px);line-height:1.5;line-height:var(--collapse-item-content-line-height,1.5);background-color:#fff;background-color:var(--collapse-item-content-background-color,#fff)}
+@import '../common/index.wxss';.van-collapse-item__title .van-cell__right-icon{transform:rotate(90deg);transition:transform var(--collapse-item-transition-duration,.3s)}.van-collapse-item__title--expanded .van-cell__right-icon{transform:rotate(-90deg)}.van-collapse-item__title--disabled .van-cell,.van-collapse-item__title--disabled .van-cell__right-icon{color:var(--collapse-item-title-disabled-color,#c8c9cc)!important}.van-collapse-item__title--disabled .van-cell--hover{background-color:#fff!important}.van-collapse-item__wrapper{overflow:hidden}.van-collapse-item__content{background-color:var(--collapse-item-content-background-color,#fff);color:var(--collapse-item-content-text-color,#969799);font-size:var(--collapse-item-content-font-size,13px);line-height:var(--collapse-item-content-line-height,1.5);padding:var(--collapse-item-content-padding,15px)}

+ 40 - 38
wxcomponents/vant/collapse/index.js

@@ -1,44 +1,46 @@
 import { VantComponent } from '../common/component';
 import { useChildren } from '../common/relation';
 VantComponent({
-  relation: useChildren('collapse-item'),
-  props: {
-    value: {
-      type: null,
-      observer: 'updateExpanded',
+    relation: useChildren('collapse-item'),
+    props: {
+        value: {
+            type: null,
+            observer: 'updateExpanded',
+        },
+        accordion: {
+            type: Boolean,
+            observer: 'updateExpanded',
+        },
+        border: {
+            type: Boolean,
+            value: true,
+        },
     },
-    accordion: {
-      type: Boolean,
-      observer: 'updateExpanded',
+    methods: {
+        updateExpanded() {
+            this.children.forEach((child) => {
+                child.updateExpanded();
+            });
+        },
+        switch(name, expanded) {
+            const { accordion, value } = this.data;
+            const changeItem = name;
+            if (!accordion) {
+                name = expanded
+                    ? (value || []).concat(name)
+                    : (value || []).filter((activeName) => activeName !== name);
+            }
+            else {
+                name = expanded ? name : '';
+            }
+            if (expanded) {
+                this.$emit('open', changeItem);
+            }
+            else {
+                this.$emit('close', changeItem);
+            }
+            this.$emit('change', name);
+            this.$emit('input', name);
+        },
     },
-    border: {
-      type: Boolean,
-      value: true,
-    },
-  },
-  methods: {
-    updateExpanded() {
-      this.children.forEach((child) => {
-        child.updateExpanded();
-      });
-    },
-    switch(name, expanded) {
-      const { accordion, value } = this.data;
-      const changeItem = name;
-      if (!accordion) {
-        name = expanded
-          ? (value || []).concat(name)
-          : (value || []).filter((activeName) => activeName !== name);
-      } else {
-        name = expanded ? name : '';
-      }
-      if (expanded) {
-        this.$emit('open', changeItem);
-      } else {
-        this.$emit('close', changeItem);
-      }
-      this.$emit('change', name);
-      this.$emit('input', name);
-    },
-  },
 });

+ 2 - 6
wxcomponents/vant/common/component.d.ts

@@ -1,8 +1,4 @@
 /// <reference types="miniprogram-api-typings" />
-import { VantComponentOptions } from '../definitions/index';
-declare function VantComponent<
-  Data extends WechatMiniprogram.Component.DataOption,
-  Props extends WechatMiniprogram.Component.PropertyOption,
-  Methods extends WechatMiniprogram.Component.MethodOption
->(vantOptions: VantComponentOptions<Data, Props, Methods>): void;
+import { VantComponentOptions } from 'definitions/index';
+declare function VantComponent<Data extends WechatMiniprogram.Component.DataOption, Props extends WechatMiniprogram.Component.PropertyOption, Methods extends WechatMiniprogram.Component.MethodOption>(vantOptions: VantComponentOptions<Data, Props, Methods>): void;
 export { VantComponent };

+ 40 - 39
wxcomponents/vant/common/component.js

@@ -1,45 +1,46 @@
 import { basic } from '../mixins/basic';
 function mapKeys(source, target, map) {
-  Object.keys(map).forEach((key) => {
-    if (source[key]) {
-      target[map[key]] = source[key];
-    }
-  });
+    Object.keys(map).forEach((key) => {
+        if (source[key]) {
+            target[map[key]] = source[key];
+        }
+    });
 }
 function VantComponent(vantOptions) {
-  const options = {};
-  mapKeys(vantOptions, options, {
-    data: 'data',
-    props: 'properties',
-    mixins: 'behaviors',
-    methods: 'methods',
-    beforeCreate: 'created',
-    created: 'attached',
-    mounted: 'ready',
-    destroyed: 'detached',
-    classes: 'externalClasses',
-  });
-  // add default externalClasses
-  options.externalClasses = options.externalClasses || [];
-  options.externalClasses.push('custom-class');
-  // add default behaviors
-  options.behaviors = options.behaviors || [];
-  options.behaviors.push(basic);
-  // add relations
-  const { relation } = vantOptions;
-  if (relation) {
-    options.relations = relation.relations;
-    options.behaviors.push(relation.mixin);
-  }
-  // map field to form-field behavior
-  if (vantOptions.field) {
-    options.behaviors.push('wx://form-field');
-  }
-  // add default options
-  options.options = {
-    multipleSlots: true,
-    addGlobalClass: true,
-  };
-  Component(options);
+    const options = {};
+    mapKeys(vantOptions, options, {
+        data: 'data',
+        props: 'properties',
+        watch: 'observers',
+        mixins: 'behaviors',
+        methods: 'methods',
+        beforeCreate: 'created',
+        created: 'attached',
+        mounted: 'ready',
+        destroyed: 'detached',
+        classes: 'externalClasses',
+    });
+    // add default externalClasses
+    options.externalClasses = options.externalClasses || [];
+    options.externalClasses.push('custom-class');
+    // add default behaviors
+    options.behaviors = options.behaviors || [];
+    options.behaviors.push(basic);
+    // add relations
+    const { relation } = vantOptions;
+    if (relation) {
+        options.relations = relation.relations;
+        options.behaviors.push(relation.mixin);
+    }
+    // map field to form-field behavior
+    if (vantOptions.field) {
+        options.behaviors.push('wx://form-field');
+    }
+    // add default options
+    options.options = {
+        multipleSlots: true,
+        addGlobalClass: true,
+    };
+    Component(options);
 }
 export { VantComponent };

+ 1 - 1
wxcomponents/vant/common/index.wxss

@@ -1 +1 @@
-.van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}.van-clearfix:after{display:table;clear:both;content:""}.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #ebedf0;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}
+.van-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;text-overflow:ellipsis}.van-multi-ellipsis--l3{-webkit-line-clamp:3}.van-clearfix:after{clear:both;content:"";display:table}.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{border:0 solid #ebedf0;bottom:-50%;box-sizing:border-box;content:" ";left:-50%;pointer-events:none;position:absolute;right:-50%;top:-50%;transform:scale(.5);transform-origin:center}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}

+ 11 - 17
wxcomponents/vant/common/relation.d.ts

@@ -1,21 +1,15 @@
 /// <reference types="miniprogram-api-typings" />
-declare type TrivialInstance = WechatMiniprogram.Component.TrivialInstance;
-export declare function useParent(
-  name: string,
-  onEffect?: (this: TrivialInstance) => void
-): {
-  relations: {
-    [x: string]: WechatMiniprogram.Component.RelationOption;
-  };
-  mixin: string;
+type TrivialInstance = WechatMiniprogram.Component.TrivialInstance;
+export declare function useParent(name: string, onEffect?: (this: TrivialInstance) => void): {
+    relations: {
+        [x: string]: WechatMiniprogram.Component.RelationOption;
+    };
+    mixin: string;
 };
-export declare function useChildren(
-  name: string,
-  onEffect?: (this: TrivialInstance, target: TrivialInstance) => void
-): {
-  relations: {
-    [x: string]: WechatMiniprogram.Component.RelationOption;
-  };
-  mixin: string;
+export declare function useChildren(name: string, onEffect?: (this: TrivialInstance, target: TrivialInstance) => void): {
+    relations: {
+        [x: string]: WechatMiniprogram.Component.RelationOption;
+    };
+    mixin: string;
 };
 export {};

+ 50 - 58
wxcomponents/vant/common/relation.js

@@ -1,64 +1,56 @@
 export function useParent(name, onEffect) {
-  const path = `../${name}/index`;
-  return {
-    relations: {
-      [path]: {
-        type: 'ancestor',
-        linked() {
-          onEffect && onEffect.call(this);
+    const path = `../${name}/index`;
+    return {
+        relations: {
+            [path]: {
+                type: 'ancestor',
+                linked() {
+                    onEffect && onEffect.call(this);
+                },
+                linkChanged() {
+                    onEffect && onEffect.call(this);
+                },
+                unlinked() {
+                    onEffect && onEffect.call(this);
+                },
+            },
         },
-        linkChanged() {
-          onEffect && onEffect.call(this);
-        },
-        unlinked() {
-          onEffect && onEffect.call(this);
-        },
-      },
-    },
-    mixin: Behavior({
-      created() {
-        Object.defineProperty(this, 'parent', {
-          get: () => this.getRelationNodes(path)[0],
-        });
-        Object.defineProperty(this, 'index', {
-          // @ts-ignore
-          get: () => {
-            var _a, _b;
-            return (_b =
-              (_a = this.parent) === null || _a === void 0
-                ? void 0
-                : _a.children) === null || _b === void 0
-              ? void 0
-              : _b.indexOf(this);
-          },
-        });
-      },
-    }),
-  };
+        mixin: Behavior({
+            created() {
+                Object.defineProperty(this, 'parent', {
+                    get: () => this.getRelationNodes(path)[0],
+                });
+                Object.defineProperty(this, 'index', {
+                    // @ts-ignore
+                    get: () => { var _a, _b; return (_b = (_a = this.parent) === null || _a === void 0 ? void 0 : _a.children) === null || _b === void 0 ? void 0 : _b.indexOf(this); },
+                });
+            },
+        }),
+    };
 }
 export function useChildren(name, onEffect) {
-  const path = `../${name}/index`;
-  return {
-    relations: {
-      [path]: {
-        type: 'descendant',
-        linked(target) {
-          onEffect && onEffect.call(this, target);
-        },
-        linkChanged(target) {
-          onEffect && onEffect.call(this, target);
-        },
-        unlinked(target) {
-          onEffect && onEffect.call(this, target);
+    const path = `../${name}/index`;
+    return {
+        relations: {
+            [path]: {
+                type: 'descendant',
+                linked(target) {
+                    onEffect && onEffect.call(this, target);
+                },
+                linkChanged(target) {
+                    onEffect && onEffect.call(this, target);
+                },
+                unlinked(target) {
+                    onEffect && onEffect.call(this, target);
+                },
+            },
         },
-      },
-    },
-    mixin: Behavior({
-      created() {
-        Object.defineProperty(this, 'children', {
-          get: () => this.getRelationNodes(path) || [],
-        });
-      },
-    }),
-  };
+        mixin: Behavior({
+            created() {
+                Object.defineProperty(this, 'children', {
+                    get: () => this.getRelationNodes(path) || [],
+                });
+            },
+        }),
+    };
 }

+ 1 - 1
wxcomponents/vant/common/style/clearfix.wxss

@@ -1 +1 @@
-.van-clearfix:after{display:table;clear:both;content:""}
+.van-clearfix:after{clear:both;content:"";display:table}

+ 1 - 1
wxcomponents/vant/common/style/ellipsis.wxss

@@ -1 +1 @@
-.van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}
+.van-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden;text-overflow:ellipsis}.van-multi-ellipsis--l3{-webkit-line-clamp:3}

+ 1 - 1
wxcomponents/vant/common/style/hairline.wxss

@@ -1 +1 @@
-.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #ebedf0;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}
+.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{border:0 solid #ebedf0;bottom:-50%;box-sizing:border-box;content:" ";left:-50%;pointer-events:none;position:absolute;right:-50%;top:-50%;transform:scale(.5);transform-origin:center}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}

+ 0 - 0
wxcomponents/vant/common/style/theme.wxss


+ 11 - 25
wxcomponents/vant/common/utils.d.ts

@@ -1,31 +1,17 @@
+/// <reference types="node" />
+/// <reference types="miniprogram-api-typings" />
+/// <reference types="miniprogram-api-typings" />
+/// <reference types="miniprogram-api-typings" />
 /// <reference types="miniprogram-api-typings" />
 export { isDef } from './validator';
+export { getSystemInfoSync } from './version';
 export declare function range(num: number, min: number, max: number): number;
 export declare function nextTick(cb: (...args: any[]) => void): void;
-export declare function getSystemInfoSync(): WechatMiniprogram.SystemInfo;
 export declare function addUnit(value?: string | number): string | undefined;
-export declare function requestAnimationFrame(
-  cb: () => void
-): number | WechatMiniprogram.NodesRef;
+export declare function requestAnimationFrame(cb: () => void): NodeJS.Timeout;
 export declare function pickExclude(obj: unknown, keys: string[]): {};
-export declare function getRect(
-  context: WechatMiniprogram.Component.TrivialInstance,
-  selector: string
-): Promise<WechatMiniprogram.BoundingClientRectCallbackResult>;
-export declare function getAllRect(
-  context: WechatMiniprogram.Component.TrivialInstance,
-  selector: string
-): Promise<WechatMiniprogram.BoundingClientRectCallbackResult[]>;
-export declare function groupSetData(
-  context: WechatMiniprogram.Component.TrivialInstance,
-  cb: () => void
-): void;
-export declare function toPromise(
-  promiseLike: Promise<unknown> | unknown
-): Promise<unknown>;
-export declare function getCurrentPage<T>(): T &
-  WechatMiniprogram.OptionalInterface<WechatMiniprogram.Page.ILifetime> &
-  WechatMiniprogram.Page.InstanceProperties &
-  WechatMiniprogram.Page.InstanceMethods<WechatMiniprogram.IAnyObject> &
-  WechatMiniprogram.Page.Data<WechatMiniprogram.IAnyObject> &
-  WechatMiniprogram.IAnyObject;
+export declare function getRect(context: WechatMiniprogram.Component.TrivialInstance, selector: string): Promise<WechatMiniprogram.BoundingClientRectCallbackResult>;
+export declare function getAllRect(context: WechatMiniprogram.Component.TrivialInstance, selector: string): Promise<WechatMiniprogram.BoundingClientRectCallbackResult[]>;
+export declare function groupSetData(context: WechatMiniprogram.Component.TrivialInstance, cb: () => void): void;
+export declare function toPromise(promiseLike: Promise<unknown> | unknown): Promise<unknown>;
+export declare function getCurrentPage<T>(): T & WechatMiniprogram.OptionalInterface<WechatMiniprogram.Page.ILifetime> & WechatMiniprogram.Page.InstanceProperties & WechatMiniprogram.Page.InstanceMethods<WechatMiniprogram.IAnyObject> & WechatMiniprogram.Page.Data<WechatMiniprogram.IAnyObject> & WechatMiniprogram.IAnyObject;

+ 50 - 64
wxcomponents/vant/common/utils.js

@@ -1,90 +1,76 @@
 import { isDef, isNumber, isPlainObject, isPromise } from './validator';
 import { canIUseGroupSetData, canIUseNextTick } from './version';
 export { isDef } from './validator';
+export { getSystemInfoSync } from './version';
 export function range(num, min, max) {
-  return Math.min(Math.max(num, min), max);
+    return Math.min(Math.max(num, min), max);
 }
 export function nextTick(cb) {
-  if (canIUseNextTick()) {
-    wx.nextTick(cb);
-  } else {
-    setTimeout(() => {
-      cb();
-    }, 1000 / 30);
-  }
-}
-let systemInfo;
-export function getSystemInfoSync() {
-  if (systemInfo == null) {
-    systemInfo = wx.getSystemInfoSync();
-  }
-  return systemInfo;
+    if (canIUseNextTick()) {
+        wx.nextTick(cb);
+    }
+    else {
+        setTimeout(() => {
+            cb();
+        }, 1000 / 30);
+    }
 }
 export function addUnit(value) {
-  if (!isDef(value)) {
-    return undefined;
-  }
-  value = String(value);
-  return isNumber(value) ? `${value}px` : value;
+    if (!isDef(value)) {
+        return undefined;
+    }
+    value = String(value);
+    return isNumber(value) ? `${value}px` : value;
 }
 export function requestAnimationFrame(cb) {
-  const systemInfo = getSystemInfoSync();
-  if (systemInfo.platform === 'devtools') {
     return setTimeout(() => {
-      cb();
+        cb();
     }, 1000 / 30);
-  }
-  return wx
-    .createSelectorQuery()
-    .selectViewport()
-    .boundingClientRect()
-    .exec(() => {
-      cb();
-    });
 }
 export function pickExclude(obj, keys) {
-  if (!isPlainObject(obj)) {
-    return {};
-  }
-  return Object.keys(obj).reduce((prev, key) => {
-    if (!keys.includes(key)) {
-      prev[key] = obj[key];
+    if (!isPlainObject(obj)) {
+        return {};
     }
-    return prev;
-  }, {});
+    return Object.keys(obj).reduce((prev, key) => {
+        if (!keys.includes(key)) {
+            prev[key] = obj[key];
+        }
+        return prev;
+    }, {});
 }
 export function getRect(context, selector) {
-  return new Promise((resolve) => {
-    wx.createSelectorQuery()
-      .in(context)
-      .select(selector)
-      .boundingClientRect()
-      .exec((rect = []) => resolve(rect[0]));
-  });
+    return new Promise((resolve) => {
+        wx.createSelectorQuery()
+            .in(context)
+            .select(selector)
+            .boundingClientRect()
+            .exec((rect = []) => resolve(rect[0]));
+    });
 }
 export function getAllRect(context, selector) {
-  return new Promise((resolve) => {
-    wx.createSelectorQuery()
-      .in(context)
-      .selectAll(selector)
-      .boundingClientRect()
-      .exec((rect = []) => resolve(rect[0]));
-  });
+    return new Promise((resolve) => {
+        wx.createSelectorQuery()
+            .in(context)
+            .selectAll(selector)
+            .boundingClientRect()
+            .exec((rect = []) => resolve(rect[0]));
+    });
 }
 export function groupSetData(context, cb) {
-  if (canIUseGroupSetData()) {
-    context.groupSetData(cb);
-  } else {
-    cb();
-  }
+    if (canIUseGroupSetData()) {
+        context.groupSetData(cb);
+    }
+    else {
+        cb();
+    }
 }
 export function toPromise(promiseLike) {
-  if (isPromise(promiseLike)) {
-    return promiseLike;
-  }
-  return Promise.resolve(promiseLike);
+    if (isPromise(promiseLike)) {
+        return promiseLike;
+    }
+    return Promise.resolve(promiseLike);
 }
 export function getCurrentPage() {
-  const pages = getCurrentPages();
-  return pages[pages.length - 1];
+    const pages = getCurrentPages();
+    return pages[pages.length - 1];
 }

+ 1 - 3
wxcomponents/vant/common/validator.d.ts

@@ -1,7 +1,5 @@
 export declare function isFunction(val: unknown): val is Function;
-export declare function isPlainObject(
-  val: unknown
-): val is Record<string, unknown>;
+export declare function isPlainObject(val: unknown): val is Record<string, unknown>;
 export declare function isPromise<T = unknown>(val: unknown): val is Promise<T>;
 export declare function isDef(value: unknown): boolean;
 export declare function isObj(x: unknown): x is Record<string, unknown>;

+ 10 - 10
wxcomponents/vant/common/validator.js

@@ -1,31 +1,31 @@
 // eslint-disable-next-line @typescript-eslint/ban-types
 export function isFunction(val) {
-  return typeof val === 'function';
+    return typeof val === 'function';
 }
 export function isPlainObject(val) {
-  return val !== null && typeof val === 'object' && !Array.isArray(val);
+    return val !== null && typeof val === 'object' && !Array.isArray(val);
 }
 export function isPromise(val) {
-  return isPlainObject(val) && isFunction(val.then) && isFunction(val.catch);
+    return isPlainObject(val) && isFunction(val.then) && isFunction(val.catch);
 }
 export function isDef(value) {
-  return value !== undefined && value !== null;
+    return value !== undefined && value !== null;
 }
 export function isObj(x) {
-  const type = typeof x;
-  return x !== null && (type === 'object' || type === 'function');
+    const type = typeof x;
+    return x !== null && (type === 'object' || type === 'function');
 }
 export function isNumber(value) {
-  return /^\d+(\.\d+)?$/.test(value);
+    return /^\d+(\.\d+)?$/.test(value);
 }
 export function isBoolean(value) {
-  return typeof value === 'boolean';
+    return typeof value === 'boolean';
 }
 const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i;
 const VIDEO_REGEXP = /\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv)/i;
 export function isImageUrl(url) {
-  return IMAGE_REGEXP.test(url);
+    return IMAGE_REGEXP.test(url);
 }
 export function isVideoUrl(url) {
-  return VIDEO_REGEXP.test(url);
+    return VIDEO_REGEXP.test(url);
 }

+ 2 - 0
wxcomponents/vant/common/version.d.ts

@@ -1,3 +1,5 @@
+/// <reference types="miniprogram-api-typings" />
+export declare function getSystemInfoSync(): WechatMiniprogram.SystemInfo;
 export declare function canIUseModel(): boolean;
 export declare function canIUseFormFieldButton(): boolean;
 export declare function canIUseAnimate(): boolean;

+ 39 - 28
wxcomponents/vant/common/version.js

@@ -1,48 +1,59 @@
-import { getSystemInfoSync } from './utils';
+let systemInfo;
+export function getSystemInfoSync() {
+    if (systemInfo == null) {
+        systemInfo = wx.getSystemInfoSync();
+    }
+    return systemInfo;
+}
 function compareVersion(v1, v2) {
-  v1 = v1.split('.');
-  v2 = v2.split('.');
-  const len = Math.max(v1.length, v2.length);
-  while (v1.length < len) {
-    v1.push('0');
-  }
-  while (v2.length < len) {
-    v2.push('0');
-  }
-  for (let i = 0; i < len; i++) {
-    const num1 = parseInt(v1[i], 10);
-    const num2 = parseInt(v2[i], 10);
-    if (num1 > num2) {
-      return 1;
+    v1 = v1.split('.');
+    v2 = v2.split('.');
+    const len = Math.max(v1.length, v2.length);
+    while (v1.length < len) {
+        v1.push('0');
+    }
+    while (v2.length < len) {
+        v2.push('0');
     }
-    if (num1 < num2) {
-      return -1;
+    for (let i = 0; i < len; i++) {
+        const num1 = parseInt(v1[i], 10);
+        const num2 = parseInt(v2[i], 10);
+        if (num1 > num2) {
+            return 1;
+        }
+        if (num1 < num2) {
+            return -1;
+        }
     }
-  }
-  return 0;
+    return 0;
 }
 function gte(version) {
-  const system = getSystemInfoSync();
-  return compareVersion(system.SDKVersion, version) >= 0;
+    const system = getSystemInfoSync();
+    return compareVersion(system.SDKVersion, version) >= 0;
 }
 export function canIUseModel() {
-  return gte('2.9.3');
+    return gte('2.9.3');
 }
 export function canIUseFormFieldButton() {
-  return gte('2.10.3');
+    return gte('2.10.3');
 }
 export function canIUseAnimate() {
-  return gte('2.9.0');
+    return gte('2.9.0');
 }
 export function canIUseGroupSetData() {
-  return gte('2.4.0');
+    return gte('2.4.0');
 }
 export function canIUseNextTick() {
-  return wx.canIUse('nextTick');
+    try {
+        return wx.canIUse('nextTick');
+    }
+    catch (e) {
+        return gte('2.7.1');
+    }
 }
 export function canIUseCanvas2d() {
-  return gte('2.9.0');
+    return gte('2.9.0');
 }
 export function canIUseGetUserProfile() {
-  return !!wx.getUserProfile;
+    return !!wx.getUserProfile;
 }

+ 5 - 5
wxcomponents/vant/config-provider/index.js

@@ -1,9 +1,9 @@
 import { VantComponent } from '../common/component';
 VantComponent({
-  props: {
-    themeVars: {
-      type: Object,
-      value: {},
+    props: {
+        themeVars: {
+            type: Object,
+            value: {},
+        },
     },
-  },
 });

+ 90 - 89
wxcomponents/vant/count-down/index.js

@@ -1,99 +1,100 @@
 import { VantComponent } from '../common/component';
 import { isSameSecond, parseFormat, parseTimeData } from './utils';
 function simpleTick(fn) {
-  return setTimeout(fn, 30);
+    return setTimeout(fn, 30);
 }
 VantComponent({
-  props: {
-    useSlot: Boolean,
-    millisecond: Boolean,
-    time: {
-      type: Number,
-      observer: 'reset',
+    props: {
+        useSlot: Boolean,
+        millisecond: Boolean,
+        time: {
+            type: Number,
+            observer: 'reset',
+        },
+        format: {
+            type: String,
+            value: 'HH:mm:ss',
+        },
+        autoStart: {
+            type: Boolean,
+            value: true,
+        },
     },
-    format: {
-      type: String,
-      value: 'HH:mm:ss',
+    data: {
+        timeData: parseTimeData(0),
+        formattedTime: '0',
     },
-    autoStart: {
-      type: Boolean,
-      value: true,
+    destroyed() {
+        clearTimeout(this.tid);
+        this.tid = null;
     },
-  },
-  data: {
-    timeData: parseTimeData(0),
-    formattedTime: '0',
-  },
-  destroyed() {
-    clearTimeout(this.tid);
-    this.tid = null;
-  },
-  methods: {
-    // 开始
-    start() {
-      if (this.counting) {
-        return;
-      }
-      this.counting = true;
-      this.endTime = Date.now() + this.remain;
-      this.tick();
+    methods: {
+        // 开始
+        start() {
+            if (this.counting) {
+                return;
+            }
+            this.counting = true;
+            this.endTime = Date.now() + this.remain;
+            this.tick();
+        },
+        // 暂停
+        pause() {
+            this.counting = false;
+            clearTimeout(this.tid);
+        },
+        // 重置
+        reset() {
+            this.pause();
+            this.remain = this.data.time;
+            this.setRemain(this.remain);
+            if (this.data.autoStart) {
+                this.start();
+            }
+        },
+        tick() {
+            if (this.data.millisecond) {
+                this.microTick();
+            }
+            else {
+                this.macroTick();
+            }
+        },
+        microTick() {
+            this.tid = simpleTick(() => {
+                this.setRemain(this.getRemain());
+                if (this.remain !== 0) {
+                    this.microTick();
+                }
+            });
+        },
+        macroTick() {
+            this.tid = simpleTick(() => {
+                const remain = this.getRemain();
+                if (!isSameSecond(remain, this.remain) || remain === 0) {
+                    this.setRemain(remain);
+                }
+                if (this.remain !== 0) {
+                    this.macroTick();
+                }
+            });
+        },
+        getRemain() {
+            return Math.max(this.endTime - Date.now(), 0);
+        },
+        setRemain(remain) {
+            this.remain = remain;
+            const timeData = parseTimeData(remain);
+            if (this.data.useSlot) {
+                this.$emit('change', timeData);
+            }
+            this.setData({
+                formattedTime: parseFormat(this.data.format, timeData),
+            });
+            if (remain === 0) {
+                this.pause();
+                this.$emit('finish');
+            }
+        },
     },
-    // 暂停
-    pause() {
-      this.counting = false;
-      clearTimeout(this.tid);
-    },
-    // 重置
-    reset() {
-      this.pause();
-      this.remain = this.data.time;
-      this.setRemain(this.remain);
-      if (this.data.autoStart) {
-        this.start();
-      }
-    },
-    tick() {
-      if (this.data.millisecond) {
-        this.microTick();
-      } else {
-        this.macroTick();
-      }
-    },
-    microTick() {
-      this.tid = simpleTick(() => {
-        this.setRemain(this.getRemain());
-        if (this.remain !== 0) {
-          this.microTick();
-        }
-      });
-    },
-    macroTick() {
-      this.tid = simpleTick(() => {
-        const remain = this.getRemain();
-        if (!isSameSecond(remain, this.remain) || remain === 0) {
-          this.setRemain(remain);
-        }
-        if (this.remain !== 0) {
-          this.macroTick();
-        }
-      });
-    },
-    getRemain() {
-      return Math.max(this.endTime - Date.now(), 0);
-    },
-    setRemain(remain) {
-      this.remain = remain;
-      const timeData = parseTimeData(remain);
-      if (this.data.useSlot) {
-        this.$emit('change', timeData);
-      }
-      this.setData({
-        formattedTime: parseFormat(this.data.format, timeData),
-      });
-      if (remain === 0) {
-        this.pause();
-        this.$emit('finish');
-      }
-    },
-  },
 });

+ 1 - 1
wxcomponents/vant/count-down/index.wxss

@@ -1 +1 @@
-@import '../common/index.wxss';.van-count-down{color:#323233;color:var(--count-down-text-color,#323233);font-size:14px;font-size:var(--count-down-font-size,14px);line-height:20px;line-height:var(--count-down-line-height,20px)}
+@import '../common/index.wxss';.van-count-down{color:var(--count-down-text-color,#323233);font-size:var(--count-down-font-size,14px);line-height:var(--count-down-line-height,20px)}

+ 1 - 1
wxcomponents/vant/count-down/utils.d.ts

@@ -1,4 +1,4 @@
-export declare type TimeData = {
+export type TimeData = {
     days: number;
     hours: number;
     minutes: number;

+ 45 - 41
wxcomponents/vant/count-down/utils.js

@@ -1,53 +1,57 @@
 function padZero(num, targetLength = 2) {
-  let str = num + '';
-  while (str.length < targetLength) {
-    str = '0' + str;
-  }
-  return str;
+    let str = num + '';
+    while (str.length < targetLength) {
+        str = '0' + str;
+    }
+    return str;
 }
 const SECOND = 1000;
 const MINUTE = 60 * SECOND;
 const HOUR = 60 * MINUTE;
 const DAY = 24 * HOUR;
 export function parseTimeData(time) {
-  const days = Math.floor(time / DAY);
-  const hours = Math.floor((time % DAY) / HOUR);
-  const minutes = Math.floor((time % HOUR) / MINUTE);
-  const seconds = Math.floor((time % MINUTE) / SECOND);
-  const milliseconds = Math.floor(time % SECOND);
-  return {
-    days,
-    hours,
-    minutes,
-    seconds,
-    milliseconds,
-  };
+    const days = Math.floor(time / DAY);
+    const hours = Math.floor((time % DAY) / HOUR);
+    const minutes = Math.floor((time % HOUR) / MINUTE);
+    const seconds = Math.floor((time % MINUTE) / SECOND);
+    const milliseconds = Math.floor(time % SECOND);
+    return {
+        days,
+        hours,
+        minutes,
+        seconds,
+        milliseconds,
+    };
 }
 export function parseFormat(format, timeData) {
-  const { days } = timeData;
-  let { hours, minutes, seconds, milliseconds } = timeData;
-  if (format.indexOf('DD') === -1) {
-    hours += days * 24;
-  } else {
-    format = format.replace('DD', padZero(days));
-  }
-  if (format.indexOf('HH') === -1) {
-    minutes += hours * 60;
-  } else {
-    format = format.replace('HH', padZero(hours));
-  }
-  if (format.indexOf('mm') === -1) {
-    seconds += minutes * 60;
-  } else {
-    format = format.replace('mm', padZero(minutes));
-  }
-  if (format.indexOf('ss') === -1) {
-    milliseconds += seconds * 1000;
-  } else {
-    format = format.replace('ss', padZero(seconds));
-  }
-  return format.replace('SSS', padZero(milliseconds, 3));
+    const { days } = timeData;
+    let { hours, minutes, seconds, milliseconds } = timeData;
+    if (format.indexOf('DD') === -1) {
+        hours += days * 24;
+    }
+    else {
+        format = format.replace('DD', padZero(days));
+    }
+    if (format.indexOf('HH') === -1) {
+        minutes += hours * 60;
+    }
+    else {
+        format = format.replace('HH', padZero(hours));
+    }
+    if (format.indexOf('mm') === -1) {
+        seconds += minutes * 60;
+    }
+    else {
+        format = format.replace('mm', padZero(minutes));
+    }
+    if (format.indexOf('ss') === -1) {
+        milliseconds += seconds * 1000;
+    }
+    else {
+        format = format.replace('ss', padZero(seconds));
+    }
+    return format.replace('SSS', padZero(milliseconds, 3));
 }
 export function isSameSecond(time1, time2) {
-  return Math.floor(time1 / 1000) === Math.floor(time2 / 1000);
+    return Math.floor(time1 / 1000) === Math.floor(time2 / 1000);
 }

+ 267 - 293
wxcomponents/vant/datetime-picker/index.js

@@ -3,319 +3,293 @@ import { isDef } from '../common/validator';
 import { pickerProps } from '../picker/shared';
 const currentYear = new Date().getFullYear();
 function isValidDate(date) {
-  return isDef(date) && !isNaN(new Date(date).getTime());
+    return isDef(date) && !isNaN(new Date(date).getTime());
 }
 function range(num, min, max) {
-  return Math.min(Math.max(num, min), max);
+    return Math.min(Math.max(num, min), max);
 }
 function padZero(val) {
-  return `00${val}`.slice(-2);
+    return `00${val}`.slice(-2);
 }
 function times(n, iteratee) {
-  let index = -1;
-  const result = Array(n < 0 ? 0 : n);
-  while (++index < n) {
-    result[index] = iteratee(index);
-  }
-  return result;
+    let index = -1;
+    const result = Array(n < 0 ? 0 : n);
+    while (++index < n) {
+        result[index] = iteratee(index);
+    }
+    return result;
 }
 function getTrueValue(formattedValue) {
-  if (formattedValue === undefined) {
-    formattedValue = '1';
-  }
-  while (isNaN(parseInt(formattedValue, 10))) {
-    formattedValue = formattedValue.slice(1);
-  }
-  return parseInt(formattedValue, 10);
+    if (formattedValue === undefined) {
+        formattedValue = '1';
+    }
+    while (isNaN(parseInt(formattedValue, 10))) {
+        formattedValue = formattedValue.slice(1);
+    }
+    return parseInt(formattedValue, 10);
 }
 function getMonthEndDay(year, month) {
-  return 32 - new Date(year, month - 1, 32).getDate();
+    return 32 - new Date(year, month - 1, 32).getDate();
 }
 const defaultFormatter = (type, value) => value;
 VantComponent({
-  classes: ['active-class', 'toolbar-class', 'column-class'],
-  props: Object.assign(Object.assign({}, pickerProps), {
-    value: {
-      type: null,
-      observer: 'updateValue',
+    classes: ['active-class', 'toolbar-class', 'column-class'],
+    props: Object.assign(Object.assign({}, pickerProps), { value: {
+            type: null,
+            observer: 'updateValue',
+        }, filter: null, type: {
+            type: String,
+            value: 'datetime',
+            observer: 'updateValue',
+        }, showToolbar: {
+            type: Boolean,
+            value: true,
+        }, formatter: {
+            type: null,
+            value: defaultFormatter,
+        }, minDate: {
+            type: Number,
+            value: new Date(currentYear - 10, 0, 1).getTime(),
+            observer: 'updateValue',
+        }, maxDate: {
+            type: Number,
+            value: new Date(currentYear + 10, 11, 31).getTime(),
+            observer: 'updateValue',
+        }, minHour: {
+            type: Number,
+            value: 0,
+            observer: 'updateValue',
+        }, maxHour: {
+            type: Number,
+            value: 23,
+            observer: 'updateValue',
+        }, minMinute: {
+            type: Number,
+            value: 0,
+            observer: 'updateValue',
+        }, maxMinute: {
+            type: Number,
+            value: 59,
+            observer: 'updateValue',
+        } }),
+    data: {
+        innerValue: Date.now(),
+        columns: [],
     },
-    filter: null,
-    type: {
-      type: String,
-      value: 'datetime',
-      observer: 'updateValue',
-    },
-    showToolbar: {
-      type: Boolean,
-      value: true,
-    },
-    formatter: {
-      type: null,
-      value: defaultFormatter,
-    },
-    minDate: {
-      type: Number,
-      value: new Date(currentYear - 10, 0, 1).getTime(),
-      observer: 'updateValue',
-    },
-    maxDate: {
-      type: Number,
-      value: new Date(currentYear + 10, 11, 31).getTime(),
-      observer: 'updateValue',
-    },
-    minHour: {
-      type: Number,
-      value: 0,
-      observer: 'updateValue',
-    },
-    maxHour: {
-      type: Number,
-      value: 23,
-      observer: 'updateValue',
-    },
-    minMinute: {
-      type: Number,
-      value: 0,
-      observer: 'updateValue',
-    },
-    maxMinute: {
-      type: Number,
-      value: 59,
-      observer: 'updateValue',
-    },
-  }),
-  data: {
-    innerValue: Date.now(),
-    columns: [],
-  },
-  methods: {
-    updateValue() {
-      const { data } = this;
-      const val = this.correctValue(data.value);
-      const isEqual = val === data.innerValue;
-      this.updateColumnValue(val).then(() => {
-        if (!isEqual) {
-          this.$emit('input', val);
-        }
-      });
-    },
-    getPicker() {
-      if (this.picker == null) {
-        this.picker = this.selectComponent('.van-datetime-picker');
-        const { picker } = this;
-        const { setColumnValues } = picker;
-        picker.setColumnValues = (...args) =>
-          setColumnValues.apply(picker, [...args, false]);
-      }
-      return this.picker;
-    },
-    updateColumns() {
-      const { formatter = defaultFormatter } = this.data;
-      const results = this.getOriginColumns().map((column) => ({
-        values: column.values.map((value) => formatter(column.type, value)),
-      }));
-      return this.set({ columns: results });
-    },
-    getOriginColumns() {
-      const { filter } = this.data;
-      const results = this.getRanges().map(({ type, range }) => {
-        let values = times(range[1] - range[0] + 1, (index) => {
-          const value = range[0] + index;
-          return type === 'year' ? `${value}` : padZero(value);
-        });
-        if (filter) {
-          values = filter(type, values);
-        }
-        return { type, values };
-      });
-      return results;
-    },
-    getRanges() {
-      const { data } = this;
-      if (data.type === 'time') {
-        return [
-          {
-            type: 'hour',
-            range: [data.minHour, data.maxHour],
-          },
-          {
-            type: 'minute',
-            range: [data.minMinute, data.maxMinute],
-          },
-        ];
-      }
-      const {
-        maxYear,
-        maxDate,
-        maxMonth,
-        maxHour,
-        maxMinute,
-      } = this.getBoundary('max', data.innerValue);
-      const {
-        minYear,
-        minDate,
-        minMonth,
-        minHour,
-        minMinute,
-      } = this.getBoundary('min', data.innerValue);
-      const result = [
-        {
-          type: 'year',
-          range: [minYear, maxYear],
+    methods: {
+        updateValue() {
+            const { data } = this;
+            const val = this.correctValue(data.value);
+            const isEqual = val === data.innerValue;
+            this.updateColumnValue(val).then(() => {
+                if (!isEqual) {
+                    this.$emit('input', val);
+                }
+            });
         },
-        {
-          type: 'month',
-          range: [minMonth, maxMonth],
+        getPicker() {
+            if (this.picker == null) {
+                this.picker = this.selectComponent('.van-datetime-picker');
+                const { picker } = this;
+                const { setColumnValues } = picker;
+                picker.setColumnValues = (...args) => setColumnValues.apply(picker, [...args, false]);
+            }
+            return this.picker;
         },
-        {
-          type: 'day',
-          range: [minDate, maxDate],
+        updateColumns() {
+            const { formatter = defaultFormatter } = this.data;
+            const results = this.getOriginColumns().map((column) => ({
+                values: column.values.map((value) => formatter(column.type, value)),
+            }));
+            return this.set({ columns: results });
         },
-        {
-          type: 'hour',
-          range: [minHour, maxHour],
+        getOriginColumns() {
+            const { filter } = this.data;
+            const results = this.getRanges().map(({ type, range }) => {
+                let values = times(range[1] - range[0] + 1, (index) => {
+                    const value = range[0] + index;
+                    return type === 'year' ? `${value}` : padZero(value);
+                });
+                if (filter) {
+                    values = filter(type, values);
+                }
+                return { type, values };
+            });
+            return results;
         },
-        {
-          type: 'minute',
-          range: [minMinute, maxMinute],
+        getRanges() {
+            const { data } = this;
+            if (data.type === 'time') {
+                return [
+                    {
+                        type: 'hour',
+                        range: [data.minHour, data.maxHour],
+                    },
+                    {
+                        type: 'minute',
+                        range: [data.minMinute, data.maxMinute],
+                    },
+                ];
+            }
+            const { maxYear, maxDate, maxMonth, maxHour, maxMinute, } = this.getBoundary('max', data.innerValue);
+            const { minYear, minDate, minMonth, minHour, minMinute, } = this.getBoundary('min', data.innerValue);
+            const result = [
+                {
+                    type: 'year',
+                    range: [minYear, maxYear],
+                },
+                {
+                    type: 'month',
+                    range: [minMonth, maxMonth],
+                },
+                {
+                    type: 'day',
+                    range: [minDate, maxDate],
+                },
+                {
+                    type: 'hour',
+                    range: [minHour, maxHour],
+                },
+                {
+                    type: 'minute',
+                    range: [minMinute, maxMinute],
+                },
+            ];
+            if (data.type === 'date')
+                result.splice(3, 2);
+            if (data.type === 'year-month')
+                result.splice(2, 3);
+            return result;
         },
-      ];
-      if (data.type === 'date') result.splice(3, 2);
-      if (data.type === 'year-month') result.splice(2, 3);
-      return result;
-    },
-    correctValue(value) {
-      const { data } = this;
-      // validate value
-      const isDateType = data.type !== 'time';
-      if (isDateType && !isValidDate(value)) {
-        value = data.minDate;
-      } else if (!isDateType && !value) {
-        const { minHour } = data;
-        value = `${padZero(minHour)}:00`;
-      }
-      // time type
-      if (!isDateType) {
-        let [hour, minute] = value.split(':');
-        hour = padZero(range(hour, data.minHour, data.maxHour));
-        minute = padZero(range(minute, data.minMinute, data.maxMinute));
-        return `${hour}:${minute}`;
-      }
-      // date type
-      value = Math.max(value, data.minDate);
-      value = Math.min(value, data.maxDate);
-      return value;
-    },
-    getBoundary(type, innerValue) {
-      const value = new Date(innerValue);
-      const boundary = new Date(this.data[`${type}Date`]);
-      const year = boundary.getFullYear();
-      let month = 1;
-      let date = 1;
-      let hour = 0;
-      let minute = 0;
-      if (type === 'max') {
-        month = 12;
-        date = getMonthEndDay(value.getFullYear(), value.getMonth() + 1);
-        hour = 23;
-        minute = 59;
-      }
-      if (value.getFullYear() === year) {
-        month = boundary.getMonth() + 1;
-        if (value.getMonth() + 1 === month) {
-          date = boundary.getDate();
-          if (value.getDate() === date) {
-            hour = boundary.getHours();
-            if (value.getHours() === hour) {
-              minute = boundary.getMinutes();
+        correctValue(value) {
+            const { data } = this;
+            // validate value
+            const isDateType = data.type !== 'time';
+            if (isDateType && !isValidDate(value)) {
+                value = data.minDate;
             }
-          }
-        }
-      }
-      return {
-        [`${type}Year`]: year,
-        [`${type}Month`]: month,
-        [`${type}Date`]: date,
-        [`${type}Hour`]: hour,
-        [`${type}Minute`]: minute,
-      };
-    },
-    onCancel() {
-      this.$emit('cancel');
-    },
-    onConfirm() {
-      this.$emit('confirm', this.data.innerValue);
-    },
-    onChange() {
-      const { data } = this;
-      let value;
-      const picker = this.getPicker();
-      const originColumns = this.getOriginColumns();
-      if (data.type === 'time') {
-        const indexes = picker.getIndexes();
-        value = `${+originColumns[0].values[indexes[0]]}:${+originColumns[1]
-          .values[indexes[1]]}`;
-      } else {
-        const indexes = picker.getIndexes();
-        const values = indexes.map(
-          (value, index) => originColumns[index].values[value]
-        );
-        const year = getTrueValue(values[0]);
-        const month = getTrueValue(values[1]);
-        const maxDate = getMonthEndDay(year, month);
-        let date = getTrueValue(values[2]);
-        if (data.type === 'year-month') {
-          date = 1;
-        }
-        date = date > maxDate ? maxDate : date;
-        let hour = 0;
-        let minute = 0;
-        if (data.type === 'datetime') {
-          hour = getTrueValue(values[3]);
-          minute = getTrueValue(values[4]);
-        }
-        value = new Date(year, month - 1, date, hour, minute);
-      }
-      value = this.correctValue(value);
-      this.updateColumnValue(value).then(() => {
-        this.$emit('input', value);
-        this.$emit('change', picker);
-      });
+            else if (!isDateType && !value) {
+                const { minHour } = data;
+                value = `${padZero(minHour)}:00`;
+            }
+            // time type
+            if (!isDateType) {
+                let [hour, minute] = value.split(':');
+                hour = padZero(range(hour, data.minHour, data.maxHour));
+                minute = padZero(range(minute, data.minMinute, data.maxMinute));
+                return `${hour}:${minute}`;
+            }
+            // date type
+            value = Math.max(value, data.minDate);
+            value = Math.min(value, data.maxDate);
+            return value;
+        },
+        getBoundary(type, innerValue) {
+            const value = new Date(innerValue);
+            const boundary = new Date(this.data[`${type}Date`]);
+            const year = boundary.getFullYear();
+            let month = 1;
+            let date = 1;
+            let hour = 0;
+            let minute = 0;
+            if (type === 'max') {
+                month = 12;
+                date = getMonthEndDay(value.getFullYear(), value.getMonth() + 1);
+                hour = 23;
+                minute = 59;
+            }
+            if (value.getFullYear() === year) {
+                month = boundary.getMonth() + 1;
+                if (value.getMonth() + 1 === month) {
+                    date = boundary.getDate();
+                    if (value.getDate() === date) {
+                        hour = boundary.getHours();
+                        if (value.getHours() === hour) {
+                            minute = boundary.getMinutes();
+                        }
+                    }
+                }
+            }
+            return {
+                [`${type}Year`]: year,
+                [`${type}Month`]: month,
+                [`${type}Date`]: date,
+                [`${type}Hour`]: hour,
+                [`${type}Minute`]: minute,
+            };
+        },
+        onCancel() {
+            this.$emit('cancel');
+        },
+        onConfirm() {
+            this.$emit('confirm', this.data.innerValue);
+        },
+        onChange() {
+            const { data } = this;
+            let value;
+            const picker = this.getPicker();
+            const originColumns = this.getOriginColumns();
+            if (data.type === 'time') {
+                const indexes = picker.getIndexes();
+                value = `${+originColumns[0].values[indexes[0]]}:${+originColumns[1]
+                    .values[indexes[1]]}`;
+            }
+            else {
+                const indexes = picker.getIndexes();
+                const values = indexes.map((value, index) => originColumns[index].values[value]);
+                const year = getTrueValue(values[0]);
+                const month = getTrueValue(values[1]);
+                const maxDate = getMonthEndDay(year, month);
+                let date = getTrueValue(values[2]);
+                if (data.type === 'year-month') {
+                    date = 1;
+                }
+                date = date > maxDate ? maxDate : date;
+                let hour = 0;
+                let minute = 0;
+                if (data.type === 'datetime') {
+                    hour = getTrueValue(values[3]);
+                    minute = getTrueValue(values[4]);
+                }
+                value = new Date(year, month - 1, date, hour, minute);
+            }
+            value = this.correctValue(value);
+            this.updateColumnValue(value).then(() => {
+                this.$emit('input', value);
+                this.$emit('change', picker);
+            });
+        },
+        updateColumnValue(value) {
+            let values = [];
+            const { type } = this.data;
+            const formatter = this.data.formatter || defaultFormatter;
+            const picker = this.getPicker();
+            if (type === 'time') {
+                const pair = value.split(':');
+                values = [formatter('hour', pair[0]), formatter('minute', pair[1])];
+            }
+            else {
+                const date = new Date(value);
+                values = [
+                    formatter('year', `${date.getFullYear()}`),
+                    formatter('month', padZero(date.getMonth() + 1)),
+                ];
+                if (type === 'date') {
+                    values.push(formatter('day', padZero(date.getDate())));
+                }
+                if (type === 'datetime') {
+                    values.push(formatter('day', padZero(date.getDate())), formatter('hour', padZero(date.getHours())), formatter('minute', padZero(date.getMinutes())));
+                }
+            }
+            return this.set({ innerValue: value })
+                .then(() => this.updateColumns())
+                .then(() => picker.setValues(values));
+        },
     },
-    updateColumnValue(value) {
-      let values = [];
-      const { type } = this.data;
-      const formatter = this.data.formatter || defaultFormatter;
-      const picker = this.getPicker();
-      if (type === 'time') {
-        const pair = value.split(':');
-        values = [formatter('hour', pair[0]), formatter('minute', pair[1])];
-      } else {
-        const date = new Date(value);
-        values = [
-          formatter('year', `${date.getFullYear()}`),
-          formatter('month', padZero(date.getMonth() + 1)),
-        ];
-        if (type === 'date') {
-          values.push(formatter('day', padZero(date.getDate())));
-        }
-        if (type === 'datetime') {
-          values.push(
-            formatter('day', padZero(date.getDate())),
-            formatter('hour', padZero(date.getHours())),
-            formatter('minute', padZero(date.getMinutes()))
-          );
-        }
-      }
-      return this.set({ innerValue: value })
-        .then(() => this.updateColumns())
-        .then(() => picker.setValues(values));
+    created() {
+        const innerValue = this.correctValue(this.data.value);
+        this.updateColumnValue(innerValue).then(() => {
+            this.$emit('input', innerValue);
+        });
     },
-  },
-  created() {
-    const innerValue = this.correctValue(this.data.value);
-    this.updateColumnValue(innerValue).then(() => {
-      this.$emit('input', innerValue);
-    });
-  },
 });

+ 24 - 39
wxcomponents/vant/definitions/index.d.ts

@@ -1,43 +1,28 @@
 /// <reference types="miniprogram-api-typings" />
 interface VantComponentInstance {
-  parent: WechatMiniprogram.Component.TrivialInstance;
-  children: WechatMiniprogram.Component.TrivialInstance[];
-  index: number;
-  $emit: (
-    name: string,
-    detail?: unknown,
-    options?: WechatMiniprogram.Component.TriggerEventOption
-  ) => void;
+    parent: WechatMiniprogram.Component.TrivialInstance;
+    children: WechatMiniprogram.Component.TrivialInstance[];
+    index: number;
+    $emit: (name: string, detail?: unknown, options?: WechatMiniprogram.Component.TriggerEventOption) => void;
 }
-export declare type VantComponentOptions<
-  Data extends WechatMiniprogram.Component.DataOption,
-  Props extends WechatMiniprogram.Component.PropertyOption,
-  Methods extends WechatMiniprogram.Component.MethodOption
-> = {
-  data?: Data;
-  field?: boolean;
-  classes?: string[];
-  mixins?: string[];
-  props?: Props;
-  relation?: {
-    relations: Record<string, WechatMiniprogram.Component.RelationOption>;
-    mixin: string;
-  };
-  methods?: Methods;
-  beforeCreate?: () => void;
-  created?: () => void;
-  mounted?: () => void;
-  destroyed?: () => void;
-} & ThisType<
-  VantComponentInstance &
-    WechatMiniprogram.Component.Instance<
-      Data & {
-        name: string;
-        value: any;
-      } & Record<string, any>,
-      Props,
-      Methods
-    > &
-    Record<string, any>
->;
+export type VantComponentOptions<Data extends WechatMiniprogram.Component.DataOption, Props extends WechatMiniprogram.Component.PropertyOption, Methods extends WechatMiniprogram.Component.MethodOption> = {
+    data?: Data;
+    field?: boolean;
+    classes?: string[];
+    mixins?: string[];
+    props?: Props;
+    relation?: {
+        relations: Record<string, WechatMiniprogram.Component.RelationOption>;
+        mixin: string;
+    };
+    watch?: Record<string, (...args: any[]) => any>;
+    methods?: Methods;
+    beforeCreate?: () => void;
+    created?: () => void;
+    mounted?: () => void;
+    destroyed?: () => void;
+} & ThisType<VantComponentInstance & WechatMiniprogram.Component.Instance<Data & {
+    name: string;
+    value: any;
+} & Record<string, any>, Props, Methods> & Record<string, any>>;
 export {};

+ 49 - 52
wxcomponents/vant/dialog/dialog.d.ts

@@ -1,58 +1,55 @@
 /// <reference types="miniprogram-api-typings" />
-export declare type Action = 'confirm' | 'cancel' | 'overlay';
+/// <reference types="miniprogram-api-typings" />
+export type Action = 'confirm' | 'cancel' | 'overlay';
+type DialogContext = WechatMiniprogram.Page.TrivialInstance | WechatMiniprogram.Component.TrivialInstance;
 interface DialogOptions {
-  lang?: string;
-  show?: boolean;
-  title?: string;
-  width?: string | number | null;
-  zIndex?: number;
-  theme?: string;
-  context?:
-    | WechatMiniprogram.Page.TrivialInstance
-    | WechatMiniprogram.Component.TrivialInstance;
-  message?: string;
-  overlay?: boolean;
-  selector?: string;
-  ariaLabel?: string;
-  className?: string;
-  customStyle?: string;
-  transition?: string;
-  /**
-   * @deprecated use beforeClose instead
-   */
-  asyncClose?: boolean;
-  beforeClose?: null | ((action: Action) => Promise<void> | void);
-  businessId?: number;
-  sessionFrom?: string;
-  overlayStyle?: string;
-  appParameter?: string;
-  messageAlign?: string;
-  sendMessageImg?: string;
-  showMessageCard?: boolean;
-  sendMessagePath?: string;
-  sendMessageTitle?: string;
-  confirmButtonText?: string;
-  cancelButtonText?: string;
-  showConfirmButton?: boolean;
-  showCancelButton?: boolean;
-  closeOnClickOverlay?: boolean;
-  confirmButtonOpenType?: string;
+    lang?: string;
+    show?: boolean;
+    title?: string;
+    width?: string | number | null;
+    zIndex?: number;
+    theme?: string;
+    context?: (() => DialogContext) | DialogContext;
+    message?: string;
+    overlay?: boolean;
+    selector?: string;
+    ariaLabel?: string;
+    /**
+     * @deprecated use custom-class instead
+     */
+    className?: string;
+    customStyle?: string;
+    transition?: string;
+    /**
+     * @deprecated use beforeClose instead
+     */
+    asyncClose?: boolean;
+    beforeClose?: null | ((action: Action) => Promise<void | boolean> | void);
+    businessId?: number;
+    sessionFrom?: string;
+    overlayStyle?: string;
+    appParameter?: string;
+    messageAlign?: string;
+    sendMessageImg?: string;
+    showMessageCard?: boolean;
+    sendMessagePath?: string;
+    sendMessageTitle?: string;
+    confirmButtonText?: string;
+    cancelButtonText?: string;
+    showConfirmButton?: boolean;
+    showCancelButton?: boolean;
+    closeOnClickOverlay?: boolean;
+    confirmButtonOpenType?: string;
 }
 declare const Dialog: {
-  (options: DialogOptions): Promise<
-    WechatMiniprogram.Component.TrivialInstance
-  >;
-  alert(
-    options: DialogOptions
-  ): Promise<WechatMiniprogram.Component.TrivialInstance>;
-  confirm(
-    options: DialogOptions
-  ): Promise<WechatMiniprogram.Component.TrivialInstance>;
-  close(): void;
-  stopLoading(): void;
-  currentOptions: DialogOptions;
-  defaultOptions: DialogOptions;
-  setDefaultOptions(options: DialogOptions): void;
-  resetDefaultOptions(): void;
+    (options: DialogOptions): Promise<WechatMiniprogram.Component.TrivialInstance>;
+    alert(options: DialogOptions): Promise<WechatMiniprogram.Component.TrivialInstance>;
+    confirm(options: DialogOptions): Promise<WechatMiniprogram.Component.TrivialInstance>;
+    close(): void;
+    stopLoading(): void;
+    currentOptions: DialogOptions;
+    defaultOptions: DialogOptions;
+    setDefaultOptions(options: DialogOptions): void;
+    resetDefaultOptions(): void;
 };
 export default Dialog;

+ 56 - 63
wxcomponents/vant/dialog/dialog.js

@@ -1,84 +1,77 @@
 let queue = [];
 const defaultOptions = {
-  show: false,
-  title: '',
-  width: null,
-  theme: 'default',
-  message: '',
-  zIndex: 100,
-  overlay: true,
-  selector: '#van-dialog',
-  className: '',
-  asyncClose: false,
-  beforeClose: null,
-  transition: 'scale',
-  customStyle: '',
-  messageAlign: '',
-  overlayStyle: '',
-  confirmButtonText: '确认',
-  cancelButtonText: '取消',
-  showConfirmButton: true,
-  showCancelButton: false,
-  closeOnClickOverlay: false,
-  confirmButtonOpenType: '',
+    show: false,
+    title: '',
+    width: null,
+    theme: 'default',
+    message: '',
+    zIndex: 100,
+    overlay: true,
+    selector: '#van-dialog',
+    className: '',
+    asyncClose: false,
+    beforeClose: null,
+    transition: 'scale',
+    customStyle: '',
+    messageAlign: '',
+    overlayStyle: '',
+    confirmButtonText: '确认',
+    cancelButtonText: '取消',
+    showConfirmButton: true,
+    showCancelButton: false,
+    closeOnClickOverlay: false,
+    confirmButtonOpenType: '',
 };
 let currentOptions = Object.assign({}, defaultOptions);
 function getContext() {
-  const pages = getCurrentPages();
-  return pages[pages.length - 1];
+    const pages = getCurrentPages();
+    return pages[pages.length - 1];
 }
 const Dialog = (options) => {
-  options = Object.assign(Object.assign({}, currentOptions), options);
-  return new Promise((resolve, reject) => {
-    const context = options.context || getContext();
-    const dialog = context.selectComponent(options.selector);
-    delete options.context;
-    delete options.selector;
-    if (dialog) {
-      dialog.setData(
-        Object.assign(
-          {
-            callback: (action, instance) => {
-              action === 'confirm' ? resolve(instance) : reject(instance);
-            },
-          },
-          options
-        )
-      );
-      wx.nextTick(() => {
-        dialog.setData({ show: true });
-      });
-      queue.push(dialog);
-    } else {
-      console.warn(
-        '未找到 van-dialog 节点,请确认 selector 及 context 是否正确'
-      );
-    }
-  });
+    options = Object.assign(Object.assign({}, currentOptions), options);
+    return new Promise((resolve, reject) => {
+        const context = (typeof options.context === 'function'
+            ? options.context()
+            : options.context) || getContext();
+        const dialog = context.selectComponent(options.selector);
+        delete options.context;
+        delete options.selector;
+        if (dialog) {
+            dialog.setData(Object.assign({ callback: (action, instance) => {
+                    action === 'confirm' ? resolve(instance) : reject(instance);
+                } }, options));
+            wx.nextTick(() => {
+                dialog.setData({ show: true });
+            });
+            queue.push(dialog);
+        }
+        else {
+            console.warn('未找到 van-dialog 节点,请确认 selector 及 context 是否正确');
+        }
+    });
 };
 Dialog.alert = (options) => Dialog(options);
-Dialog.confirm = (options) =>
-  Dialog(Object.assign({ showCancelButton: true }, options));
+Dialog.confirm = (options) => Dialog(Object.assign({ showCancelButton: true }, options));
 Dialog.close = () => {
-  queue.forEach((dialog) => {
-    dialog.close();
-  });
-  queue = [];
+    queue.forEach((dialog) => {
+        dialog.close();
+    });
+    queue = [];
 };
 Dialog.stopLoading = () => {
-  queue.forEach((dialog) => {
-    dialog.stopLoading();
-  });
+    queue.forEach((dialog) => {
+        dialog.stopLoading();
+    });
 };
 Dialog.currentOptions = currentOptions;
 Dialog.defaultOptions = defaultOptions;
 Dialog.setDefaultOptions = (options) => {
-  currentOptions = Object.assign(Object.assign({}, currentOptions), options);
-  Dialog.currentOptions = currentOptions;
+    currentOptions = Object.assign(Object.assign({}, currentOptions), options);
+    Dialog.currentOptions = currentOptions;
 };
 Dialog.resetDefaultOptions = () => {
-  currentOptions = Object.assign({}, defaultOptions);
-  Dialog.currentOptions = currentOptions;
+    currentOptions = Object.assign({}, defaultOptions);
+    Dialog.currentOptions = currentOptions;
 };
 Dialog.resetDefaultOptions();
 export default Dialog;

+ 111 - 110
wxcomponents/vant/dialog/index.js

@@ -3,119 +3,120 @@ import { button } from '../mixins/button';
 import { GRAY, RED } from '../common/color';
 import { toPromise } from '../common/utils';
 VantComponent({
-  mixins: [button],
-  props: {
-    show: {
-      type: Boolean,
-      observer(show) {
-        !show && this.stopLoading();
-      },
-    },
-    title: String,
-    message: String,
-    theme: {
-      type: String,
-      value: 'default',
-    },
-    useSlot: Boolean,
-    className: String,
-    customStyle: String,
-    asyncClose: Boolean,
-    messageAlign: String,
-    beforeClose: null,
-    overlayStyle: String,
-    useTitleSlot: Boolean,
-    showCancelButton: Boolean,
-    closeOnClickOverlay: Boolean,
-    confirmButtonOpenType: String,
-    width: null,
-    zIndex: {
-      type: Number,
-      value: 2000,
-    },
-    confirmButtonText: {
-      type: String,
-      value: '确认',
-    },
-    cancelButtonText: {
-      type: String,
-      value: '取消',
-    },
-    confirmButtonColor: {
-      type: String,
-      value: RED,
-    },
-    cancelButtonColor: {
-      type: String,
-      value: GRAY,
-    },
-    showConfirmButton: {
-      type: Boolean,
-      value: true,
-    },
-    overlay: {
-      type: Boolean,
-      value: true,
-    },
-    transition: {
-      type: String,
-      value: 'scale',
-    },
-  },
-  data: {
-    loading: {
-      confirm: false,
-      cancel: false,
-    },
-    callback: () => {},
-  },
-  methods: {
-    onConfirm() {
-      this.handleAction('confirm');
-    },
-    onCancel() {
-      this.handleAction('cancel');
-    },
-    onClickOverlay() {
-      this.close('overlay');
-    },
-    close(action) {
-      this.setData({ show: false });
-      wx.nextTick(() => {
-        this.$emit('close', action);
-        const { callback } = this.data;
-        if (callback) {
-          callback(action, this);
-        }
-      });
+    mixins: [button],
+    props: {
+        show: {
+            type: Boolean,
+            observer(show) {
+                !show && this.stopLoading();
+            },
+        },
+        title: String,
+        message: String,
+        theme: {
+            type: String,
+            value: 'default',
+        },
+        useSlot: Boolean,
+        className: String,
+        customStyle: String,
+        asyncClose: Boolean,
+        messageAlign: String,
+        beforeClose: null,
+        overlayStyle: String,
+        useTitleSlot: Boolean,
+        showCancelButton: Boolean,
+        closeOnClickOverlay: Boolean,
+        confirmButtonOpenType: String,
+        width: null,
+        zIndex: {
+            type: Number,
+            value: 2000,
+        },
+        confirmButtonText: {
+            type: String,
+            value: '确认',
+        },
+        cancelButtonText: {
+            type: String,
+            value: '取消',
+        },
+        confirmButtonColor: {
+            type: String,
+            value: RED,
+        },
+        cancelButtonColor: {
+            type: String,
+            value: GRAY,
+        },
+        showConfirmButton: {
+            type: Boolean,
+            value: true,
+        },
+        overlay: {
+            type: Boolean,
+            value: true,
+        },
+        transition: {
+            type: String,
+            value: 'scale',
+        },
     },
-    stopLoading() {
-      this.setData({
+    data: {
         loading: {
-          confirm: false,
-          cancel: false,
+            confirm: false,
+            cancel: false,
         },
-      });
+        callback: (() => { }),
     },
-    handleAction(action) {
-      this.$emit(action, { dialog: this });
-      const { asyncClose, beforeClose } = this.data;
-      if (!asyncClose && !beforeClose) {
-        this.close(action);
-        return;
-      }
-      this.setData({
-        [`loading.${action}`]: true,
-      });
-      if (beforeClose) {
-        toPromise(beforeClose(action)).then((value) => {
-          if (value) {
-            this.close(action);
-          } else {
-            this.stopLoading();
-          }
-        });
-      }
+    methods: {
+        onConfirm() {
+            this.handleAction('confirm');
+        },
+        onCancel() {
+            this.handleAction('cancel');
+        },
+        onClickOverlay() {
+            this.close('overlay');
+        },
+        close(action) {
+            this.setData({ show: false });
+            wx.nextTick(() => {
+                this.$emit('close', action);
+                const { callback } = this.data;
+                if (callback) {
+                    callback(action, this);
+                }
+            });
+        },
+        stopLoading() {
+            this.setData({
+                loading: {
+                    confirm: false,
+                    cancel: false,
+                },
+            });
+        },
+        handleAction(action) {
+            this.$emit(action, { dialog: this });
+            const { asyncClose, beforeClose } = this.data;
+            if (!asyncClose && !beforeClose) {
+                this.close(action);
+                return;
+            }
+            this.setData({
+                [`loading.${action}`]: true,
+            });
+            if (beforeClose) {
+                toPromise(beforeClose(action)).then((value) => {
+                    if (value) {
+                        this.close(action);
+                    }
+                    else {
+                        this.stopLoading();
+                    }
+                });
+            }
+        },
     },
-  },
 });

+ 2 - 2
wxcomponents/vant/dialog/index.wxml

@@ -5,7 +5,7 @@
   z-index="{{ zIndex }}"
   overlay="{{ overlay }}"
   transition="{{ transition }}"
-  custom-class="van-dialog van-dialog--{{ theme }} {{ className }}"
+  custom-class="van-dialog van-dialog--{{ theme }}{{ className }} custom-class"
   custom-style="width: {{ utils.addUnit(width) }};{{ customStyle }}"
   overlay-style="{{ overlayStyle }}"
   close-on-click-overlay="{{ closeOnClickOverlay }}"
@@ -69,7 +69,7 @@
     </van-goods-action-button>
   </van-goods-action>
 
-  <view wx:else class="van-hairline--top van-dialog__footer">
+  <view wx:elif="{{ showCancelButton || showConfirmButton }}" class="van-hairline--top van-dialog__footer">
     <van-button
       wx:if="{{ showCancelButton }}"
       size="large"

+ 1 - 1
wxcomponents/vant/dialog/index.wxss

@@ -1 +1 @@
-@import '../common/index.wxss';.van-dialog{top:45%!important;overflow:hidden;width:320px;width:var(--dialog-width,320px);font-size:16px;font-size:var(--dialog-font-size,16px);border-radius:16px;border-radius:var(--dialog-border-radius,16px);background-color:#fff;background-color:var(--dialog-background-color,#fff)}@media (max-width:321px){.van-dialog{width:90%;width:var(--dialog-small-screen-width,90%)}}.van-dialog__header{text-align:center;padding-top:24px;padding-top:var(--dialog-header-padding-top,24px);font-weight:500;font-weight:var(--dialog-header-font-weight,500);line-height:24px;line-height:var(--dialog-header-line-height,24px)}.van-dialog__header--isolated{padding:24px 0;padding:var(--dialog-header-isolated-padding,24px 0)}.van-dialog__message{overflow-y:auto;text-align:center;-webkit-overflow-scrolling:touch;font-size:14px;font-size:var(--dialog-message-font-size,14px);line-height:20px;line-height:var(--dialog-message-line-height,20px);max-height:60vh;max-height:var(--dialog-message-max-height,60vh);padding:24px;padding:var(--dialog-message-padding,24px)}.van-dialog__message-text{word-wrap:break-word}.van-dialog__message--hasTitle{padding-top:8px;padding-top:var(--dialog-has-title-message-padding-top,8px);color:#646566;color:var(--dialog-has-title-message-text-color,#646566)}.van-dialog__message--round-button{padding-bottom:16px;color:#323233}.van-dialog__message--left{text-align:left}.van-dialog__message--right{text-align:right}.van-dialog__footer{display:-webkit-flex;display:flex}.van-dialog__footer--round-button{position:relative!important;padding:8px 24px 16px!important}.van-dialog__button{-webkit-flex:1;flex:1}.van-dialog__cancel,.van-dialog__confirm{border:0!important}.van-dialog-bounce-enter{-webkit-transform:translate3d(-50%,-50%,0) scale(.7);transform:translate3d(-50%,-50%,0) scale(.7);opacity:0}.van-dialog-bounce-leave-active{-webkit-transform:translate3d(-50%,-50%,0) scale(.9);transform:translate3d(-50%,-50%,0) scale(.9);opacity:0}
+@import '../common/index.wxss';.van-dialog{background-color:var(--dialog-background-color,#fff);border-radius:var(--dialog-border-radius,16px);font-size:var(--dialog-font-size,16px);overflow:hidden;top:45%!important;width:var(--dialog-width,320px)}@media (max-width:321px){.van-dialog{width:var(--dialog-small-screen-width,90%)}}.van-dialog__header{font-weight:var(--dialog-header-font-weight,500);line-height:var(--dialog-header-line-height,24px);padding-top:var(--dialog-header-padding-top,24px);text-align:center}.van-dialog__header--isolated{padding:var(--dialog-header-isolated-padding,24px 0)}.van-dialog__message{-webkit-overflow-scrolling:touch;font-size:var(--dialog-message-font-size,14px);line-height:var(--dialog-message-line-height,20px);max-height:var(--dialog-message-max-height,60vh);overflow-y:auto;padding:var(--dialog-message-padding,24px);text-align:center}.van-dialog__message-text{word-wrap:break-word}.van-dialog__message--hasTitle{color:var(--dialog-has-title-message-text-color,#646566);padding-top:var(--dialog-has-title-message-padding-top,8px)}.van-dialog__message--round-button{color:#323233;padding-bottom:16px}.van-dialog__message--left{text-align:left}.van-dialog__message--right{text-align:right}.van-dialog__message--justify{text-align:justify}.van-dialog__footer{display:flex}.van-dialog__footer--round-button{padding:8px 24px 16px!important;position:relative!important}.van-dialog__button{flex:1}.van-dialog__cancel,.van-dialog__confirm{border:0!important}.van-dialog-bounce-enter{opacity:0;transform:translate3d(-50%,-50%,0) scale(.7)}.van-dialog-bounce-leave-active{opacity:0;transform:translate3d(-50%,-50%,0) scale(.9)}

+ 9 - 9
wxcomponents/vant/divider/index.js

@@ -1,12 +1,12 @@
 import { VantComponent } from '../common/component';
 VantComponent({
-  props: {
-    dashed: Boolean,
-    hairline: Boolean,
-    contentPosition: String,
-    fontSize: String,
-    borderColor: String,
-    textColor: String,
-    customStyle: String,
-  },
+    props: {
+        dashed: Boolean,
+        hairline: Boolean,
+        contentPosition: String,
+        fontSize: String,
+        borderColor: String,
+        textColor: String,
+        customStyle: String,
+    },
 });

+ 1 - 1
wxcomponents/vant/divider/index.wxss

@@ -1 +1 @@
-@import '../common/index.wxss';.van-divider{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;margin:16px 0;margin:var(--divider-margin,16px 0);color:#969799;color:var(--divider-text-color,#969799);font-size:14px;font-size:var(--divider-font-size,14px);line-height:24px;line-height:var(--divider-line-height,24px);border:0 solid #ebedf0;border-color:var(--divider-border-color,#ebedf0)}.van-divider:after,.van-divider:before{display:block;-webkit-flex:1;flex:1;box-sizing:border-box;height:1px;border-color:inherit;border-style:inherit;border-width:1px 0 0}.van-divider:before{content:""}.van-divider--hairline:after,.van-divider--hairline:before{-webkit-transform:scaleY(.5);transform:scaleY(.5)}.van-divider--dashed{border-style:dashed}.van-divider--center:before,.van-divider--left:before,.van-divider--right:before{margin-right:16px;margin-right:var(--divider-content-padding,16px)}.van-divider--center:after,.van-divider--left:after,.van-divider--right:after{content:"";margin-left:16px;margin-left:var(--divider-content-padding,16px)}.van-divider--left:before{max-width:10%;max-width:var(--divider-content-left-width,10%)}.van-divider--right:after{max-width:10%;max-width:var(--divider-content-right-width,10%)}
+@import '../common/index.wxss';.van-divider{align-items:center;border:0 solid var(--divider-border-color,#ebedf0);color:var(--divider-text-color,#969799);display:flex;font-size:var(--divider-font-size,14px);line-height:var(--divider-line-height,24px);margin:var(--divider-margin,16px 0)}.van-divider:after,.van-divider:before{border-color:inherit;border-style:inherit;border-width:1px 0 0;box-sizing:border-box;display:block;flex:1;height:1px}.van-divider:before{content:""}.van-divider--hairline:after,.van-divider--hairline:before{transform:scaleY(.5)}.van-divider--dashed{border-style:dashed}.van-divider--center:before,.van-divider--left:before,.van-divider--right:before{margin-right:var(--divider-content-padding,16px)}.van-divider--center:after,.van-divider--left:after,.van-divider--right:after{content:"";margin-left:var(--divider-content-padding,16px)}.van-divider--left:before{max-width:var(--divider-content-left-width,10%)}.van-divider--right:after{max-width:var(--divider-content-right-width,10%)}

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff