From 30a6db4c2dee2f902fea3c5b8522c0efe8cf230b Mon Sep 17 00:00:00 2001 From: negue Date: Sat, 10 Dec 2022 19:54:21 +0100 Subject: [PATCH] hide & reset previous setting when switching to a different one --- .../settings/components/inlineSettingMixin.js | 33 ++++++++++++++++-- .../inlineSettings/dateFormatSetting.vue | 10 +++++- .../inlineSettings/displayNameSetting.vue | 34 +++++++++++-------- .../inlineSettings/languageSetting.vue | 11 +++++- .../inlineSettings/userEmailSetting.vue | 9 ++++- .../inlineSettings/userNameSetting.vue | 18 ++++++++-- 6 files changed, 92 insertions(+), 23 deletions(-) diff --git a/website/client/src/pages/settings/components/inlineSettingMixin.js b/website/client/src/pages/settings/components/inlineSettingMixin.js index 9864c115a2..cb62aaab62 100644 --- a/website/client/src/pages/settings/components/inlineSettingMixin.js +++ b/website/client/src/pages/settings/components/inlineSettingMixin.js @@ -2,10 +2,17 @@ import { reactive } from 'vue'; export const sharedInlineSettingStore = reactive({ inlineSettingAlreadyOpen: false, - markAsOpened () { + inlineSettingUnsavedValues: false, + /** + * @type InlineSettingMixin + */ + instanceOfCurrentlyOpened: null, + markAsOpened (currentInstance) { this.inlineSettingAlreadyOpen = true; + this.instanceOfCurrentlyOpened = currentInstance; }, markAsClosed () { + this.inlineSettingUnsavedValues = false; this.inlineSettingAlreadyOpen = false; }, }); @@ -20,15 +27,35 @@ export const InlineSettingMixin = { methods: { openModal () { if (this.sharedState.inlineSettingAlreadyOpen) { - return; + if (this.sharedState.inlineSettingUnsavedValues) { + if (window.confirm('Are you sure? You will lose your unsaved changes.')) { + this._hidePrevious(); + this._openIt(); + } else { + return; + } + } else { + this._hidePrevious(); + } } - this.sharedState.markAsOpened(); + this._openIt(); + }, + _openIt () { + this.sharedState.markAsOpened(this); this.modalVisible = true; }, + _hidePrevious () { + this.sharedState.instanceOfCurrentlyOpened.resetControls(); + this.sharedState.instanceOfCurrentlyOpened.closeModal(); + }, closeModal () { this.modalVisible = false; this.sharedState.markAsClosed(); }, + modalValuesChanged () { + this.sharedState.inlineSettingUnsavedValues = true; + }, + resetControls () {}, }, }; diff --git a/website/client/src/pages/settings/inlineSettings/dateFormatSetting.vue b/website/client/src/pages/settings/inlineSettings/dateFormatSetting.vue index f3e11612f9..7cbfc3606d 100644 --- a/website/client/src/pages/settings/inlineSettings/dateFormatSetting.vue +++ b/website/client/src/pages/settings/inlineSettings/dateFormatSetting.vue @@ -97,17 +97,25 @@ export default { }, }, mounted () { - this.selectedFormat = this.currentActiveFormat; + this.resetControls(); }, methods: { changeFormat (e) { this.selectedFormat = e; + this.modalValuesChanged(); }, async changeFormatAndClose () { this.user.preferences.dateFormat = this.selectedFormat; await this.set('dateFormat'); this.closeModal(); }, + /** + * is a callback from the {InlineSettingMixin} + * do not remove + */ + resetControls () { + this.selectedFormat = this.currentActiveFormat; + }, }, }; diff --git a/website/client/src/pages/settings/inlineSettings/displayNameSetting.vue b/website/client/src/pages/settings/inlineSettings/displayNameSetting.vue index 13e347cd9d..5dc714e2b4 100644 --- a/website/client/src/pages/settings/inlineSettings/displayNameSetting.vue +++ b/website/client/src/pages/settings/inlineSettings/displayNameSetting.vue @@ -53,7 +53,7 @@ type="text" :placeholder="$t('newDisplayName')" :class="{'is-invalid input-invalid': displayNameInvalid}" - @keyup="inputChanged = true" + @keyup="valuesChanged()" >
{ - if (res.issues !== undefined) { - this.displayNameIssues = res.issues; - } else { - this.displayNameIssues = []; - } }); + + if (res.issues !== undefined) { + this.displayNameIssues = res.issues; + } else { + this.displayNameIssues = []; + } }, 500), + valuesChanged () { + this.inputChanged = true; + this.modalValuesChanged(); + }, }, }; diff --git a/website/client/src/pages/settings/inlineSettings/languageSetting.vue b/website/client/src/pages/settings/inlineSettings/languageSetting.vue index 8a4cf41aa2..a54bc549b0 100644 --- a/website/client/src/pages/settings/inlineSettings/languageSetting.vue +++ b/website/client/src/pages/settings/inlineSettings/languageSetting.vue @@ -112,12 +112,21 @@ export default { }, }, mounted () { - this.selectedLanguage = this.currentActiveLanguage; + this.resetControls(); }, methods: { + /** + * is a callback from the {InlineSettingMixin} + * do not remove + */ + resetControls () { + this.selectedLanguage = this.currentActiveLanguage; + }, changeLanguage (e) { const newLang = e.code; this.selectedLanguage = newLang; + + this.modalValuesChanged(); }, selectedLanguageLabel (languageKey) { if (!this.availableLanguages) { diff --git a/website/client/src/pages/settings/inlineSettings/userEmailSetting.vue b/website/client/src/pages/settings/inlineSettings/userEmailSetting.vue index ae30af37fd..14f51d21fb 100644 --- a/website/client/src/pages/settings/inlineSettings/userEmailSetting.vue +++ b/website/client/src/pages/settings/inlineSettings/userEmailSetting.vue @@ -40,6 +40,7 @@ v-model="updates.newEmail" settings-label="email" :is-valid="validEmail" + @update:value="modalValuesChanged" @blur="restoreEmptyEmail()" /> @@ -98,11 +99,17 @@ export default { this.restoreEmptyEmail(); }, methods: { + resetControls () { + this.restoreEmail(); + }, restoreEmptyEmail () { if (this.updates.newEmail.length < 1) { - this.updates.newEmail = this.user.auth.local.email; + this.restoreEmail(); } }, + restoreEmail () { + this.updates.newEmail = this.user.auth.local.email; + }, async changeEmail () { await axios.put('/api/v4/user/auth/update-email', this.updates); diff --git a/website/client/src/pages/settings/inlineSettings/userNameSetting.vue b/website/client/src/pages/settings/inlineSettings/userNameSetting.vue index cf9a87acac..6789d870df 100644 --- a/website/client/src/pages/settings/inlineSettings/userNameSetting.vue +++ b/website/client/src/pages/settings/inlineSettings/userNameSetting.vue @@ -41,7 +41,7 @@ settings-label="username" :is-valid="usernameValid" :invalid-issues="usernameIssues" - @update:value="inputChanged = true" + @update:value="valuesChanged()" @blur="restoreEmptyUsername()" /> @@ -109,12 +109,19 @@ export default { }, }, mounted () { - this.restoreEmptyUsername(); + this.resetControls(); }, methods: { + /** + * is a callback from the {InlineSettingMixin} + * do not remove + */ + resetControls () { + this.inputValue = `@${this.user.auth.local.username}`; + }, restoreEmptyUsername () { if (this.inputValue.length < 1) { - this.inputValue = `@${this.user.auth.local.username}`; + this.resetControls(); } }, async changeUser (attribute, newUsername) { @@ -126,6 +133,11 @@ export default { // this.localAuth.username = this.user.auth.local.username; this.user.flags.verifiedUsername = true; }, + valuesChanged () { + this.inputChanged = true; + + this.modalValuesChanged(); + }, validateUsername: debounce(async function checkName (username) { if (username.length <= 1 || username === this.user.auth.local.username) { this.usernameIssues = [];