vuetify
Version:
Vue.js 2 Semantic Component Framework
328 lines (276 loc) • 9.12 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
require('../../../src/stylus/components/_navigation-drawer.styl');
var _applicationable = require('../../mixins/applicationable');
var _applicationable2 = _interopRequireDefault(_applicationable);
var _overlayable = require('../../mixins/overlayable');
var _overlayable2 = _interopRequireDefault(_overlayable);
var _ssrBootable = require('../../mixins/ssr-bootable');
var _ssrBootable2 = _interopRequireDefault(_ssrBootable);
var _themeable = require('../../mixins/themeable');
var _themeable2 = _interopRequireDefault(_themeable);
var _clickOutside = require('../../directives/click-outside');
var _clickOutside2 = _interopRequireDefault(_clickOutside);
var _resize = require('../../directives/resize');
var _resize2 = _interopRequireDefault(_resize);
var _touch = require('../../directives/touch');
var _touch2 = _interopRequireDefault(_touch);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = {
name: 'v-navigation-drawer',
mixins: [(0, _applicationable2.default)(null, ['miniVariant', 'right', 'width']), _overlayable2.default, _ssrBootable2.default, _themeable2.default],
directives: {
ClickOutside: _clickOutside2.default,
Resize: _resize2.default,
Touch: _touch2.default
},
data: function data() {
return {
isActive: false,
touchArea: {
left: 0,
right: 0
}
};
},
props: {
clipped: Boolean,
disableRouteWatcher: Boolean,
disableResizeWatcher: Boolean,
height: {
type: [Number, String],
default: '100%'
},
floating: Boolean,
miniVariant: Boolean,
miniVariantWidth: {
type: [Number, String],
default: 80
},
mobileBreakPoint: {
type: [Number, String],
default: 1264
},
permanent: Boolean,
right: Boolean,
stateless: Boolean,
temporary: Boolean,
touchless: Boolean,
width: {
type: [Number, String],
default: 300
},
value: { required: false }
},
computed: {
/**
* Used for setting an app
* value from a dynamic
* property. Called from
* applicationable.js
*
* @return {string}
*/
applicationProperty: function applicationProperty() {
return this.right ? 'right' : 'left';
},
calculatedHeight: function calculatedHeight() {
return isNaN(this.height) ? this.height : this.height + 'px';
},
calculatedTransform: function calculatedTransform() {
if (this.isActive) return 0;
return this.right ? this.calculatedWidth : -this.calculatedWidth;
},
calculatedWidth: function calculatedWidth() {
return this.miniVariant ? this.miniVariantWidth : this.width;
},
classes: function classes() {
return {
'navigation-drawer': true,
'navigation-drawer--absolute': this.absolute,
'navigation-drawer--clipped': this.clipped,
'navigation-drawer--close': !this.isActive,
'navigation-drawer--fixed': !this.absolute && (this.app || this.fixed),
'navigation-drawer--floating': this.floating,
'navigation-drawer--is-mobile': this.isMobile,
'navigation-drawer--mini-variant': this.miniVariant,
'navigation-drawer--open': this.isActive,
'navigation-drawer--right': this.right,
'navigation-drawer--temporary': this.temporary,
'theme--dark': this.dark,
'theme--light': this.light
};
},
isMobile: function isMobile() {
return !this.permanent && !this.temporary && this.$vuetify.breakpoint.width < parseInt(this.mobileBreakPoint, 10);
},
marginTop: function marginTop() {
if (!this.app) return 0;
var marginTop = this.$vuetify.application.bar;
marginTop += this.clipped ? this.$vuetify.application.top : 0;
return marginTop;
},
maxHeight: function maxHeight() {
if (!this.app) return '100%';
return this.clipped ? this.$vuetify.application.top + this.$vuetify.application.bottom : this.$vuetify.application.bottom;
},
reactsToClick: function reactsToClick() {
return !this.stateless && !this.permanent && (this.isMobile || this.temporary);
},
reactsToMobile: function reactsToMobile() {
return !this.disableResizeWatcher && !this.stateless && !this.permanent && !this.temporary;
},
reactsToRoute: function reactsToRoute() {
return !this.disableRouteWatcher && !this.stateless && (this.temporary || this.isMobile);
},
resizeIsDisabled: function resizeIsDisabled() {
return this.disableResizeWatcher || this.stateless;
},
showOverlay: function showOverlay() {
return this.isActive && (this.isMobile || this.temporary);
},
styles: function styles() {
var styles = {
height: this.calculatedHeight,
marginTop: this.marginTop + 'px',
maxHeight: 'calc(100% - ' + this.maxHeight + 'px)',
transform: 'translateX(' + this.calculatedTransform + 'px)',
width: this.calculatedWidth + 'px'
};
return styles;
}
},
watch: {
$route: function $route() {
if (this.reactsToRoute && this.closeConditional()) {
this.isActive = false;
}
},
isActive: function isActive(val) {
this.$emit('input', val);
this.callUpdate();
},
/**
* When mobile changes, adjust
* the active state only when
* there has been a previous
* value
*/
isMobile: function isMobile(val, prev) {
!val && this.isActive && !this.temporary && this.removeOverlay();
if (prev == null || this.resizeIsDisabled || !this.reactsToMobile) return;
this.isActive = !val;
this.callUpdate();
},
permanent: function permanent(val) {
// If enabling prop
// enable the drawer
if (val) {
this.isActive = true;
}
this.callUpdate();
},
showOverlay: function showOverlay(val) {
if (val) this.genOverlay();else this.removeOverlay();
},
temporary: function temporary() {
this.callUpdate();
},
value: function value(val) {
if (this.permanent) return;
if (val == null) return this.init();
if (val !== this.isActive) this.isActive = val;
}
},
beforeMount: function beforeMount() {
this.init();
},
methods: {
calculateTouchArea: function calculateTouchArea() {
if (!this.$el.parentNode) return;
var parentRect = this.$el.parentNode.getBoundingClientRect();
this.touchArea = {
left: parentRect.left + 50,
right: parentRect.right - 50
};
},
closeConditional: function closeConditional() {
return this.isActive && this.reactsToClick;
},
genDirectives: function genDirectives() {
var _this = this;
var directives = [{
name: 'click-outside',
value: function value() {
return _this.isActive = false;
},
args: {
closeConditional: this.closeConditional
}
}];
!this.touchless && directives.push({
name: 'touch',
value: {
parent: true,
left: this.swipeLeft,
right: this.swipeRight
}
});
return directives;
},
/**
* Sets state before mount to avoid
* entry transitions in SSR
*
* @return {void}
*/
init: function init() {
if (this.permanent) {
this.isActive = true;
} else if (this.stateless || this.value != null) {
this.isActive = this.value;
} else if (!this.temporary) {
this.isActive = !this.isMobile;
}
},
swipeRight: function swipeRight(e) {
if (this.isActive && !this.right) return;
this.calculateTouchArea();
if (Math.abs(e.touchendX - e.touchstartX) < 100) return;
if (!this.right && e.touchstartX <= this.touchArea.left) this.isActive = true;else if (this.right && this.isActive) this.isActive = false;
},
swipeLeft: function swipeLeft(e) {
if (this.isActive && this.right) return;
this.calculateTouchArea();
if (Math.abs(e.touchendX - e.touchstartX) < 100) return;
if (this.right && e.touchstartX >= this.touchArea.right) this.isActive = true;else if (!this.right && this.isActive) this.isActive = false;
},
/**
* Update the application layout
*
* @return {number}
*/
updateApplication: function updateApplication() {
return !this.isActive || this.temporary || this.isMobile ? 0 : this.calculatedWidth;
}
},
render: function render(h) {
var _this2 = this;
var data = {
'class': this.classes,
style: this.styles,
directives: this.genDirectives(),
on: {
click: function click() {
if (!_this2.miniVariant) return;
_this2.$emit('update:miniVariant', false);
}
}
};
return h('aside', data, [this.$slots.default, h('div', { 'class': 'navigation-drawer__border' })]);
}
};
// Directives
// Mixins