diff --git a/package-lock.json b/package-lock.json index d5620725..c635143b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,6 +42,7 @@ "vue-meta": "^2.4.0", "vue-observe-visibility": "^1.0.0", "vue-property-decorator": "^9.1.2", + "vue-resize": "^1.0.1", "vue-toast-notification": "^0.6.1", "vuedraggable": "^2.24.3", "vuetify": "^2.6.1", @@ -1810,7 +1811,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.7.tgz", "integrity": "sha512-L6rvG9GDxaLgFjg41K+5Yv9OMrU98sWe+Ykmc6FDJW/+vYZMhdOMKkISgzptMaERHvS2Y2lw9MDRm2gHhlQQoA==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -8974,6 +8974,17 @@ "vue-class-component": "*" } }, + "node_modules/vue-resize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-1.0.1.tgz", + "integrity": "sha512-z5M7lJs0QluJnaoMFTIeGx6dIkYxOwHThlZDeQnWZBizKblb99GSejPnK37ZbNE/rVwDcYcHY+Io+AxdpY952w==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "vue": "^2.6.0" + } + }, "node_modules/vue-router": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.3.tgz", @@ -10636,7 +10647,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.7.tgz", "integrity": "sha512-L6rvG9GDxaLgFjg41K+5Yv9OMrU98sWe+Ykmc6FDJW/+vYZMhdOMKkISgzptMaERHvS2Y2lw9MDRm2gHhlQQoA==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } @@ -15912,6 +15922,14 @@ "integrity": "sha512-xYA8MkZynPBGd/w5QFJ2d/NM0z/YeegMqYTphy7NJQXbZcuU6FC6AOdUAcy4SXP+YnkerC6AfH+ldg7PDk9ESQ==", "requires": {} }, + "vue-resize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-1.0.1.tgz", + "integrity": "sha512-z5M7lJs0QluJnaoMFTIeGx6dIkYxOwHThlZDeQnWZBizKblb99GSejPnK37ZbNE/rVwDcYcHY+Io+AxdpY952w==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, "vue-router": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.3.tgz", diff --git a/package.json b/package.json index 67490ff7..bb8bb2d9 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "vue-meta": "^2.4.0", "vue-observe-visibility": "^1.0.0", "vue-property-decorator": "^9.1.2", + "vue-resize": "^1.0.1", "vue-toast-notification": "^0.6.1", "vuedraggable": "^2.24.3", "vuetify": "^2.6.1", diff --git a/src/components/charts/HistoryAllPrintStatus.vue b/src/components/charts/HistoryAllPrintStatus.vue index d2e396f0..30afc6a0 100644 --- a/src/components/charts/HistoryAllPrintStatus.vue +++ b/src/components/charts/HistoryAllPrintStatus.vue @@ -3,6 +3,7 @@ ref="historyAllPrintStatus" v-observe-visibility="visibilityChanged" :option="chartOptions" + :autoresize="true" :init-options="{ renderer: 'svg' }" style="height: 250px; width: 100%"> @@ -85,12 +86,6 @@ export default class HistoryAllPrintStatus extends Mixins(BaseMixin) { mounted() { this.chartOptions.series[0].data = this.printStatusArray this.chart?.setOption(this.chartOptions) - - window.addEventListener('resize', this.eventListenerResize) - } - - destroyed() { - window.removeEventListener('resize', this.eventListenerResize) } beforeDestroy() { @@ -114,9 +109,5 @@ export default class HistoryAllPrintStatus extends Mixins(BaseMixin) { visibilityChanged(isVisible: boolean) { if (isVisible) this.chart?.resize() } - - eventListenerResize() { - this.chart?.resize() - } } diff --git a/src/components/charts/HistoryFilamentUsage.vue b/src/components/charts/HistoryFilamentUsage.vue index 5b7b0c38..46f2023a 100644 --- a/src/components/charts/HistoryFilamentUsage.vue +++ b/src/components/charts/HistoryFilamentUsage.vue @@ -3,6 +3,7 @@ ref="historyFilamentUsage" v-observe-visibility="visibilityChanged" :option="chartOptions" + :autoresize="true" :init-options="{ renderer: 'svg' }" style="height: 175px; width: 100%"> @@ -115,12 +116,6 @@ export default class HistoryPrinttimeAvg extends Mixins(BaseMixin) { mounted() { this.chartOptions.series[0].data = this.filamentUsageArray this.chart?.setOption(this.chartOptions) - - window.addEventListener('resize', this.eventListenerResize) - } - - destroyed() { - window.removeEventListener('resize', this.eventListenerResize) } beforeDestroy() { @@ -144,9 +139,5 @@ export default class HistoryPrinttimeAvg extends Mixins(BaseMixin) { visibilityChanged(isVisible: boolean) { if (isVisible) this.chart?.resize() } - - eventListenerResize() { - this.chart?.resize() - } } diff --git a/src/components/charts/HistoryPrinttimeAvg.vue b/src/components/charts/HistoryPrinttimeAvg.vue index 776e54c5..591cdf2f 100644 --- a/src/components/charts/HistoryPrinttimeAvg.vue +++ b/src/components/charts/HistoryPrinttimeAvg.vue @@ -101,12 +101,6 @@ export default class HistoryPrinttimeAvg extends Mixins(BaseMixin) { mounted() { this.chartOptions.series[0].data = this.printtimeAvgArray this.chart?.setOption(this.chartOptions) - - window.addEventListener('resize', this.eventListenerResize) - } - - destroyed() { - window.removeEventListener('resize', this.eventListenerResize) } beforeDestroy() { @@ -130,9 +124,5 @@ export default class HistoryPrinttimeAvg extends Mixins(BaseMixin) { visibilityChanged(isVisible: boolean) { if (isVisible) this.chart?.resize() } - - eventListenerResize() { - this.chart?.resize() - } } diff --git a/src/components/charts/TempChart.vue b/src/components/charts/TempChart.vue index 1761875d..4edd127e 100644 --- a/src/components/charts/TempChart.vue +++ b/src/components/charts/TempChart.vue @@ -4,6 +4,7 @@ v-observe-visibility="visibilityChanged" :option="chartOptions" :init-options="{ renderer: 'svg' }" + :autoresize="true" style="height: 250px; width: 100%"> @@ -228,19 +229,11 @@ export default class TempChart extends Mixins(BaseMixin) { mounted() { this.initChart() - - window.addEventListener('resize', this.eventListenerResize) } beforeDestroy() { if (typeof window === 'undefined') return if (this.chart) this.chart.dispose() - - window.removeEventListener('resize', this.eventListenerResize) - } - - eventListenerResize() { - this.chart?.resize() } initChart() { diff --git a/src/components/gcodeviewer/Viewer.vue b/src/components/gcodeviewer/Viewer.vue index 0e19ba05..607af687 100644 --- a/src/components/gcodeviewer/Viewer.vue +++ b/src/components/gcodeviewer/Viewer.vue @@ -53,6 +53,10 @@ .disable-transition { transition: none !important; } + +.gcode-viewer-panel { + position: relative; +} @@ -157,6 +128,7 @@ import MjpegstreamerAdaptive from '@/components/webcams/MjpegstreamerAdaptive.vu import MainsailLogo from '@/components/ui/MainsailLogo.vue' import Panel from '@/components/ui/Panel.vue' import { mdiPrinter3d, mdiWebcam, mdiMenuDown, mdiWebcamOff, mdiFileOutline } from '@mdi/js' +import { Debounce } from 'vue-debounce-decorator' @Component({ components: { @@ -255,18 +227,59 @@ export default class FarmPrinterPanel extends Mixins(BaseMixin) { } mounted() { - window.addEventListener('resize', this.resize) - this.resize() + this.calcImageHeight() } - beforeDestroy() { - window.removeEventListener('resize', this.resize) - } - - resize() { + calcImageHeight() { if (this.imageDiv?.$el?.clientWidth) { this.imageHeight = Math.round((this.imageDiv.$el.clientWidth / 3) * 2) - } else this.imageHeight = 200 + return + } + + this.imageHeight = 200 + } + + @Debounce(200) + handleResize() { + this.$nextTick(() => { + this.calcImageHeight() + }) } } + + + + diff --git a/src/components/panels/JobqueuePanel.vue b/src/components/panels/JobqueuePanel.vue index 015a5ade..09c1cd14 100644 --- a/src/components/panels/JobqueuePanel.vue +++ b/src/components/panels/JobqueuePanel.vue @@ -99,6 +99,7 @@ + @@ -219,16 +220,23 @@ export default class JobqueuePanel extends Mixins(BaseMixin) { } mounted() { - window.addEventListener('resize', this.eventListenerResize) - this.eventListenerResize() + this.calcContentTdWidth() } - destroyed() { - window.removeEventListener('resize', this.eventListenerResize) - } - - eventListenerResize() { + calcContentTdWidth() { this.contentTdWidth = this.$refs.jobqueuePanel?.$el?.clientWidth - 48 - 32 } + + handleResize() { + this.$nextTick(() => { + this.calcContentTdWidth() + }) + } } + + diff --git a/src/components/panels/Status/Gcodefiles.vue b/src/components/panels/Status/Gcodefiles.vue index 162aee82..1c5c220e 100644 --- a/src/components/panels/Status/Gcodefiles.vue +++ b/src/components/panels/Status/Gcodefiles.vue @@ -1,7 +1,5 @@ - - + { + this.calcContentTdWidth() + }) + } } + + diff --git a/src/components/panels/Status/Jobqueue.vue b/src/components/panels/Status/Jobqueue.vue index 34255d82..814f5287 100644 --- a/src/components/panels/Status/Jobqueue.vue +++ b/src/components/panels/Status/Jobqueue.vue @@ -1,7 +1,5 @@ - - + @@ -255,16 +254,23 @@ export default class StatusPanelJobqueue extends Mixins(BaseMixin) { } mounted() { - window.addEventListener('resize', this.eventListenerResize) - this.eventListenerResize() + this.calcContentTdWidth() } - destroyed() { - window.removeEventListener('resize', this.eventListenerResize) - } - - eventListenerResize() { + calcContentTdWidth() { this.contentTdWidth = this.$refs.filesJobqueue?.$el?.clientWidth - 48 - 48 - 32 } + + handleResize() { + this.$nextTick(() => { + this.calcContentTdWidth() + }) + } } + + diff --git a/src/components/panels/Status/PrintstatusThumbnail.vue b/src/components/panels/Status/PrintstatusThumbnail.vue index b5dbbf56..28a82992 100644 --- a/src/components/panels/Status/PrintstatusThumbnail.vue +++ b/src/components/panels/Status/PrintstatusThumbnail.vue @@ -1,11 +1,5 @@ - - + @@ -84,6 +79,7 @@ import { Mixins } from 'vue-property-decorator' import BaseMixin from '@/components/mixins/base' import { thumbnailBigMin, thumbnailSmallMax, thumbnailSmallMin } from '@/store/variables' import { mdiFileOutline, mdiFile } from '@mdi/js' +import { Debounce } from 'vue-debounce-decorator' @Component({ components: {}, @@ -198,17 +194,22 @@ export default class StatusPanelPrintstatusThumbnail extends Mixins(BaseMixin) { } } - created() { - window.addEventListener('resize', this.onResize) - } - - destroyed() { - window.removeEventListener('resize', this.onResize) - } - - onResize() { - const isFocused = document.activeElement === this.$refs.bigThumbnail?.$el - if (isFocused) this.focusBigThumbnail() + @Debounce(200) + handleResize() { + this.$nextTick(() => { + const isFocused = document.activeElement === this.$refs.bigThumbnail?.$el + if (isFocused) this.focusBigThumbnail() + }) } } + + diff --git a/src/main.ts b/src/main.ts index f04283ef..20daf724 100644 --- a/src/main.ts +++ b/src/main.ts @@ -67,6 +67,12 @@ import { GridComponent, LegendComponent, TooltipComponent, DatasetComponent } fr use([SVGRenderer, LineChart, BarChart, LegendComponent, PieChart, DatasetComponent, GridComponent, TooltipComponent]) Vue.component('EChart', ECharts) +// vue-resize +import 'vue-resize/dist/vue-resize.css' +// @ts-ignore +import VueResize from 'vue-resize' +Vue.use(VueResize) + //load config.json and init vue fetch('/config.json') .then((res) => res.json())