Blame view

src/components/modal/modal.vue 8.13 KB
be966e9f   梁灏   add Modal component
1
  <template>
548eac43   梁灏   fixed #1387 and u...
2
      <div v-transfer-dom :data-transfer="transfer">
672a2805   梁灏   fixed #505
3
          <transition :name="transitionNames[1]">
6259471f   梁灏   support Modal
4
5
6
              <div :class="maskClasses" v-show="visible" @click="mask"></div>
          </transition>
          <div :class="wrapClasses" @click="handleWrapClick">
f3454b37   marvinwilliam   add modal hidden ...
7
              <transition :name="transitionNames[0]" @after-leave="animationFinish">
6259471f   梁灏   support Modal
8
9
10
11
                  <div :class="classes" :style="mainStyles" v-show="visible">
                      <div :class="[prefixCls + '-content']">
                          <a :class="[prefixCls + '-close']" v-if="closable" @click="close">
                              <slot name="close">
06a4433d   梁灏   update Modal Icons
12
                                  <Icon type="ios-close"></Icon>
6259471f   梁灏   support Modal
13
14
15
16
17
18
                              </slot>
                          </a>
                          <div :class="[prefixCls + '-header']" v-if="showHead"><slot name="header"><div :class="[prefixCls + '-header-inner']">{{ title }}</div></slot></div>
                          <div :class="[prefixCls + '-body']"><slot></slot></div>
                          <div :class="[prefixCls + '-footer']" v-if="!footerHide">
                              <slot name="footer">
e5337c81   梁灏   fixed some compon...
19
20
                                  <i-button type="text" size="large" @click.native="cancel">{{ localeCancelText }}</i-button>
                                  <i-button type="primary" size="large" :loading="buttonLoading" @click.native="ok">{{ localeOkText }}</i-button>
6259471f   梁灏   support Modal
21
22
23
                              </slot>
                          </div>
                      </div>
be966e9f   梁灏   add Modal component
24
                  </div>
6259471f   梁灏   support Modal
25
              </transition>
be966e9f   梁灏   add Modal component
26
          </div>
713bd3d7   梁灏   fixed #583
27
      </div>
be966e9f   梁灏   add Modal component
28
29
30
  </template>
  <script>
      import Icon from '../icon';
4b7138b9   梁灏   fixed some bugs
31
      import iButton from '../button/button.vue';
713bd3d7   梁灏   fixed #583
32
      import TransferDom from '../../directives/transfer-dom';
e5337c81   梁灏   fixed some compon...
33
      import Locale from '../../mixins/locale';
67c9b1c8   梁灏   fixed #591
34
      import Emitter from '../../mixins/emitter';
297648f1   梁灏   fixed #1063
35
      import ScrollbarMixins from './mixins-scrollbar';
be966e9f   梁灏   add Modal component
36
37
38
39
  
      const prefixCls = 'ivu-modal';
  
      export default {
e5337c81   梁灏   fixed some compon...
40
          name: 'Modal',
297648f1   梁灏   fixed #1063
41
          mixins: [ Locale, Emitter, ScrollbarMixins ],
4b7138b9   梁灏   fixed some bugs
42
          components: { Icon, iButton },
713bd3d7   梁灏   fixed #583
43
          directives: { TransferDom },
be966e9f   梁灏   add Modal component
44
          props: {
6259471f   梁灏   support Modal
45
              value: {
be966e9f   梁灏   add Modal component
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
                  type: Boolean,
                  default: false
              },
              closable: {
                  type: Boolean,
                  default: true
              },
              maskClosable: {
                  type: Boolean,
                  default: true
              },
              title: {
                  type: String
              },
              width: {
                  type: [Number, String],
                  default: 520
              },
              okText: {
e5337c81   梁灏   fixed some compon...
65
                  type: String
be966e9f   梁灏   add Modal component
66
67
              },
              cancelText: {
e5337c81   梁灏   fixed some compon...
68
                  type: String
be966e9f   梁灏   add Modal component
69
70
71
72
73
              },
              loading: {
                  type: Boolean,
                  default: false
              },
6259471f   梁灏   support Modal
74
              styles: {
be966e9f   梁灏   add Modal component
75
76
77
78
79
80
81
82
83
                  type: Object
              },
              className: {
                  type: String
              },
              // for instance
              footerHide: {
                  type: Boolean,
                  default: false
f9a2e611   Rijn   added scrolling p...
84
              },
5d0b89ce   Rijn   change scrolling ...
85
              scrollable: {
f9a2e611   Rijn   added scrolling p...
86
87
                  type: Boolean,
                  default: false
672a2805   梁灏   fixed #505
88
89
90
91
92
93
              },
              transitionNames: {
                  type: Array,
                  default () {
                      return ['ease', 'fade'];
                  }
548eac43   梁灏   fixed #1387 and u...
94
95
96
97
              },
              transfer: {
                  type: Boolean,
                  default: true
be966e9f   梁灏   add Modal component
98
99
100
101
102
103
104
              }
          },
          data () {
              return {
                  prefixCls: prefixCls,
                  wrapShow: false,
                  showHead: true,
6259471f   梁灏   support Modal
105
106
                  buttonLoading: false,
                  visible: this.value
b0893113   jingsam   :art: add eslint
107
              };
be966e9f   梁灏   add Modal component
108
109
110
111
112
113
114
115
116
          },
          computed: {
              wrapClasses () {
                  return [
                      `${prefixCls}-wrap`,
                      {
                          [`${prefixCls}-hidden`]: !this.wrapShow,
                          [`${this.className}`]: !!this.className
                      }
b0893113   jingsam   :art: add eslint
117
                  ];
be966e9f   梁灏   add Modal component
118
119
120
121
122
123
124
              },
              maskClasses () {
                  return `${prefixCls}-mask`;
              },
              classes () {
                  return `${prefixCls}`;
              },
6259471f   梁灏   support Modal
125
              mainStyles () {
be966e9f   梁灏   add Modal component
126
127
                  let style = {};
  
f03c4e64   梁灏   Modal update widt...
128
                  const width = parseInt(this.width);
be966e9f   梁灏   add Modal component
129
                  const styleWidth = {
f03c4e64   梁灏   Modal update widt...
130
                      width: width <= 100 ? `${width}%` : `${width}px`
be966e9f   梁灏   add Modal component
131
132
                  };
  
6259471f   梁灏   support Modal
133
                  const customStyle = this.styles ? this.styles : {};
be966e9f   梁灏   add Modal component
134
135
136
137
  
                  Object.assign(style, styleWidth, customStyle);
  
                  return style;
e5337c81   梁灏   fixed some compon...
138
139
140
141
142
143
144
145
146
147
148
149
150
151
              },
              localeOkText () {
                  if (this.okText === undefined) {
                      return this.t('i.modal.okText');
                  } else {
                      return this.okText;
                  }
              },
              localeCancelText () {
                  if (this.cancelText === undefined) {
                      return this.t('i.modal.cancelText');
                  } else {
                      return this.cancelText;
                  }
be966e9f   梁灏   add Modal component
152
153
154
155
156
              }
          },
          methods: {
              close () {
                  this.visible = false;
6259471f   梁灏   support Modal
157
                  this.$emit('input', false);
be966e9f   梁灏   add Modal component
158
159
160
161
162
163
164
                  this.$emit('on-cancel');
              },
              mask () {
                  if (this.maskClosable) {
                      this.close();
                  }
              },
09bce8de   梁灏   update Modal
165
166
              handleWrapClick (event) {
                  // use indexOf,do not use === ,because ivu-modal-wrap can have other custom className
48dd8ebf   梁灏   update Modal
167
168
                  const className = event.target.getAttribute('class');
                  if (className && className.indexOf(`${prefixCls}-wrap`) > -1) this.mask();
09bce8de   梁灏   update Modal
169
              },
be966e9f   梁灏   add Modal component
170
171
172
173
174
175
176
177
              cancel () {
                  this.close();
              },
              ok () {
                  if (this.loading) {
                      this.buttonLoading = true;
                  } else {
                      this.visible = false;
6259471f   梁灏   support Modal
178
                      this.$emit('input', false);
be966e9f   梁灏   add Modal component
179
180
181
182
183
184
                  }
                  this.$emit('on-ok');
              },
              EscClose (e) {
                  if (this.visible && this.closable) {
                      if (e.keyCode === 27) {
b0893113   jingsam   :art: add eslint
185
                          this.close();
be966e9f   梁灏   add Modal component
186
187
188
                      }
                  }
              },
f3454b37   marvinwilliam   add modal hidden ...
189
190
              animationFinish() {
                  this.$emit('on-hidden');
be966e9f   梁灏   add Modal component
191
192
              }
          },
6259471f   梁灏   support Modal
193
          mounted () {
be966e9f   梁灏   add Modal component
194
195
196
197
198
199
              if (this.visible) {
                  this.wrapShow = true;
              }
  
              let showHead = true;
  
2ac208b9   梁灏   fixed #407
200
              if (this.$slots.header === undefined && !this.title) {
be966e9f   梁灏   add Modal component
201
202
203
204
205
206
207
208
209
210
                  showHead = false;
              }
  
              this.showHead = showHead;
  
              // ESC close
              document.addEventListener('keydown', this.EscClose);
          },
          beforeDestroy () {
              document.removeEventListener('keydown', this.EscClose);
727b795c   梁灏   reset body scroll...
211
              this.removeScrollEffect();
be966e9f   梁灏   add Modal component
212
213
          },
          watch: {
6259471f   梁灏   support Modal
214
215
              value (val) {
                  this.visible = val;
6259471f   梁灏   support Modal
216
              },
be966e9f   梁灏   add Modal component
217
218
219
              visible (val) {
                  if (val === false) {
                      this.buttonLoading = false;
e011898c   梁灏   fixed #197
220
                      this.timer = setTimeout(() => {
be966e9f   梁灏   add Modal component
221
                          this.wrapShow = false;
9084eb18   梁灏   fixed #92
222
                          this.removeScrollEffect();
be966e9f   梁灏   add Modal component
223
                      }, 300);
be966e9f   梁灏   add Modal component
224
                  } else {
e011898c   梁灏   fixed #197
225
                      if (this.timer) clearTimeout(this.timer);
be966e9f   梁灏   add Modal component
226
                      this.wrapShow = true;
5d0b89ce   Rijn   change scrolling ...
227
                      if (!this.scrollable) {
f9a2e611   Rijn   added scrolling p...
228
229
                          this.addScrollEffect();
                      }
be966e9f   梁灏   add Modal component
230
                  }
67c9b1c8   梁灏   fixed #591
231
                  this.broadcast('Table', 'on-visible-change', val);
2eccfc99   梁灏   fixed #2852
232
                  this.broadcast('Slider', 'on-visible-change', val);  // #2852
d1f698ca   yangdan8   Modal弹窗请添加on-visi...
233
                  this.$emit('on-visible-change', val);
3c01d81a   梁灏   fixed Modal bug,w...
234
235
236
237
238
              },
              loading (val) {
                  if (!val) {
                      this.buttonLoading = false;
                  }
f9a2e611   Rijn   added scrolling p...
239
              },
5d0b89ce   Rijn   change scrolling ...
240
              scrollable (val) {
f346ce4b   Rijn   lint fix
241
                  if (!val) {
f9a2e611   Rijn   added scrolling p...
242
243
244
245
                      this.addScrollEffect();
                  } else {
                      this.removeScrollEffect();
                  }
f024ab82   H   修复modal标题属性首次如果没有...
246
247
248
              },
              title (val) {
                  if (this.$slots.header === undefined) {
c5625bfd   梁灏   update Modal
249
                      this.showHead = !!val;
f024ab82   H   修复modal标题属性首次如果没有...
250
                  }
be966e9f   梁灏   add Modal component
251
252
              }
          }
b0893113   jingsam   :art: add eslint
253
      };
d6342fe1   jingsam   fixed ie bug
254
  </script>