From a9cd43b39c12722b526ab3face7427e432ab3ff3 Mon Sep 17 00:00:00 2001
From: 梁灏 <admin@aresn.com>
Date: Thu, 20 Jul 2017 16:00:03 +0800
Subject: [PATCH] Cascader add transfer prop

---
 examples/routers/cascader.vue        | 11 ++++++++++-
 examples/routers/modal.vue           | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
 examples/routers/poptip.vue          |  2 +-
 src/components/cascader/cascader.vue | 22 +++++++++++++++++++---
 src/styles/components/cascader.less  | 20 ++++++++++++++++----
 5 files changed, 99 insertions(+), 13 deletions(-)

diff --git a/examples/routers/cascader.vue b/examples/routers/cascader.vue
index 3fe2c77..734cfa5 100644
--- a/examples/routers/cascader.vue
+++ b/examples/routers/cascader.vue
@@ -1,5 +1,14 @@
 <template>
-    <Cascader v-model="value3" :data="data" filterable></Cascader>
+    <div style="width: 400px;">
+        <Row>
+            <i-col span="12">
+                <Cascader transfer v-model="value3" :data="data" filterable></Cascader>
+            </i-col>
+            <i-col span="12">
+                <Cascader v-model="value3" :data="data" filterable></Cascader>
+            </i-col>
+        </Row>
+    </div>
 </template>
 <script>
     export default {
diff --git a/examples/routers/modal.vue b/examples/routers/modal.vue
index b1e3f70..865f2aa 100644
--- a/examples/routers/modal.vue
+++ b/examples/routers/modal.vue
@@ -5,10 +5,11 @@
         <Modal v-model="showModal" title="弹窗">
             <Tabs>
                 <Tab-pane label="演示" style="height: 80px;">
-                    <Date-picker transfer type="daterange" placement="bottom-end" placeholder="选择日期" style="width: 200px"></Date-picker>
-                    <i-select transfer multiple v-model="m1">
-                        <i-option v-for="item in options" :value="item.value" :key="item.value">{{ item.label }}</i-option>
-                    </i-select>
+                    <!--<Date-picker transfer type="daterange" placement="bottom-end" placeholder="选择日期" style="width: 200px"></Date-picker>-->
+                    <!--<i-select transfer multiple v-model="m1">-->
+                        <!--<i-option v-for="item in options" :value="item.value" :key="item.value">{{ item.label }}</i-option>-->
+                    <!--</i-select>-->
+                    <Cascader transfer :data="data4" :load-data="loadData"></Cascader>
                 </Tab-pane>
             </Tabs>
         </Modal>
@@ -51,6 +52,20 @@
                         value: 'chongqing',
                         label: '重庆市'
                     }
+                ],
+                data4: [
+                    {
+                        value: 'beijing',
+                        label: '北京',
+                        children: [],
+                        loading: false
+                    },
+                    {
+                        value: 'hangzhou',
+                        label: '杭州',
+                        children: [],
+                        loading:false
+                    }
                 ]
             }
         },
@@ -74,6 +89,40 @@
                 this.$refs["formSelect"].clearSingleSelect();
                 this.options = [];
                 // }, 300)
+            },
+            loadData (item, callback) {
+                item.loading = true;
+                setTimeout(() => {
+                    if (item.value === 'beijing') {
+                        item.children = [
+                            {
+                                value: 'talkingdata',
+                                label: 'TalkingData'
+                            },
+                            {
+                                value: 'baidu',
+                                label: '百度'
+                            },
+                            {
+                                value: 'sina',
+                                label: '新浪'
+                            }
+                        ];
+                    } else if (item.value === 'hangzhou') {
+                        item.children = [
+                            {
+                                value: 'ali',
+                                label: '阿里巴巴'
+                            },
+                            {
+                                value: '163',
+                                label: '网易'
+                            }
+                        ];
+                    }
+                    item.loading = false;
+                    callback();
+                }, 1000);
             }
         }
     }
diff --git a/examples/routers/poptip.vue b/examples/routers/poptip.vue
index f5d4e3f..8d5f7f4 100644
--- a/examples/routers/poptip.vue
+++ b/examples/routers/poptip.vue
@@ -3,7 +3,7 @@
         <Poptip trigger="hover" title="提示标题" content="提示内容">
             <Button>hover 激活</Button>
         </Poptip>
-        <Poptip title="提示标题" content="提示内容">
+        <Poptip transfer title="提示标题" content="提示内容">
             <Button>click 激活</Button>
         </Poptip>
         <Poptip trigger="focus" title="提示标题" content="提示内容">
diff --git a/src/components/cascader/cascader.vue b/src/components/cascader/cascader.vue
index 926b4bf..ec52ecd 100644
--- a/src/components/cascader/cascader.vue
+++ b/src/components/cascader/cascader.vue
@@ -1,6 +1,6 @@
 <template>
     <div :class="classes" v-clickoutside="handleClose">
-        <div :class="[prefixCls + '-rel']" @click="toggleOpen">
+        <div :class="[prefixCls + '-rel']" @click="toggleOpen" ref="reference">
             <slot>
                 <i-input
                     ref="input"
@@ -19,7 +19,12 @@
             </slot>
         </div>
         <transition name="slide-up">
-            <Drop v-show="visible">
+            <Drop
+                v-show="visible"
+                :class="{ [prefixCls + '-transfer']: transfer }"
+                ref="drop"
+                :data-transfer="transfer"
+                v-transfer-dom>
                 <div>
                     <Caspanel
                         v-show="!filterable || (filterable && query === '')"
@@ -51,6 +56,7 @@
     import Icon from '../icon/icon.vue';
     import Caspanel from './caspanel.vue';
     import clickoutside from '../../directives/clickoutside';
+    import TransferDom from '../../directives/transfer-dom';
     import { oneOf } from '../../utils/assist';
     import Emitter from '../../mixins/emitter';
     import Locale from '../../mixins/locale';
@@ -62,7 +68,7 @@
         name: 'Cascader',
         mixins: [ Emitter, Locale ],
         components: { iInput, Drop, Icon, Caspanel },
-        directives: { clickoutside },
+        directives: { clickoutside, TransferDom },
         props: {
             data: {
                 type: Array,
@@ -117,6 +123,10 @@
             },
             notFoundText: {
                 type: String
+            },
+            transfer: {
+                type: Boolean,
+                default: false
             }
         },
         data () {
@@ -333,11 +343,17 @@
                     if (this.currentValue.length) {
                         this.updateSelected();
                     }
+                    if (this.transfer) {
+                        this.$refs.drop.update();
+                    }
                 } else {
                     if (this.filterable) {
                         this.query = '';
                         this.$refs.input.currentValue = '';
                     }
+                    if (this.transfer) {
+                        this.$refs.drop.destroy();
+                    }
                 }
                 this.$emit('on-visible-change', val);
             },
diff --git a/src/styles/components/cascader.less b/src/styles/components/cascader.less
index d5726a5..f37283b 100644
--- a/src/styles/components/cascader.less
+++ b/src/styles/components/cascader.less
@@ -1,6 +1,13 @@
 @cascader-prefix-cls: ~"@{css-prefix}cascader";
 @cascader-item-prefix-cls: ~"@{css-prefix}cascader-menu-item";
 
+.selectDropDown{
+    width: auto;
+    padding: 0;
+    white-space: nowrap;
+    overflow: visible;
+}
+
 .@{cascader-prefix-cls} {
     //position: relative;
     line-height: normal;
@@ -64,10 +71,7 @@
     }
 
     .@{select-dropdown-prefix-cls} {
-        width: auto;
-        padding: 0;
-        white-space: nowrap;
-        overflow: visible;
+        .selectDropDown();
     }
 
     .select-item(@cascader-prefix-cls, @cascader-item-prefix-cls);
@@ -138,6 +142,14 @@
         }
     }
 }
+.@{cascader-prefix-cls}-transfer{
+    z-index: @zindex-transfer;
+    .selectDropDown();
+    .select-item(@cascader-prefix-cls, @cascader-item-prefix-cls);
+    .ivu-select-item span{
+        color: @error-color;
+    }
+}
 
 .@{form-item-prefix-cls}-error{
     .@{cascader-prefix-cls} {
--
libgit2 0.21.4