From d7cf84bd603bcab89d44e9942348f017665cb756 Mon Sep 17 00:00:00 2001
From: Tevin <tingquanren@163.com>
Date: Thu, 01 Apr 2021 14:47:48 +0800
Subject: [PATCH] 增加日期范围选择器

---
 forms/datePicker/CDateRangeAction.vue  |  119 +++++++++++++++++++++++
 plugins/filter/CFilterDateRange.vue    |   64 ++++++++++++
 plugins/filter/CFilterSelect.vue       |    4 
 forms/datePicker/index.js              |   10 ++
 plugins/filter/CFilter.vue             |    9 +
 plugins/filter/cFilter.scss            |    4 
 forms/datePicker/cDateRangeAction.scss |   65 +++++++++++++
 7 files changed, 271 insertions(+), 4 deletions(-)

diff --git a/forms/datePicker/CDateRangeAction.vue b/forms/datePicker/CDateRangeAction.vue
new file mode 100644
index 0000000..45b8341
--- /dev/null
+++ b/forms/datePicker/CDateRangeAction.vue
@@ -0,0 +1,119 @@
+/**
+ * CDateRangeAction - 选择日期范围操作
+ * @author Tevin
+ */
+
+<template>
+    <view class="c-date-range-action">
+        <view
+            class="c-date-range-slot"
+            @tap="evt => handleOpen()"
+        >
+            <slot />
+        </view>
+        <view
+            class="c-data-range-float"
+            ref="floadLayer"
+        >
+            <AtDrawer
+                class="c-data-range-drawer"
+                ref="floatDrawer"
+                mask
+                :show="drawerShow"
+                :onClose="evt => drawerShow=false"
+            >
+                <view class="title">请选择日期</view>
+                <view class="date">
+                    <picker
+                        mode='date'
+                        :value="startDate"
+                        @change="evt => handleStartDateChange(evt.detail.value)"
+                    >
+                        <view class="item">
+                            <view class="label">开始日期</view>
+                            <view :class="startDate?'filled':'empty'">
+                                {{ startDate?startDate:'请选择开始日期' }}
+                            </view>
+                            <view class="at-icon at-icon-chevron-right" />
+                        </view>
+                    </picker>
+                    <picker
+                        mode='date'
+                        :value="endDate"
+                        @change="evt => handleEndDateChange(evt.detail.value)"
+                    >
+                        <view class="item">
+                            <view class="label">结束日期</view>
+                            <view :class="endDate?'filled':'empty'">
+                                {{ endDate?endDate:'请选择结束日期' }}
+                            </view>
+                            <view class="at-icon at-icon-chevron-right" />
+                        </view>
+                    </picker>
+                </view>
+                <AtButton
+                    class="btn"
+                    type="primary"
+                    full
+                    :circle="false"
+                    :onClick="evt => handleFinish()"
+                >确定</AtButton>
+            </AtDrawer>
+        </view>
+    </view>
+</template>
+
+<script>
+import Taro from '@tarojs/taro';
+import { $ } from '@tarojs/extend';
+import { AtDrawer, AtButton } from 'taro-ui-vue';
+import './cDateRangeAction.scss';
+
+export default {
+    name: 'CDateRangeAction',
+    components: {
+        AtDrawer,
+        AtButton,
+    },
+    props: {
+        value: null,
+        onChange: Function,
+    },
+    data() {
+        return {
+            drawerShow: false,
+            startDate: '',
+            endDate: '',
+        };
+    },
+    computed: {},
+    methods: {
+        handleOpen() {
+            this.drawerShow = true;
+            const curDates = (this.value || ',').split(',');
+            this.startDate = curDates[0];
+            this.endDate = curDates[1];
+        },
+        handleStartDateChange(date) {
+            this.startDate = date;
+        },
+        handleEndDateChange(date) {
+            this.endDate = date;
+        },
+        handleFinish() {
+            this.drawerShow = false;
+            if (!this.startDate && !this.endDate) {
+                this.onChange();
+            } else {
+                this.onChange(this.startDate + ',' + this.endDate);
+            }
+        },
+    },
+    mounted() {
+        const $cFilter = $(this.$refs.floadLayer).parents('.c-filter');
+        if ($cFilter.length > 0) {
+            $cFilter.eq(0).after(this.$refs.floadLayer);
+        }
+    },
+};
+</script>
\ No newline at end of file
diff --git a/forms/datePicker/cDateRangeAction.scss b/forms/datePicker/cDateRangeAction.scss
new file mode 100644
index 0000000..2dc4c66
--- /dev/null
+++ b/forms/datePicker/cDateRangeAction.scss
@@ -0,0 +1,65 @@
+/**
+ * date range action
+ * @author Tevin
+ */
+
+@import "../../common/sassMixin";
+
+.c-date-range-action {}
+.c-data-range-float {
+    @include position(fixed, 0 0, 90000);
+    .at-drawer .at-drawer__content {
+        width: 100%;
+        min-height: 200px;
+        bottom: auto;
+        transform: translateY(-100%);
+    }
+    .at-drawer--show .at-drawer__content {
+        transform: translateY(0%);
+    }
+    .c-data-range-drawer {
+        .title {
+            height: 100px;
+            text-align: center;
+            line-height: 100px;
+            border-top: 1PX solid #eee;
+            border-bottom: 1PX solid #d6e4ef;
+            background-color: #f8f8f8;
+        }
+        .item {
+            @include flexbox(flex, flex-start center);
+            width: 100%;
+            height: 96px;
+            padding: 24px 0 24px 24px;
+            white-space: nowrap;
+            border-bottom: 1PX solid #d6e4ef;
+            box-sizing: border-box;
+            background-color: #fff;
+            .label {
+                flex: 2;
+            }
+            .filled,
+            .empty {
+                flex: 6;
+                text-align: right;
+            }
+            .empty {
+                color: #ccc;
+            }
+            .at-icon {
+                flex: 1;
+                font-size: 40px;
+                text-align: center;
+                color: #999;
+            }
+        }
+        .date {
+            padding-bottom: 24px;
+            background-color: #f8f8f8;
+        }
+        .btn {
+            background-color: #36a0e7;
+            border: none;
+        }
+    }
+}
\ No newline at end of file
diff --git a/forms/datePicker/index.js b/forms/datePicker/index.js
new file mode 100644
index 0000000..66810ea
--- /dev/null
+++ b/forms/datePicker/index.js
@@ -0,0 +1,10 @@
+/**
+ * CDatePicker
+ * @author Tevin
+ */
+
+import CDateRangeAction from '@components/forms/datePicker/CDateRangeAction.vue';
+
+export {
+    CDateRangeAction,
+}
\ No newline at end of file
diff --git a/plugins/filter/CFilter.vue b/plugins/filter/CFilter.vue
index a5fde0d..924972c 100644
--- a/plugins/filter/CFilter.vue
+++ b/plugins/filter/CFilter.vue
@@ -47,6 +47,13 @@
                         :value="filterRes[item.name]"
                         :onChange="evt=>handleChange(item.name, evt)"
                     />
+                    <CFilterDateRange
+                        v-if="item.type==='dateRange'"
+                        type="item"
+                        :label="item.label"
+                        :value="filterRes[item.name]"
+                        :onChange="evt=>handleChange(item.name, evt)"
+                    />
                 </view>
             </scroll-view>
             <view class="c-filter-drawer-btn">
@@ -60,6 +67,7 @@
 import Taro from '@tarojs/taro';
 import { AtDrawer } from 'taro-ui-vue';
 import CFilterSelect from './CFilterSelect';
+import CFilterDateRange from './CFilterDateRange';
 import './cFilter.scss';
 
 export default {
@@ -67,6 +75,7 @@
     components: {
         AtDrawer,
         CFilterSelect,
+        CFilterDateRange,
     },
     props: {
         // 筛选横条项目
diff --git a/plugins/filter/CFilterDateRange.vue b/plugins/filter/CFilterDateRange.vue
new file mode 100644
index 0000000..85d7a08
--- /dev/null
+++ b/plugins/filter/CFilterDateRange.vue
@@ -0,0 +1,64 @@
+/**
+ * CFilterSelect - 筛选项目,选择日期
+ * @author Tevin
+ */
+
+<template>
+    <view
+        class="c-filter-select"
+        :class="'type-'+type"
+    >
+        <view
+            class="label"
+            v-if="type==='item'"
+        >{{label}}</view>
+        <CDateRangeAction
+            :value="value"
+            :onChange="evt=>handleChange(evt)"
+        >
+            <view class="content">
+                <view
+                    class="label"
+                    v-if="type==='bar'"
+                >
+                    {{label}}:
+                </view>
+                <view :class="selected ? 'filled':'empty'">
+                    {{selected ? value : ('请选择' + label)}}
+                </view>
+                <view class="at-icon at-icon-chevron-down" />
+            </view>
+        </CDateRangeAction>
+    </view>
+</template>
+
+<script>
+import Taro from '@tarojs/taro';
+import { CDateRangeAction } from '@components/forms/datePicker';
+
+export default {
+    name: 'CFilterSelect',
+    components: {
+        CDateRangeAction,
+    },
+    props: {
+        type: String,
+        label: String,
+        value: null,
+        onChange: Function,
+    },
+    data() {
+        return {};
+    },
+    computed: {
+        selected() {
+            return (this.value || '').length > 2;
+        },
+    },
+    methods: {
+        handleChange(dateRange) {
+            this.onChange(dateRange);
+        },
+    },
+};
+</script>
\ No newline at end of file
diff --git a/plugins/filter/CFilterSelect.vue b/plugins/filter/CFilterSelect.vue
index 4976cb5..fbbe7ff 100644
--- a/plugins/filter/CFilterSelect.vue
+++ b/plugins/filter/CFilterSelect.vue
@@ -25,10 +25,10 @@
                 >
                     {{label}}:
                 </view>
-                <view :class="selected ? 'value':'empty'">
+                <view :class="selected ? 'filled':'empty'">
                     {{selected ? options2[current].name : ('请选择' + label)}}
                 </view>
-                <view class='at-icon at-icon-chevron-down' />
+                <view class="at-icon at-icon-chevron-down" />
             </view>
         </picker>
     </view>
diff --git a/plugins/filter/cFilter.scss b/plugins/filter/cFilter.scss
index 2703ceb..171a251 100644
--- a/plugins/filter/cFilter.scss
+++ b/plugins/filter/cFilter.scss
@@ -66,7 +66,7 @@
         .empty {
             color: #ccc;
         }
-        .value {
+        .filled {
             color: #6190e8;
         }
         .at-icon {
@@ -93,7 +93,7 @@
         }
         .content {
             .empty,
-            .value {
+            .filled {
                 flex: 6;
             }
             .at-icon {

--
Gitblit v1.9.1