<template> <v-card class="mx-auto" variant="outlined" max-height="500"> <v-card-title class="text-h5 font-weight-regular align-center"> <span>{{ currentTitle }}</span> </v-card-title> <v-window v-model="location" show-arrows="hover"> <v-window-item :value="1"> <v-card-text> <v-container fluid> <v-row> <v-col> <v-card-text>Title Size: {{ titleSize }}px</v-card-text> <v-slider v-model="titleSize" :min="25" :max="35" step="1" ></v-slider> </v-col> <v-col> <v-card-text>Content Size</v-card-text> <v-radio-group v-model="contentSize" column> <v-radio label="text-h4" value="text-h4"></v-radio> <v-radio label="text-h5" value="text-h5"></v-radio> <v-radio label="text-h6" value="text-h6"></v-radio> </v-radio-group> </v-col> </v-row> </v-container> </v-card-text> </v-window-item> <v-window-item :value="2"> <v-card-text> <v-text-field label="Background Image URL" prepend-icon="mdi-image" variant="outlined" shaped v-model="backgroundImageURL" ></v-text-field> </v-card-text> <v-card-actions class="d-flex justify-space-around"> <v-btn variant="outlined" @click="saveBackgroundImageURL">Save</v-btn> <v-btn variant="outlined" @click="resetBackgroundImageURL" >Reset</v-btn > </v-card-actions> </v-window-item> <v-window-item :value="3"> <v-textarea height="300" no-resize readonly :value="debugLog"> </v-textarea> <v-card-actions class="d-flex justify-space-around"> <v-btn variant="outlined" @click="showLSDebug" >Show LocalStorage Content</v-btn > <v-btn variant="outlined" @click="clearLS">Clear LocalStorage</v-btn> <v-btn variant="outlined" @click="debugLog = ''">Clear Output</v-btn> </v-card-actions> </v-window-item> <v-window-item :value="4"> <v-card-text> <span class="text-h6" >Otonashi is a simple, easy-to-use classboard app, built by 135e2 with Vue 3, Vuetify and ❤️.<br /><br />This project is libre, and licensed under WTFPLv2, as published by San Hocevar on December 2004. See the COPYING file for more details.</span > </v-card-text> </v-window-item> </v-window> </v-card> </template> <script> export default { name: "SettingsPage", props: ["realTitleSize", "realContentSize"], emits: ["updateTitleSize", "updateContentSize", "updateBackgroundImageURL"], computed: { currentTitle() { switch (this.location) { case 1: return "MainPage Settings"; case 2: return "Background Settings"; case 3: return "Developer Settings"; default: return "About Otonashi"; } }, }, watch: { // eslint-disable-next-line no-unused-vars titleSize(s, _) { this.$emit("updateTitleSize", s); }, // eslint-disable-next-line no-unused-vars contentSize(s, _) { this.$emit("updateContentSize", s); }, }, mounted() { this.loadFromLS(); // Sync titleSize with realTitleSize this.titleSize = this.realTitleSize; // Same this.contentSize = this.realContentSize; }, data: () => ({ backgroundImageURL: "", titleSize: 35, contentSize: "text-h5", debugLog: "", location: 1, }), methods: { // LocalStorage loadFromLS() { this.backgroundImageURL = JSON.parse(localStorage.getItem("backgroundImageURL")) || this.backgroundImageURL; }, writeToLS() { localStorage.setItem( "backgroundImageURL", JSON.stringify(this.backgroundImageURL) ); }, clearLS() { localStorage.clear(); this.debugLog += "LocalStorage cleared.\n"; }, showLSDebug() { this.debugLog += `LS in JSON format: ${JSON.stringify(localStorage)}\n`; }, saveBackgroundImageURL() { this.$emit("updateBackgroundImageURL", this.backgroundImageURL); this.writeToLS(); }, resetBackgroundImageURL() { // Reset URL and emit event. this.backgroundImageURL = ""; this.saveBackgroundImageURL(); }, }, }; </script>