vuetify
Version:
Vue Material Component Framework
80 lines (66 loc) • 1.73 kB
text/typescript
import { factory as PositionableFactory } from '../positionable'
import { TargetProp } from 'vuetify/types/services/application'
// Util
import mixins from '../../util/mixins'
export default function applicationable (value: TargetProp, events: string[] = []) {
/* @vue/component */
return mixins(PositionableFactory(['absolute', 'fixed'])).extend({
name: 'applicationable',
props: {
app: Boolean,
},
computed: {
applicationProperty (): TargetProp {
return value
},
},
watch: {
// If previous value was app
// reset the provided prop
app (x: boolean, prev: boolean) {
prev
? this.removeApplication(true)
: this.callUpdate()
},
applicationProperty (newVal, oldVal) {
this.$vuetify.application.unregister(this._uid, oldVal)
},
},
activated () {
this.callUpdate()
},
created () {
for (let i = 0, length = events.length; i < length; i++) {
this.$watch(events[i], this.callUpdate)
}
this.callUpdate()
},
mounted () {
this.callUpdate()
},
deactivated () {
this.removeApplication()
},
destroyed () {
this.removeApplication()
},
methods: {
callUpdate () {
if (!this.app) return
this.$vuetify.application.register(
this._uid,
this.applicationProperty,
this.updateApplication()
)
},
removeApplication (force = false) {
if (!force && !this.app) return
this.$vuetify.application.unregister(
this._uid,
this.applicationProperty
)
},
updateApplication: () => 0,
},
})
}