fix: UI fixes related to feedback form beta-phase (#494)

* fix: truncated settings menu

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* refactor: change probe chips to label

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* refactor(timelapse): change button color and make responsive

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* refactor: change display helpers of some buttons

* fix(#390): encodeURI of thumbnails in files page

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* fix: responsivity of timelapse-page

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* refactor(timelapse): more responsiveness

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* refactor(timelapse): no frames found visibility

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* refactor: tooltip on disabled retract /extrude buttons

* refactor(editor): show "read-only" in title if file is not writable

* fix: visibility of reload button

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* refactor: select printer dialog new ui style

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* refactor: add attach prop to inputs w dropdowns

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* fix: paddings of panels on spec. viewports

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* refactor: hide spin buttons on number inputs

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* refactor:  hide-spin-buttons after merging timelapseTab

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* fix: add overlay-scrollbar to sidebar

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* fix: scrollbars in settingsmenu

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* feat: remember current path when leaving gcode-files-page

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* fix: remove comment in gcodefilespanel

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* feat: remember current path in timlapse files panel

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* feat: remember current path in config files panel

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* fix: console text colors and add css classes

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* fix: filepanel-path-persistance to new db layout

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* fix: settings tab scrollbars

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* fix: button logic in heigthmap

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* refactor: color  home button in heightmap

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* refactor: heightmap add color to small buttons

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* refactor: sidebar behavior on touch devices

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* fix: reapply tooltip patch after merge

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* fix: temp sidebar remove touch-condition

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* feat: add save-action for non persistant settings

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>

* fix: use new save action in setters

Signed-off-by: steadyjaw <martin.keilaus@gmail.com>
This commit is contained in:
steadyjaw 2022-01-01 22:55:01 +01:00 committed by GitHub
parent c1b344e94c
commit b6966f05ee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 187 additions and 74 deletions

View File

@ -3,7 +3,7 @@
<v-btn icon tile @click="showSettings = true">
<v-icon>mdi-cogs</v-icon>
</v-btn>
<v-dialog v-model="showSettings" width="900" persistent :fullscreen="isMobile" @keydown.esc="showSettings = false">
<v-dialog v-model="showSettings" width="900" persistent :fullscreen="isMobile" @keydown.esc="showSettings = false" scrollable>
<panel :title="$t('Settings.InterfaceSettings')" icon="mdi-cogs" card-class="settings-menu-dialog" :margin-bottom="false" style="overflow: hidden;" :height="isMobile ? 0 : 548">
<template v-slot:buttons>
<v-btn icon tile @click="showSettings = false"><v-icon>mdi-close-thick</v-icon></v-btn>
@ -187,18 +187,18 @@ export default class TheSettingsMenu extends Mixins(BaseMixin) {
<style scoped>
.settings-tabs {
height: auto;
min-height: 100%;
max-height: calc(var(--app-height) - 96px);
height: calc(var(--app-height) - 96px);
}
.settings-tabs-bar {
border-right: 1px solid rgba(255, 255, 255, 0.12);
height: 100%;
}
.settings-tabs-bar.height500,
.settings-tabs.height500 {
max-height: 500px;
height: 500px;
max-height: calc(var(--app-height) - 111px);
}
</style>

View File

@ -2,24 +2,33 @@
.nav-logo {
height: 32px;
}
.small-list-item {
height: var(--sidebar-menu-item-height);
}
.no-text-decoration {
text-decoration: none;
background-color: transparent;
}
.no-background:before {
background-color: rgba(255, 255, 255, 0) !important;
}
.no-border {
border: 0 !important;
}
</style>
<style scoped>
.active-nav-item {
border-right: 4px solid var(--v-primary-base);
}
.menu-item-icon {
opacity: .85;
}
.menu-item-title {
line-height: 30px;
font-size: 14px;
@ -27,56 +36,75 @@
text-transform: uppercase;
opacity: .85;
}
.nav-scrollbar {
height: 100%;
}
</style>
<template>
<v-navigation-drawer v-model="naviDrawer" :src="sidebarBackground" :mini-variant="(navigationStyle === 'iconsOnly')" :key="navigationStyle" :width="navigationWidth" clipped app>
<v-list class="pr-0 pt-0 ml-0">
<v-list-item-group active-class="active-nav-item">
<template v-if="countPrinters">
<v-tooltip right>
<template v-slot:activator="{ on, attrs }">
<v-list-item
router to="/allPrinters"
class="small-list-item mt-1"
v-bind="attrs"
v-on="on"
>
<v-list-item-icon class="my-3 mr-3 menu-item-icon">
<v-icon>mdi-view-dashboard-outline</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title tile class="menu-item-title">{{ $t("App.Printers") }}</v-list-item-title>
</v-list-item-content>
<v-navigation-drawer v-model="naviDrawer" :src="sidebarBackground" :mini-variant="(navigationStyle === 'iconsOnly')" :key="navigationStyle" :width="navigationWidth" :temporary="boolNaviTemp" :hide-overlay="!isMobile" clipped app :style="cssVars">
<overlay-scrollbars class="nav-scrollbar">
<v-list class="pr-0 pt-0 ml-0">
<v-list-item-group active-class="active-nav-item">
<v-list-item
router to="/"
class="d-flex d-sm-none sidebar-logo no-text-decoration no-background no-border"
:style="'height: ' + topbarHeight + 'px'"
:ripple="false"
>
<template v-if="sidebarLogo">
<img :src="sidebarLogo" style="height: 32px;" class="nav-logo mr-3" alt="Logo" />
</template>
<template v-else>
<mainsail-logo :color="logoColor" style="height: 32px;" class="nav-logo mr-4" :ripple="false"></mainsail-logo>
</template>
<span class="text-h6 font-weight-regular text-truncate"> {{ printerName }} </span>
</v-list-item>
<template v-if="countPrinters">
<v-tooltip right :open-delay="500" :disabled="navigationStyle !== 'iconsOnly'">
<template v-slot:activator="{ on, attrs }">
<v-list-item
router to="/allPrinters"
class="small-list-item mt-1"
v-bind="attrs"
v-on="on"
>
<v-list-item-icon class="my-3 mr-3 menu-item-icon">
<v-icon>mdi-view-dashboard-outline</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title tile class="menu-item-title">{{ $t("App.Printers") }}</v-list-item-title>
</v-list-item-content>
</v-list-item>
</template>
<span v-if="navigationStyle === 'iconsOnly'">{{ $t("App.Printers") }}</span>
</v-tooltip>
<v-divider class="my-1"></v-divider>
</template>
<div v-for="(category, index) in naviPoints" :key="index">
<v-tooltip right :open-delay="500" :disabled="navigationStyle !== 'iconsOnly'">
<template v-slot:activator="{ on, attrs }">
<v-list-item
router :to="category.path"
class="small-list-item"
v-bind="attrs"
v-on="on"
>
<v-list-item-icon class="my-3 mr-3 menu-item-icon">
<v-icon>mdi-{{ category.icon }}</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title tile class="menu-item-title">{{ $t(`Router.${category.title}`) }}</v-list-item-title>
</v-list-item-content>
</v-list-item>
</template>
<span>{{ $t(`Router.${category.title}`) }}</span>
</v-tooltip>
</div>
</v-list-item-group>
</v-list>
</v-list-item>
</template>
<span>{{ $t("App.Printers") }}</span>
</v-tooltip>
<v-divider class="my-1"></v-divider>
</template>
<div v-for="(category, index) in naviPoints" :key="index">
<v-tooltip right :open-delay="500" :disabled="navigationStyle !== 'iconsOnly'">
<template v-slot:activator="{ on, attrs }">
<v-list-item
router :to="category.path"
class="small-list-item"
v-bind="attrs"
v-on="on"
>
<v-list-item-icon class="my-3 mr-3 menu-item-icon">
<v-icon>mdi-{{ category.icon }}</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title tile class="menu-item-title">{{ $t(`Router.${category.title}`) }}</v-list-item-title>
</v-list-item-content>
</v-list-item>
</template>
<span>{{ $t(`Router.${category.title}`) }}</span>
</v-tooltip>
</div>
</v-list-item-group>
</v-list>
</overlay-scrollbars>
<template v-slot:append>
<v-list-item class="small-list-item mb-2">
<v-list-item-icon class="menu-item-icon">
@ -95,17 +123,20 @@ import BaseMixin from '@/components/mixins/base'
import {PrinterStateKlipperConfig} from '@/store/printer/types'
import TheSelectPrinterDialog from '@/components/TheSelectPrinterDialog.vue'
import AboutModal from '@/components/modals/AboutModal.vue'
import {navigationWidth} from '@/store/variables'
import {navigationWidth, topbarHeight} from '@/store/variables'
import MainsailLogo from '@/components/ui/MainsailLogo.vue'
@Component({
components: {
TheSelectPrinterDialog,
AboutModal
AboutModal,
MainsailLogo
}
})
export default class TheSidebar extends Mixins(BaseMixin) {
navigationWidth = navigationWidth
topbarHeight = topbarHeight
get naviDrawer(): boolean {
return this.$store.state.naviDrawer
@ -157,6 +188,39 @@ export default class TheSidebar extends Mixins(BaseMixin) {
return this.$store.getters['farm/countPrinters']
}
get boolNaviTemp(): boolean {
if(!this.isMobile && this.$vuetify.breakpoint.mdAndDown) {
return true
}
return false
}
get cssVars(): any {
if(this.boolNaviTemp){
return {
'top': `${topbarHeight}px !important`,
'padding-bottom': `${topbarHeight}px`
}
}
return {}
}
get sidebarLogo(): string {
return this.$store.getters['files/getSidebarLogo']
}
get logoColor(): string {
return this.$store.state.gui.uiSettings.logo
}
get printerName():string {
if (this.$store.state.gui.general.printername.length)
return this.$store.state.gui.general.printername
return this.$store.state.printer.hostname
}
showInNavi(route: AppRoute): boolean {
if (['shutdown', 'error', 'disconnected'].includes(this.klippy_state) && !route.alwaysShow) return false
else if (route.title === 'Webcam' && !this.boolNaviWebcam) return false

View File

@ -25,8 +25,8 @@
<template>
<v-row :class="'ma-0 '+entryStyle">
<v-col class="col-auto pr-0 text--secondary">{{ event.formatTime }}</v-col>
<v-col :class="colorConsoleMessage(event)" v-html="event.formatMessage" @click.capture="commandClick"></v-col>
<v-col class="col-auto pr-0 text--disabled console-time">{{ event.formatTime }}</v-col>
<v-col :class="colorConsoleMessage(event) + ' ' + 'console-message'" v-html="event.formatMessage" @click.capture="commandClick"></v-col>
</v-row>
</template>
@ -46,9 +46,9 @@ export default class ConsoleTableEntry extends Vue {
}
colorConsoleMessage(item: ServerStateEvent): string {
if (item.message.startsWith('!! ')) return 'red--text'
if (item.message.startsWith('!! ')) return 'error--text'
return 'white--text'
return 'text--primary'
}
commandClick(event: Event) {

View File

@ -470,7 +470,6 @@ export default class GcodefilesPanel extends Mixins(BaseMixin) {
private search = ''
private selected = []
private hideHeaderColums = []
private currentPath = 'gcodes'
private dropzone = {
visibility: 'hidden',
opacity: 0,
@ -563,6 +562,14 @@ export default class GcodefilesPanel extends Mixins(BaseMixin) {
(value: string) => value.indexOf(' ') === -1 || 'Name contains spaces!'
]
get currentPath() {
return this.$store.state.gui.view.gcodefiles.currentPath
}
set currentPath(newVal) {
this.$store.dispatch('gui/saveSettingWithoutUpload', { name: 'view.gcodefiles.currentPath', value: newVal })
}
get headers() {
const headers = [
{ text: '', value: '', align: 'left', configable: false, visible: true, filterable: false },

View File

@ -365,8 +365,6 @@ export default class ConfigFilesPanel extends Mixins(BaseMixin) {
private selected = []
private options = { }
private currentPage = 1
private currentPath = ''
private root = 'config'
private contextMenu: contextMenu = {
shown: false,
isDirectory: false,
@ -580,6 +578,22 @@ export default class ConfigFilesPanel extends Mixins(BaseMixin) {
return this.$store.state.server.registered_directories.filter((dir: string) => !hiddenRootDirectories.includes(dir)).sort()
}
get root() {
return this.$store.state.gui.view.configfiles.rootPath
}
set root(newVal) {
this.$store.dispatch('gui/saveSettingWithoutUpload', { name: 'view.configfiles.rootPath', value: newVal })
}
get currentPath() {
return this.$store.state.gui.view.configfiles.currentPath
}
set currentPath(newVal) {
this.$store.dispatch('gui/saveSettingWithoutUpload', { name: 'view.configfiles.currentPath', value: newVal })
}
refreshFileList() {
this.$socket.emit('server.files.get_directory', { path: this.absolutePath.substring(1) }, { action: 'files/getDirectory' })
}

View File

@ -39,7 +39,7 @@
<v-card-text>
<v-row>
<v-col class="col-12 py-2 d-flex align-center">
<span><b>{{ $t('Timelapse.CurrentPath') }}:</b> {{ this.currentPath !== 'timelapse' ? "/"+this.currentPath.substring(7) : "/" }}</span>
<span><b>{{ $t('Timelapse.CurrentPath') }}:</b> {{ this.currentPath !== 'timelapse' ? "/"+this.currentPath.substring(10) : "/" }}</span>
<v-spacer></v-spacer>
<template v-if="this.disk_usage !== null">
<v-tooltip top>
@ -284,7 +284,6 @@ export default class TimelapseFilesPanel extends Mixins(BaseMixin) {
}
private search = ''
private currentPath = 'timelapse'
private boolVideoDialog = false
private videoDialogFilename = ''
@ -405,6 +404,14 @@ export default class TimelapseFilesPanel extends Mixins(BaseMixin) {
}) ?? []
}
get currentPath() {
return this.$store.state.gui.view.timelapse.currentPath
}
set currentPath(newVal) {
this.$store.dispatch('gui/saveSettingWithoutUpload', { name: 'view.timelapse.currentPath', value: newVal })
}
createDirectory() {
this.dialogCreateDirectory.name = ''
this.dialogCreateDirectory.show = true

View File

@ -8,23 +8,23 @@
<v-col class="col-12 col-md-8 pb-0">
<panel card-class="heightmap-map-panel" :title="$t('Heightmap.Heightmap')" icon="mdi-grid">
<template v-slot:buttons-title>
<v-btn text tile color="primary" class="ml-1 d-none d-sm-inline-flex" v-if="bed_mesh" @click="openRenameProfile()">{{ bed_mesh ? bed_mesh.profile_name : "" }}</v-btn>
<v-btn text tile color="primary" class="ml-1 d-none d-sm-inline-flex" v-if="meshLoaded" @click="openRenameProfile()">{{ bed_mesh.profile_name }}</v-btn>
</template>
<template v-slot:buttons>
<v-btn text tile color="primary" class=" d-sm-none" @click="openRenameProfile()">{{ bed_mesh ? bed_mesh.profile_name : "" }}</v-btn>
<v-btn icon tile class="d-none d-sm-flex" @click="homePrinter" :loading="loadings.includes('homeAll')" :title="$t('Heightmap.TitleHomeAll')" :ripple="true"><v-icon>mdi-home</v-icon></v-btn>
<v-btn text tile class="d-none d-sm-flex" @click="clearBedMesh" :loading="loadings.includes('bedMeshClear')" v-if="bed_mesh" :title="$t('Heightmap.TitleClear')">{{ $t('Heightmap.Clear') }}</v-btn>
<v-btn text tile color="primary" class="d-sm-none" v-if="meshLoaded" @click="openRenameProfile()">{{ bed_mesh ? bed_mesh.profile_name : "" }}</v-btn>
<v-btn icon tile class="d-none d-sm-flex" @click="homePrinter" :color="homedAxes.includes('xyz') ? 'primary' : 'warning'" :loading="loadings.includes('homeAll')" :title="$t('Heightmap.TitleHomeAll')" :ripple="true"><v-icon>mdi-home</v-icon></v-btn>
<v-btn text tile class="d-none d-sm-flex" @click="clearBedMesh" :loading="loadings.includes('bedMeshClear')" v-if="meshLoaded" :title="$t('Heightmap.TitleClear')">{{ $t('Heightmap.Clear') }}</v-btn>
<v-btn text tile class="d-none d-sm-flex" @click="calibrateDialog = true" :loading="loadings.includes('bedMeshCalibrate')" :disabled="printerIsPrinting" :title="$t('Heightmap.TitleCalibrate')">{{ $t('Heightmap.Calibrate') }}</v-btn>
</template>
<v-card-text class="d-sm-none text-center pb-0">
<v-item-group tile class="v-btn-toggle" name="controllers">
<v-btn text small class="px-2 minwidth-0" color="primary" @click="homePrinter" :loading="loadings.includes('homeAll')" :title="$t('Heightmap.TitleHomeAll')"><v-icon small>mdi-home</v-icon></v-btn>
<v-btn text small class="px-2 minwidth-0" :color="homedAxes.includes('xyz') ? 'primary' : 'warning'" @click="homePrinter" :loading="loadings.includes('homeAll')" :title="$t('Heightmap.TitleHomeAll')"><v-icon :color="homedAxes.includes('xyz') ? 'primary' : 'warning'" small>mdi-home</v-icon></v-btn>
<v-btn text small class="px-2 minwidth-0" color="primary" @click="clearBedMesh" :loading="loadings.includes('bedMeshClear')" v-if="bed_mesh" :title="$t('Heightmap.TitleClear')">{{ $t('Heightmap.Clear') }}</v-btn>
<v-btn text small class="px-2 minwidth-0" color="primary" @click="calibrateDialog = true" :loading="loadings.includes('bedMeshCalibrate')" :disabled="printerIsPrinting" :title="$t('Heightmap.TitleCalibrate')">{{ $t('Heightmap.Calibrate') }}</v-btn>
</v-item-group>
</v-card-text>
<template v-if="!(bed_mesh)">
<v-card-text>
<template v-if="!(meshLoaded)">
<v-card-text class="text-center py-3 font-italic">
{{ $t('Heightmap.NoBedMeshHasBeenLoadedYet') }}
</v-card-text>
</template>
@ -66,7 +66,7 @@
</panel>
</v-col>
<v-col class="col-12 col-md-4">
<panel :title="$t('Heightmap.CurrentMesh.Headline')" v-if="bed_mesh !== null && bed_mesh.profile_name !== ''" card-class="heightmap-current-mesh-panel" icon="mdi-information" :collapsible="true" class="mt-0">
<panel :title="$t('Heightmap.CurrentMesh.Headline')" v-if="meshLoaded" card-class="heightmap-current-mesh-panel" icon="mdi-information" :collapsible="true" class="mt-0">
<v-card-text class="py-3 px-0">
<v-row class="px-3">
<v-col>{{ $t('Heightmap.CurrentMesh.Name') }}</v-col>
@ -184,6 +184,7 @@
<script lang="ts">
import {Component, Mixins, Watch} from 'vue-property-decorator'
import BaseMixin from '@/components/mixins/base'
import ControlMixin from '@/components/mixins/control'
import { createComponent } from 'echarts-for-vue'
import * as echarts from 'echarts'
@ -211,7 +212,7 @@ interface HeightmapSerie {
ECharts: createComponent({ echarts }),
}
})
export default class PageHeightmap extends Mixins(BaseMixin) {
export default class PageHeightmap extends Mixins(BaseMixin, ControlMixin) {
$refs!: {
// eslint-disable-next-line
@ -726,6 +727,14 @@ export default class PageHeightmap extends Mixins(BaseMixin) {
}
}
get meshLoaded() {
if(this.bed_mesh !== null) {
return this.bed_mesh.profile_name !== ''
} else {
return false
}
}
tooltipFormatter(data: any): string {
const outputArray: string[] = []
outputArray.push('<b>'+data.seriesName+'</b>')

View File

@ -117,6 +117,10 @@ export const actions: ActionTree<GuiState, RootState> = {
Vue.$socket.emit('server.database.post_item', { namespace: 'mainsail', key: payload.name, value: payload.value })
},
saveSettingWithoutUpload({ commit }, payload) {
commit('saveSetting', payload)
},
updateSettings(_, payload) {
const keyName = payload.keyName
let newState = payload.newVal

View File

@ -143,7 +143,9 @@ export const getDefaultState = (): GuiState => {
sortBy: 'filename',
sortDesc: false,
showHiddenFiles: false,
hideBackupFiles: false
hideBackupFiles: false,
currentPath: '',
rootPath: 'config'
},
gcodefiles: {
countPerPage: 10,
@ -151,7 +153,8 @@ export const getDefaultState = (): GuiState => {
sortDesc: true,
showHiddenFiles: false,
showPrintedFiles: true,
hideMetadataColums: []
hideMetadataColums: [],
currentPath: 'gcodes'
},
heightmap: {
probed: true,
@ -193,6 +196,7 @@ export const getDefaultState = (): GuiState => {
sortBy: 'modified',
sortDesc: true,
showHiddenFiles: false,
currentPath: 'timelapse'
},
webcam: {
currentCam: {

View File

@ -93,6 +93,8 @@ export interface GuiState {
sortDesc: boolean
showHiddenFiles: boolean
hideBackupFiles: boolean
currentPath: string
rootPath: string
}
gcodefiles: {
countPerPage: number
@ -101,6 +103,7 @@ export interface GuiState {
showHiddenFiles: boolean
showPrintedFiles: boolean
hideMetadataColums: string[]
currentPath: string
}
heightmap: {
probed: boolean
@ -131,6 +134,7 @@ export interface GuiState {
sortBy: string
sortDesc: boolean
showHiddenFiles: boolean
currentPath: string
}
webcam: {
currentCam: {