Fixed :draggable not working on the touchscreen, demo improvements

This commit is contained in:
euvl
2017-05-11 17:41:48 +01:00
parent eb0cf8d3fe
commit 079887e5a2
6 changed files with 133 additions and 22 deletions

View File

@@ -3,6 +3,7 @@
<demo-error-modal/> <demo-error-modal/>
<demo-login-modal/> <demo-login-modal/>
<demo-conditional-modal/> <demo-conditional-modal/>
<demo-focus-modal/>
<modal name="example-modal" <modal name="example-modal"
transition="nice-modal-fade" transition="nice-modal-fade"
@@ -39,12 +40,22 @@
<button @click="show(false, false, false)">Simple</button> <button @click="show(false, false, false)">Simple</button>
<button @click="show(true, false, false)">Resizable</button> <button @click="show(true, false, false)">Resizable</button>
<button @click="show(false, true, false)">Adaptive</button> <button @click="show(false, true, false)">Adaptive</button>
<button @click="show(true, true, false)">Mixed</button>
<button @click="show(false, false, true)">Draggable</button> <button @click="show(false, false, true)">Draggable</button>
<br> <br>
<button class="green" @click="$modal.show('error-modal')">Demo: Error handling</button> <button class="green"
<button class="green" @click="$modal.show('demo-login')">Demo: Login</button> @click="$modal.show('error-modal')">
<button :class="canBeShown ? 'green' : 'red'" @click="conditionalShow"> Demo: Error handling
</button>
<button class="green"
@click="$modal.show('demo-login')">
Demo: Login
</button>
<button class="green"
@click="$modal.show('input-focus-modal')">
Demo: Focus Input
</button>
<button :class="canBeShown ? 'green' : 'red'"
@click="conditionalShow">
Can <b v-if="!canBeShown">NOT</b> be shown Can <b v-if="!canBeShown">NOT</b> be shown
</button> </button>
</div> </div>
@@ -57,6 +68,7 @@
import ModesTable from './components/ModesTable.vue' import ModesTable from './components/ModesTable.vue'
import PropsTable from './components/PropsTable.vue' import PropsTable from './components/PropsTable.vue'
import DemoErrorModal from './components/DemoErrorModal.vue' import DemoErrorModal from './components/DemoErrorModal.vue'
import DemoFocusModal from './components/InputFocusModal.vue'
import DemoLoginModal from './components/DemoLoginModal.vue' import DemoLoginModal from './components/DemoLoginModal.vue'
import DemoConditionalModal from './components/ConditionalModal.vue' import DemoConditionalModal from './components/ConditionalModal.vue'
@@ -66,6 +78,7 @@ export default {
ModesTable, ModesTable,
PropsTable, PropsTable,
DemoErrorModal, DemoErrorModal,
DemoFocusModal,
DemoLoginModal, DemoLoginModal,
DemoConditionalModal DemoConditionalModal
}, },

View File

@@ -1,6 +1,7 @@
<template> <template>
<modal name="conditional-modal" <modal name="conditional-modal"
:height="200" :height="200"
:adaptive="true"
@before-open="beforeOpen"> @before-open="beforeOpen">
<div style="padding:30px; text-align: center"> <div style="padding:30px; text-align: center">
Hello! Hello!

View File

@@ -0,0 +1,30 @@
<template>
<modal name="input-focus-modal"
:height="150"
:adaptive="true"
@opened="opened">
<div style="padding: 30px; text-align: center">
<input class="huge-font" type="text" placeholder="email" ref="email">
</div>
</modal>
</template>
<script>
export default {
name: 'InputFocusModal',
methods: {
opened (event) {
console.log(this.$refs.email)
// this.$refs.email.focus();
}
}
}
</script>
<style>
input.huge-font {
font-size: 70px;
font-weight: 100;
text-align: center;
min-width: auto;
width: 100%;
}
</style>

View File

@@ -19,9 +19,9 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td><b>Mixed</b></td> <td><b>Draggable</b></td>
<td> <td>
Is resizable, but if the size of the screen is changed - modal will try to adapt to the page size Allows to drag modal on the screen
</td> </td>
</tr> </tr>
</table> </table>

53
dist/index.js vendored
View File

@@ -546,7 +546,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony default export */ __webpack_exports__["default"] = { /* harmony default export */ __webpack_exports__["default"] = {
name: 'Modal', name: 'VueJsModal',
props: { props: {
name: { name: {
required: true, required: true,
@@ -716,11 +716,18 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
}, },
genEventObject: function genEventObject(params) { genEventObject: function genEventObject(params) {
//todo: clean this up (change to ...) //todo: clean this up (change to ...)
return __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].util.extend({ var data = {
name: this.name, name: this.name,
timestamp: Date.now(),
canceled: false,
ref: this.$refs.modal, ref: this.$refs.modal,
timestamp: Date.now() stop: function stop() {
}, params || {}); this.canceled = true;
}
};
return __WEBPACK_IMPORTED_MODULE_0_vue__["a" /* default */].util.extend(data, params || {});
// return event
}, },
adaptSize: function adaptSize() { adaptSize: function adaptSize() {
if (this.adaptive) { if (this.adaptive) {
@@ -758,6 +765,13 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
this.$emit(afterEventName, afterEvent); this.$emit(afterEventName, afterEvent);
} }
}, },
emitCancelableEvent: function emitCancelableEvent(data) {
var stopEventExecution = false;
var stop = function stop() {
stopEventExecution = true;
};
var event = this.genEventObject(data);
},
getDraggableElement: function getDraggableElement() { getDraggableElement: function getDraggableElement() {
var selector = typeof this.draggable !== 'string' ? '.v--modal-box' : this.draggable; var selector = typeof this.draggable !== 'string' ? '.v--modal-box' : this.draggable;
@@ -784,30 +798,51 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
var cachedShiftX = 0; var cachedShiftX = 0;
var cachedShiftY = 0; var cachedShiftY = 0;
var getPosition = function getPosition(event) {
return event.touches && event.touches.length > 0 ? event.touches[0] : event;
};
var mousedown = function mousedown(event) { var mousedown = function mousedown(event) {
var _getPosition = getPosition(event),
clientX = _getPosition.clientX,
clientY = _getPosition.clientY;
document.addEventListener('mousemove', mousemove); document.addEventListener('mousemove', mousemove);
document.addEventListener('mouseup', mouseup); document.addEventListener('mouseup', mouseup);
startX = event.clientX; document.addEventListener('touchmove', mousemove);
startY = event.clientY; document.addEventListener('touchend', mouseup);
startX = clientX;
startY = clientY;
cachedShiftX = _this3.shift.left; cachedShiftX = _this3.shift.left;
cachedShiftY = _this3.shift.top; cachedShiftY = _this3.shift.top;
event.preventDefault(); event.preventDefault();
}; };
var mousemove = function mousemove(event) { var mousemove = function mousemove(event) {
_this3.shift.left = cachedShiftX + event.clientX - startX; var _getPosition2 = getPosition(event),
_this3.shift.top = cachedShiftY + event.clientY - startY; clientX = _getPosition2.clientX,
clientY = _getPosition2.clientY;
_this3.shift.left = cachedShiftX + clientX - startX;
_this3.shift.top = cachedShiftY + clientY - startY;
event.preventDefault(); event.preventDefault();
}; };
var mouseup = function mouseup(event) { var mouseup = function mouseup(event) {
document.removeEventListener('mousemove', mousemove); document.removeEventListener('mousemove', mousemove);
document.removeEventListener('mouseup', mouseup); document.removeEventListener('mouseup', mouseup);
document.removeEventListener('touchmove', mousemove);
document.removeEventListener('touchend', mouseup);
event.preventDefault(); event.preventDefault();
}; };
dragger.addEventListener('mousedown', mousedown); dragger.addEventListener('mousedown', mousedown);
dragger.addEventListener('touchstart', mousedown);
})(); })();
} }
}, },
@@ -831,7 +866,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony default export */ __webpack_exports__["default"] = { /* harmony default export */ __webpack_exports__["default"] = {
name: 'Resizer', name: 'VueJsModalResizer',
props: { props: {
minHeight: { minHeight: {
type: Number, type: Number,

View File

@@ -193,11 +193,18 @@
genEventObject (params) { genEventObject (params) {
//todo: clean this up (change to ...) //todo: clean this up (change to ...)
return Vue.util.extend({ var data = {
name: this.name, name: this.name,
timestamp: Date.now(),
canceled: false,
ref: this.$refs.modal, ref: this.$refs.modal,
timestamp: Date.now() stop: function() {
}, params || {}); this.canceled = true
}
}
return Vue.util.extend(data, params || {});
// return event
}, },
adaptSize () { adaptSize () {
@@ -236,6 +243,12 @@
} }
}, },
emitCancelableEvent (data) {
let stopEventExecution = false
let stop = () => { stopEventExecution = true }
let event = this.genEventObject(data)
},
getDraggableElement () { getDraggableElement () {
var selector = typeof this.draggable !== 'string' var selector = typeof this.draggable !== 'string'
? '.v--modal-box' ? '.v--modal-box'
@@ -262,30 +275,49 @@
let cachedShiftX = 0 let cachedShiftX = 0
let cachedShiftY = 0 let cachedShiftY = 0
let getPosition = (event) => {
return event.touches && event.touches.length > 0
? event.touches[0]
: event
}
let mousedown = (event) => { let mousedown = (event) => {
let { clientX, clientY } = getPosition(event)
document.addEventListener('mousemove', mousemove) document.addEventListener('mousemove', mousemove)
document.addEventListener('mouseup', mouseup) document.addEventListener('mouseup', mouseup)
startX = event.clientX document.addEventListener('touchmove', mousemove)
startY = event.clientY document.addEventListener('touchend', mouseup)
startX = clientX
startY = clientY
cachedShiftX = this.shift.left cachedShiftX = this.shift.left
cachedShiftY = this.shift.top cachedShiftY = this.shift.top
event.preventDefault() event.preventDefault()
} }
let mousemove = (event) => { let mousemove = (event) => {
this.shift.left = cachedShiftX + event.clientX - startX let { clientX, clientY } = getPosition(event)
this.shift.top = cachedShiftY + event.clientY - startY
this.shift.left = cachedShiftX + clientX - startX
this.shift.top = cachedShiftY + clientY - startY
event.preventDefault() event.preventDefault()
} }
let mouseup = (event) => { let mouseup = (event) => {
document.removeEventListener('mousemove', mousemove) document.removeEventListener('mousemove', mousemove)
document.removeEventListener('mouseup', mouseup) document.removeEventListener('mouseup', mouseup)
document.removeEventListener('touchmove', mousemove)
document.removeEventListener('touchend', mouseup)
event.preventDefault() event.preventDefault()
} }
dragger.addEventListener('mousedown', mousedown) dragger.addEventListener('mousedown', mousedown)
dragger.addEventListener('touchstart', mousedown)
} }
}, },