Blame view

src/components/tree/node.vue 4.95 KB
75c32d5f   梁灏   rebuild Tree
1
  <template>
eae3e936   Aresn   Tree support tran...
2
      <collapse-transition>
d44420be   Sergio Crisostomo   refactor and make...
3
          <ul :class="classes">
75c32d5f   梁灏   rebuild Tree
4
5
              <li>
                  <span :class="arrowClasses" @click="handleExpand">
b31aab71   梁灏   Tree add async lo...
6
7
                      <Icon v-if="showArrow" type="arrow-right-b"></Icon>
                      <Icon v-if="showLoading" type="load-c" class="ivu-load-loop"></Icon>
75c32d5f   梁灏   rebuild Tree
8
9
                  </span>
                  <Checkbox
eae3e936   Aresn   Tree support tran...
10
11
                          v-if="showCheckbox"
                          :value="data.checked"
d44420be   Sergio Crisostomo   refactor and make...
12
                          :indeterminate="data.indeterminate"
eae3e936   Aresn   Tree support tran...
13
14
                          :disabled="data.disabled || data.disableCheckbox"
                          @click.native.prevent="handleCheck"></Checkbox>
9b24f1ab   梁灏   Tree add Render f...
15
16
                  <Render v-if="data.render" :render="data.render"></Render>
                  <span v-else :class="titleClasses" v-html="data.title" @click="handleSelect"></span>
75c32d5f   梁灏   rebuild Tree
17
                  <Tree-node
d44420be   Sergio Crisostomo   refactor and make...
18
                          v-if="data.expand"
da76a837   Sergio Crisostomo   fix dom rendering...
19
20
                          v-for="(item, i) in data.children"
                          :key="i"
eae3e936   Aresn   Tree support tran...
21
                          :data="item"
eae3e936   Aresn   Tree support tran...
22
23
                          :multiple="multiple"
                          :show-checkbox="showCheckbox">
75c32d5f   梁灏   rebuild Tree
24
25
26
                  </Tree-node>
              </li>
          </ul>
eae3e936   Aresn   Tree support tran...
27
      </collapse-transition>
75c32d5f   梁灏   rebuild Tree
28
29
30
  </template>
  <script>
      import Checkbox from '../checkbox/checkbox.vue';
64633e8c   梁灏   fixed #612
31
      import Icon from '../icon/icon.vue';
9b24f1ab   梁灏   Tree add Render f...
32
      import Render from '../base/render';
eae3e936   Aresn   Tree support tran...
33
      import CollapseTransition from '../base/collapse-transition';
75c32d5f   梁灏   rebuild Tree
34
      import Emitter from '../../mixins/emitter';
b31aab71   梁灏   Tree add async lo...
35
      import { findComponentUpward } from '../../utils/assist';
75c32d5f   梁灏   rebuild Tree
36
37
38
39
40
41
  
      const prefixCls = 'ivu-tree';
  
      export default {
          name: 'TreeNode',
          mixins: [ Emitter ],
9b24f1ab   梁灏   Tree add Render f...
42
          components: { Checkbox, Icon, CollapseTransition, Render },
75c32d5f   梁灏   rebuild Tree
43
44
45
46
47
48
49
50
51
52
53
54
55
56
          props: {
              data: {
                  type: Object,
                  default () {
                      return {};
                  }
              },
              multiple: {
                  type: Boolean,
                  default: false
              },
              showCheckbox: {
                  type: Boolean,
                  default: false
75c32d5f   梁灏   rebuild Tree
57
58
59
60
              }
          },
          data () {
              return {
d44420be   Sergio Crisostomo   refactor and make...
61
                  prefixCls: prefixCls
75c32d5f   梁灏   rebuild Tree
62
63
              };
          },
da76a837   Sergio Crisostomo   fix dom rendering...
64
65
66
          watch: {
  
          },
75c32d5f   梁灏   rebuild Tree
67
68
69
70
          computed: {
              classes () {
                  return [
                      `${prefixCls}-children`
3c145e6f   梁灏   update Tree
71
                  ];
75c32d5f   梁灏   rebuild Tree
72
73
74
75
76
77
78
79
80
81
82
83
84
              },
              selectedCls () {
                  return [
                      {
                          [`${prefixCls}-node-selected`]: this.data.selected
                      }
                  ];
              },
              arrowClasses () {
                  return [
                      `${prefixCls}-arrow`,
                      {
                          [`${prefixCls}-arrow-disabled`]: this.data.disabled,
b31aab71   梁灏   Tree add async lo...
85
                          [`${prefixCls}-arrow-open`]: this.data.expand
75c32d5f   梁灏   rebuild Tree
86
87
88
89
90
91
92
93
94
95
                      }
                  ];
              },
              titleClasses () {
                  return [
                      `${prefixCls}-title`,
                      {
                          [`${prefixCls}-title-selected`]: this.data.selected
                      }
                  ];
b31aab71   梁灏   Tree add async lo...
96
97
98
99
100
101
              },
              showArrow () {
                  return (this.data.children && this.data.children.length) || ('loading' in this.data && !this.data.loading);
              },
              showLoading () {
                  return 'loading' in this.data && this.data.loading;
75c32d5f   梁灏   rebuild Tree
102
103
104
105
              }
          },
          methods: {
              handleExpand () {
b31aab71   梁灏   Tree add async lo...
106
107
108
109
                  const item = this.data;
                  if (item.disabled) return;
  
                  // async loading
da76a837   Sergio Crisostomo   fix dom rendering...
110
                  if (item.children.length === 0) {
b31aab71   梁灏   Tree add async lo...
111
112
                      const tree = findComponentUpward(this, 'Tree');
                      if (tree && tree.loadData) {
da76a837   Sergio Crisostomo   fix dom rendering...
113
114
115
116
117
118
                          this.$set(this.data, 'loading', true);
                          tree.loadData(item, children => {
                              this.$set(this.data, 'loading', false);
                              if (children.length) {
                                  this.$set(this.data, 'children', children);
                                  this.$nextTick(() => this.handleExpand());
b31aab71   梁灏   Tree add async lo...
119
120
121
122
123
124
125
126
127
128
                              }
                          });
                          return;
                      }
                  }
  
                  if (item.children && item.children.length) {
                      this.$set(this.data, 'expand', !this.data.expand);
                      this.dispatch('Tree', 'toggle-expand', this.data);
                  }
75c32d5f   梁灏   rebuild Tree
129
130
131
              },
              handleSelect () {
                  if (this.data.disabled) return;
d44420be   Sergio Crisostomo   refactor and make...
132
                  this.dispatch('Tree', 'on-selected', this.data.nodeKey);
75c32d5f   梁灏   rebuild Tree
133
134
              },
              handleCheck () {
d44420be   Sergio Crisostomo   refactor and make...
135
136
137
138
139
140
                  if (this.data.disabled) return;
                  const changes = {
                      checked: !this.data.checked && !this.data.indeterminate,
                      nodeKey: this.data.nodeKey
                  };
                  this.dispatch('Tree', 'on-check', changes);
75c32d5f   梁灏   rebuild Tree
141
              }
75c32d5f   梁灏   rebuild Tree
142
143
          }
      };
d44420be   Sergio Crisostomo   refactor and make...
144
  </script>