blob: 6d749cb44326511b081f35fabb3e966862d4db66 [file] [log] [blame]
<template>
<q-layout view="lHh LpR lFf">
<q-header class="transparent">
<ZCLToolbar />
</q-header>
<q-drawer
v-if="!showPreviewTab && !showNotificationTab"
class="bg-glass"
v-model="leftDrawerOpen"
show-if-above
:width="300"
:breakpoint="500"
style="border-right: 1px solid #ddd"
>
<div
class="full-width absolute-top text-h4 q-pt-md q-px-md row q-electron-drag"
:class="{
'justify-end': isElectron && isMac
}"
style="height: 53.8px"
>
<div>ZCL</div>
</div>
<q-scroll-area style="height: calc(100% - 53.8px); margin-top: 53.8px">
<router-view v-slot="{ Component }" name="sidebar">
<transition mode="out-in" name="slide-left">
<component :is="Component" />
</transition>
</router-view>
</q-scroll-area>
</q-drawer>
<q-drawer
:width="$q.screen.width * 0.4"
bordered
v-model="showPreviewTab"
side="right"
:breakpoint="0"
class="bg-glass column"
>
<!-- <div
v-on:click.ctrl="showVersion"
v-if="showPreviewTab && this.endpointId[this.selectedEndpointId]"
>
<q-select
class="q-mx-sm q-mt-sm"
filled
:options="endpoints"
:model-value="selectedEndpointId"
label="Endpoint"
emit-value
map-options
@update:model-value="setSelectedEndpoint($event)"
/>
</div> -->
<q-btn-dropdown
no-caps
color="primary"
:label="generationButtonText"
dropdown-icon="change_history"
class="q-ma-sm"
data-test="select-file-in-preview"
>
<q-list>
<q-item
v-for="(file, i) in generationFiles"
:key="i"
clickable
v-close-popup
@click="
() => {
generationButtonText = file.category
getGeneratedFile(file.category)
}
"
:label="generationButtonText"
>
<q-item-section>
<q-item-label>{{ file.category }}</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-btn-dropdown>
<div class="col column q-mx-sm">
<q-scroll-area class="fit" ref="generationScroll">
<pre class="q-ma-sm">{{ generationData }}</pre>
<q-scroll-observer @scroll="onScroll" />
</q-scroll-area>
</div>
</q-drawer>
<q-drawer
:width="$q.screen.width * 0.4"
bordered
v-model="showNotificationTab"
side="right"
:breakpoint="0"
class="bg-glass column"
id="NotificationPanel"
>
<NotificationPage />
</q-drawer>
<q-page-container>
<router-view v-slot="{ Component }">
<transition mode="out-in" name="slide-down">
<component :is="Component" />
</transition>
</router-view>
</q-page-container>
</q-layout>
</template>
<script>
import ZCLToolbar from '../components/ZCLToolbar.vue'
import NotificationPage from '../pages/NotificationsPage.vue'
import { isElectron, isMac } from '../util/platform'
const restApi = require(`../../src-shared/rest-api.js`)
export default {
components: {
ZCLToolbar,
NotificationPage
},
name: 'MainLayout',
data() {
return {
isElectron,
isMac,
drawerRight: false,
generationFiles: '',
generationData: 'Generated Data',
generationButtonText: 'Select File',
currentFile: '',
scrollInfo: {},
scrollHeight: '',
clientHeight: '',
scrollTop: '',
index: 0,
maxIndex: 0,
generationDirectory: ''
}
},
computed: {
showPreviewTab: {
get() {
return this.$store.state.zap.showPreviewTab
},
set() {
return this.$store.dispatch('zap/togglePreviewTab')
}
},
showNotificationTab: {
get() {
return this.$store.state.zap.showNotificationTab
},
set() {
return this.$store.dispatch('zap/showNotificationTab')
}
},
leftDrawerOpen: {
get() {
return this.$store.state.zap.leftDrawerOpenState
},
set(newLeftDrawerOpenState) {
this.$store.dispatch('zap/setLeftDrawerState', newLeftDrawerOpenState)
}
}
},
created() {
if (this.$serverGet != null) {
this.getGeneratedFiles()
}
},
methods: {
getGeneratedFiles() {
this.$serverGet(restApi.uri.preview).then((result) => {
this.generationFiles = result.data
})
},
getGeneratedFile(fileName, index = 1) {
this.$serverGet(restApi.uri.preview + fileName + '/' + index)
.then((result) => {
this.generationData = result.data['result']
this.maxIndex = result.data['size']
this.index = index
this.currentFile = fileName
this.$refs.generationScroll.setScrollPosition('vertical', 0)
})
.catch((err) => console.log('Server Get:' + err))
},
onScroll(info) {
this.scrollInfo = info
const scrollArea = this.$refs.generationScroll
const scrollTarget = scrollArea.getScrollTarget()
this.scrollHeight = scrollTarget.scrollHeight
this.clientHeight = scrollTarget.clientHeight
this.scrollTop = scrollTarget.scrollTop
if (
this.scrollInfo.direction === 'down' &&
this.scrollHeight - this.scrollTop === this.clientHeight &&
this.maxIndex > this.index
) {
this.index = this.index + 1
let filePreview =
restApi.uri.preview + this.currentFile + '/' + this.index
this.$serverGet(filePreview)
.then((result) => {
this.generationData = this.generationData + result.data['result']
})
.catch((err) => console.log('Server Get:' + err))
}
}
}
}
</script>
<style lang="scss">
.slide-left-leave-active,
.slide-left-enter-active {
transition: all 0.25s ease-out;
}
.slide-left-enter-from {
opacity: 0;
transform: translateX(-100px);
}
.slide-left-leave-to {
opacity: 0;
transform: translateX(-100px);
}
.slide-down-leave-active,
.slide-down-enter-active {
transition: all 0.25s ease-out;
}
.slide-down-enter-from {
opacity: 0;
transform: translateY(-35px);
}
.slide-down-leave-to {
opacity: 0;
transform: translateY(35px);
}
.slide-left-leave-active,
.slide-left-enter-active {
transition: all 0.25s ease-out;
}
.slide-left-enter-from {
opacity: 0;
transform: translateX(-100px);
}
.slide-left-leave-to {
opacity: 0;
transform: translateX(-100px);
}
.slide-down-leave-active,
.slide-down-enter-active {
transition: all 0.5s ease-out;
}
.slide-down-enter-from {
opacity: 0;
transform: translateY(-75px);
}
.slide-down-leave-to {
opacity: 0;
transform: translateY(35px);
}
</style>