@itools-front/ifrontui
Version:
Vue Material Component Framework
178 lines (167 loc) • 4.48 kB
text/typescript
// Styles
import './WNavigatorBar.sass'
// Extensions
import VAppBar from '../VAppBar/VAppBar'
// Components
import VAvatar from '../VAvatar/VAvatar'
import VChip from '../VChip/VChip'
import VSpacer from '../VGrid/VSpacer'
import VList from '../VList/VList'
import VListItem from '../VList/VListItem'
import VIcon from '../VIcon/VIcon'
import VBtn from '../VBtn/VBtn'
// Utilities
import { getSlot } from '../../util/helpers'
// Types
import { VNode } from 'vue'
/* @vue/component */
export default VAppBar.extend({
name: 'w-navigator-bar',
props: {
title: {
type: String,
},
pageName: {
type: String,
},
logo_src: {
type: String,
required: true,
},
},
data: () => ({
currentBarWidth: 0,
widthThreshold: 700,
listVisible: false,
list: {} as VNode,
colors: {
primary: '#1976d2 !important',
error: '#ff5252 !important',
success: '#4caf50 !important',
warning: '#fb8c00 !important',
}
}),
mounted(){
this.currentBarWidth = window.innerWidth
window.addEventListener('resize', () => {
this.currentBarWidth = window.innerWidth
});
},
methods: {
genLogo(): VNode {
const imgProp = {
src: this.logo_src,
alt: ''
}
const image = this.$createElement('img', { attrs: imgProp })
const avatar = this.$createElement(VAvatar, {
style: {
height: '35px',
width: '105px',
marginRight: '16px',
borderRadius: '0',
}
}, [image])
return avatar
},
genTitle(): VNode | null {
if(!this.title) return null
const h1 = this.$createElement('h1', {
staticClass: 'w-navigator-bar__title',
}, this.title)
const title = this.$createElement('div', [h1])
return title
},
getColor(key: string){
if(key == '') return ''
return this.colors[key as keyof typeof this.colors];
},
genPageName(): VNode | null {
let cName = ''
if(this.$el && this.$el.classList.length){
for(let i = 0; i < this.$el.classList.length; i++){
if(['error', 'success', 'warning'].indexOf(this.$el.classList[i]) !== -1){
cName = this.$el.classList[i]
}
}
}
if (!this.pageName || this.currentBarWidth < this.widthThreshold) return null
const pageName = this.$createElement(VChip, {
staticClass: 'w-navigator-bar__pageName',
style: {
color: this.getColor(cName),
}
}, this.pageName)
return pageName
},
genSpacer(): VNode {
return this.$createElement(VSpacer)
},
toggleMenu(x: number, y: number) {
this.listVisible = !this.listVisible;
},
genBtns(){
return getSlot(this, 'actions')
},
genList(){
const slotVm = getSlot(this, 'actions')
if(!slotVm || !slotVm.length) return null
const listItems = [] as any
for(let i = 0; i < slotVm.length; i++){
const vm = slotVm[i]
if(!vm.tag) continue
listItems.push(this.$createElement(VListItem,{
style: {
padding: '0px',
}
}, [vm]))
}
const icon = this.$createElement(VIcon,'mdi-dots-vertical')
const btn = this.$createElement(VBtn, {
props: {icon: true, color: "#ffffff", },
on: {
click: () => {
this.listVisible = !this.listVisible
this.list = this.$createElement(VList, {
style: {
marginTop: '120px',
},
props: {
color: '#757575',
},
}, listItems)
}
}
}, [icon]);
return this.list.hasOwnProperty('componentInstance') && this.listVisible? [btn, this.list] : [btn]
},
},
render(h): VNode {
const appbarProps = {
flat: true,
fixed: true,
}
const data = {
staticClass: 'w-navigator-bar',
...appbarProps,
ref: 'navigatorBar'
}
const children = [
this.genLogo(),
this.genTitle(),
this.genPageName(),
this.genSpacer(),
getSlot(this),
]
if(this.currentBarWidth > this.widthThreshold){
this.listVisible = false
children.push(this.genBtns())
}else{
const list = this.genList()
if(list && Array.isArray(list)){
children.push(...list)
}
}
return h(VAppBar, data, children)
},
})