Skip to content

Commit a575ca1

Browse files
committed
#27, make before-open, before-close stoppable
1 parent fac4ffb commit a575ca1

File tree

6 files changed

+40
-18
lines changed

6 files changed

+40
-18
lines changed

dist/VueFinalModal.esm.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/VueFinalModal.esm.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/VueFinalModal.umd.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/VueFinalModal.umd.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/PluginCore.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ function createVfm(options) {
77
return function() {
88
vfm = {
99
isScrollLocked: false,
10-
openedModals: [],
10+
get openedModals() {
11+
return this.modals.filter(modal => modal.value)
12+
},
1113
modals: [],
1214
show(name) {
1315
this.toggle(name, true)

lib/VueFinalModal.vue

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ export default {
109109
overlay: false
110110
},
111111
overlayTransitionState: null,
112-
modalTransitionState: null
112+
modalTransitionState: null,
113+
stopEvent: false
113114
}),
114115
computed: {
115116
api() {
@@ -135,6 +136,10 @@ export default {
135136
},
136137
watch: {
137138
value(value) {
139+
if (this.stopEvent) {
140+
this.stopEvent = false
141+
return
142+
}
138143
this.mounted()
139144
if (!value) {
140145
this.close()
@@ -173,12 +178,6 @@ export default {
173178
let target = this.getAttachElement()
174179
if (target || this.attach === false) {
175180
this.attach !== false && target.appendChild(this.$el)
176-
let index = this.api.openedModals.findIndex(vm => vm === this)
177-
if (index !== -1) {
178-
// if this is already exist in modalStack, delete it
179-
this.api.openedModals.splice(index, 1)
180-
}
181-
this.api.openedModals.push(this)
182181
183182
this.modalStackIndex = this.api.openedModals.length - 1
184183
@@ -192,6 +191,9 @@ export default {
192191
vm.visibility.overlay = false
193192
}
194193
})
194+
if (this.emitEvent('before-open', false)) {
195+
return
196+
}
195197
196198
this.visible = true
197199
this.$nextTick(() => {
@@ -203,10 +205,8 @@ export default {
203205
}
204206
},
205207
close() {
206-
let index = this.api.openedModals.findIndex(vm => vm === this)
207-
if (index !== -1) {
208-
// remove this in modalStack
209-
this.api.openedModals.splice(index, 1)
208+
if (this.emitEvent('before-close', true)) {
209+
return
210210
}
211211
if (this.api.openedModals.length > 0) {
212212
// If there are still nested modals opened
@@ -262,7 +262,6 @@ export default {
262262
this.overlayTransitionState = TransitionState.Leave
263263
},
264264
beforeModalEnter() {
265-
this.$emit('before-open')
266265
this.modalTransitionState = TransitionState.Entering
267266
},
268267
afterModalEnter() {
@@ -276,7 +275,6 @@ export default {
276275
this.$emit('opened')
277276
},
278277
beforeModalLeave() {
279-
this.$emit('before-close')
280278
this.modalTransitionState = TransitionState.Leaving
281279
282280
if (this.$focusTrap.enabled()) {
@@ -300,6 +298,28 @@ export default {
300298
if (evt.keyCode === 27 && this.visible && this.escToClose) {
301299
this.$emit('input', false)
302300
}
301+
},
302+
createModalEvent(params = {}) {
303+
return {
304+
ref: this,
305+
...params
306+
}
307+
},
308+
emitEvent(eventType, value) {
309+
let stopEvent = false
310+
const event = this.createModalEvent({
311+
type: eventType,
312+
stop() {
313+
stopEvent = true
314+
}
315+
})
316+
this.$emit(eventType, event)
317+
if (stopEvent) {
318+
this.stopEvent = true
319+
this.$emit('input', value)
320+
return true
321+
}
322+
return false
303323
}
304324
}
305325
}

0 commit comments

Comments
 (0)