Blame view

src/components/steps/steps.vue 4.33 KB
7fa943eb   梁灏   init
1
2
3
4
5
6
7
8
9
10
  <template>
      <div :class="classes">
          <slot></slot>
      </div>
  </template>
  <script>
      import { oneOf } from '../../utils/assist';
  
      const prefixCls = 'ivu-steps';
  
d4cd421c   梁灏   update Steps
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
      function debounce(fn) {
          let waiting;
          return function() {
              if (waiting) return;
              waiting = true;
              const context = this,
                  args = arguments;
              const later = function() {
                  waiting = false;
                  fn.apply(context, args);
              };
              this.$nextTick(later);
          };
      }
  
7fa943eb   梁灏   init
26
      export default {
34ee7b4a   梁灏   support Tree & ad...
27
          name: 'Steps',
7fa943eb   梁灏   init
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
          props: {
              current: {
                  type: Number,
                  default: 0
              },
              status: {
                  validator (value) {
                      return oneOf(value, ['wait', 'process', 'finish', 'error']);
                  },
                  default: 'process'
              },
              size: {
                  validator (value) {
                      return oneOf(value, ['small']);
                  }
              },
              direction: {
                  validator (value) {
                      return oneOf(value, ['horizontal', 'vertical']);
                  },
                  default: 'horizontal'
              }
          },
          computed: {
              classes () {
                  return [
                      `${prefixCls}`,
                      `${prefixCls}-${this.direction}`,
                      {
                          [`${prefixCls}-${this.size}`]: !!this.size
                      }
b0893113   jingsam   :art: add eslint
59
                  ];
7fa943eb   梁灏   init
60
61
              }
          },
7fa943eb   梁灏   init
62
63
          methods: {
              updateChildProps (isInit) {
45b672ca   梁灏   add Steps UI
64
                  const total = this.$children.length;
7fa943eb   梁灏   init
65
66
67
                  this.$children.forEach((child, index) => {
                      child.stepNumber = index + 1;
  
45b672ca   梁灏   add Steps UI
68
69
70
71
                      if (this.direction === 'horizontal') {
                          child.total = total;
                      }
  
7fa943eb   梁灏   init
72
73
                      // 如果已存在status,且在初始化时,则略过
                      // todo 如果当前是error,在current改变时需要处理
b450b555   huixisheng   update Steps
74
                      if (!(isInit && child.currentStatus)) {
7fa943eb   梁灏   init
75
76
                          if (index == this.current) {
                              if (this.status != 'error') {
b450b555   huixisheng   update Steps
77
                                  child.currentStatus = 'process';
7fa943eb   梁灏   init
78
79
                              }
                          } else if (index < this.current) {
b450b555   huixisheng   update Steps
80
                              child.currentStatus = 'finish';
7fa943eb   梁灏   init
81
                          } else {
b450b555   huixisheng   update Steps
82
                              child.currentStatus = 'wait';
7fa943eb   梁灏   init
83
84
85
                          }
                      }
  
b450b555   huixisheng   update Steps
86
                      if (child.currentStatus != 'error' && index != 0) {
7fa943eb   梁灏   init
87
88
89
90
91
92
                          this.$children[index - 1].nextError = false;
                      }
                  });
              },
              setNextError () {
                  this.$children.forEach((child, index) => {
b450b555   huixisheng   update Steps
93
                      if (child.currentStatus == 'error' && index != 0) {
7fa943eb   梁灏   init
94
95
96
97
98
                          this.$children[index - 1].nextError = true;
                      }
                  });
              },
              updateCurrent (isInit) {
b450b555   huixisheng   update Steps
99
100
101
102
                  // 防止溢出边界
                  if (this.current < 0 || this.current >= this.$children.length ) {
                      return;
                  }
7fa943eb   梁灏   init
103
                  if (isInit) {
b450b555   huixisheng   update Steps
104
                      const current_status = this.$children[this.current].currentStatus;
7fa943eb   梁灏   init
105
                      if (!current_status) {
b450b555   huixisheng   update Steps
106
                          this.$children[this.current].currentStatus = this.status;
7fa943eb   梁灏   init
107
108
                      }
                  } else {
b450b555   huixisheng   update Steps
109
                      this.$children[this.current].currentStatus = this.status;
7fa943eb   梁灏   init
110
                  }
d4cd421c   梁灏   update Steps
111
112
113
114
115
116
117
118
119
120
              },
              debouncedAppendRemove () {
                  return debounce(function () {
                      this.updateSteps();
                  });
              },
              updateSteps () {
                  this.updateChildProps(true);
                  this.setNextError();
                  this.updateCurrent(true);
7fa943eb   梁灏   init
121
122
              }
          },
d4cd421c   梁灏   update Steps
123
124
125
126
127
          mounted () {
              this.updateSteps();
              this.$on('append', this.debouncedAppendRemove());
              this.$on('remove', this.debouncedAppendRemove());
          },
7fa943eb   梁灏   init
128
129
130
131
132
133
134
135
          watch: {
              current () {
                  this.updateChildProps();
              },
              status () {
                  this.updateCurrent();
              }
          }
b0893113   jingsam   :art: add eslint
136
137
      };
  </script>