Warn on unsaved changes

This commit is contained in:
Kevin Thomas
2022-05-25 21:09:41 -07:00
parent ff902fac16
commit 2cc5051ab4
3 changed files with 110 additions and 28 deletions

View File

@@ -5,7 +5,7 @@
"bugs": "https://github.com/kaythomas0/noisedash/issues", "bugs": "https://github.com/kaythomas0/noisedash/issues",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"author": "Kay Thomas <kaythomas@pm.me> (https://kaythomas.dev)", "author": "Kay Thomas <kaythomas@pm.me> (https://kaythomas.dev)",
"version": "0.2.0", "version": "0.4.0",
"private": true, "private": true,
"scripts": { "scripts": {
"serve": "vue-cli-service serve", "serve": "vue-cli-service serve",

View File

@@ -66,7 +66,7 @@
class="mx-3 my-3" class="mx-3 my-3"
@click="updateProfile" @click="updateProfile"
> >
Save Profile {{ unsavedWork ? 'Save Profile*' : 'Save Profile' }}
</v-btn> </v-btn>
<v-dialog <v-dialog
@@ -339,7 +339,7 @@
<v-dialog <v-dialog
v-model="recordingDialog" v-model="recordingDialog"
max-width="600px" max-width="600px"
persistent="true" persistent
> >
<v-card> <v-card>
<v-card-title> <v-card-title>
@@ -365,6 +365,36 @@
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
<v-dialog
v-model="confirmSwitchProfileDialog"
max-width="600px"
persistent
>
<v-card>
<v-card-title>
<span class="text-h5">Save Profile?</span>
</v-card-title>
<v-card-text>
You have unsaved work on your current profile. Would you like to save it before switching?
</v-card-text>
<v-card-actions>
<v-spacer />
<v-btn
text
@click="discardChanges"
>
Discard Changes
</v-btn>
<v-btn
text
@click="saveChanges"
>
Save Profile
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-col> </v-col>
<v-col cols="12"> <v-col cols="12">

View File

@@ -70,6 +70,11 @@ export default {
recordedProfile: {}, recordedProfile: {},
recordingFileName: '', recordingFileName: '',
isRecordingValid: false, isRecordingValid: false,
unsavedWork: false,
saveProfileText: 'Save Profile',
unwatch: null,
confirmSwitchProfileDialog: false,
activeProfile: {},
errorSnackbar: false, errorSnackbar: false,
errorSnackbarText: '', errorSnackbarText: '',
rules: { rules: {
@@ -94,6 +99,26 @@ export default {
} }
}) })
return samples return samples
},
changeableSettings: function () {
return [
this.isTimerEnabled,
this.hours,
this.minutes,
this.seconds,
this.volume,
this.noiseColor,
this.isFilterEnabled,
this.filterType,
this.filterCutoff,
this.isLFOFilterCutoffEnabled,
this.lfoFilterCutoffFrequency,
this.lfoFilterCutoffRange,
this.isTremoloEnabled,
this.tremoloDepth,
this.isTimerEnabled,
this.loadedSamples
]
} }
}, },
created () { created () {
@@ -294,6 +319,7 @@ export default {
if (response.status === 200) { if (response.status === 200) {
this.profileDialog = false this.profileDialog = false
this.populateProfileItems(response.data.id) this.populateProfileItems(response.data.id)
this.unsavedWork = false
this.infoSnackbarText = 'Profile Saved' this.infoSnackbarText = 'Profile Saved'
this.infoSnackbar = true this.infoSnackbar = true
} }
@@ -322,6 +348,7 @@ export default {
samples: this.loadedSamples samples: this.loadedSamples
}).then(response => { }).then(response => {
if (response.status === 200) { if (response.status === 200) {
this.unsavedWork = false
this.infoSnackbarText = 'Profile Saved' this.infoSnackbarText = 'Profile Saved'
this.infoSnackbar = true this.infoSnackbar = true
} }
@@ -332,6 +359,9 @@ export default {
}) })
}, },
loadProfile () { loadProfile () {
if (this.unsavedWork) {
this.confirmSwitchProfileDialog = true
} else {
this.$http.get('/profiles/'.concat(this.selectedProfile.id)) this.$http.get('/profiles/'.concat(this.selectedProfile.id))
.then(response => { .then(response => {
if (response.status === 200) { if (response.status === 200) {
@@ -353,12 +383,23 @@ export default {
this.tremoloDepth = profile.tremoloDepth this.tremoloDepth = profile.tremoloDepth
this.loadedSamples = profile.samples this.loadedSamples = profile.samples
this.activeProfile = profile
if (this.unwatch) {
this.unwatch()
}
this.unwatch = this.$watch('changeableSettings', function () {
this.unsavedWork = true
})
} }
}) })
.catch(() => { .catch(() => {
this.errorSnackbarText = 'Error Loading Profile' this.errorSnackbarText = 'Error Loading Profile'
this.errorSnackbar = true this.errorSnackbar = true
}) })
}
}, },
deleteProfile () { deleteProfile () {
this.$http.delete('/profiles/'.concat(this.selectedProfile.id)) this.$http.delete('/profiles/'.concat(this.selectedProfile.id))
@@ -749,6 +790,17 @@ export default {
clearInterval(this.recordingInterval) clearInterval(this.recordingInterval)
this.recordingDialog = false this.recordingDialog = false
this.stop() this.stop()
},
discardChanges () {
this.unsavedWork = false
this.loadProfile()
this.confirmSwitchProfileDialog = false
},
saveChanges () {
// Set active profile back to previously selected one before saving
this.selectedProfile = this.profileItems.find(p => p.text === this.activeProfile.name)
this.updateProfile()
this.confirmSwitchProfileDialog = false
} }
} }
} }