gamebrary/src/components/Game/GameNotesModal.vue

134 lines
3.2 KiB
Vue
Raw Normal View History

2020-11-03 22:48:40 +00:00
<template lang="html">
<b-dropdown-item v-b-modal.notes>
<i class="far fa-sticky-note fa-fw" /> Game notes
2020-11-03 22:48:40 +00:00
<b-modal
id="notes"
:header-bg-variant="nightMode ? 'dark' : null"
:header-text-variant="nightMode ? 'white' : null"
:body-bg-variant="nightMode ? 'dark' : null"
:body-text-variant="nightMode ? 'white' : null"
:footer-bg-variant="nightMode ? 'dark' : null"
:footer-text-variant="nightMode ? 'white' : null"
footer-class="d-flex justify-content-between"
@show="show"
>
<template v-slot:modal-header="{ close }">
<modal-header
title="Game notes"
@close="close"
/>
</template>
<b-form-textarea
v-model.trim="localNote"
placeholder="Type note here"
rows="3"
max-rows="20"
/>
<b-form-text id="input-live-help">
<a href="https://www.markdownguide.org/cheat-sheet/" target="_blank">
Markdown supported
</a>
</b-form-text>
2021-01-25 21:13:57 +00:00
<template v-slot:modal-footer>
2020-11-03 22:48:40 +00:00
<b-button
variant="danger"
2021-01-25 21:13:57 +00:00
v-if="notes[game.id]"
:disabled="deleting"
2020-11-03 22:48:40 +00:00
@click="deleteNote"
>
<b-spinner small v-if="deleting" />
<span v-else>{{ $t('global.delete') }}</span>
</b-button>
2021-01-25 21:13:57 +00:00
<div :class="!notes[game.id] ? 'ml-auto' : ''">
2020-11-03 22:48:40 +00:00
<b-button
variant="primary"
:disabled="saving"
@click="saveNote"
>
<b-spinner small v-if="saving" />
<span v-else>{{ $t('global.save') }}</span>
</b-button>
</div>
</template>
</b-modal>
</b-dropdown-item>
2020-11-03 22:48:40 +00:00
</template>
<script>
import { mapState, mapGetters } from 'vuex';
export default {
props: {
game: Object,
},
data() {
return {
localNote: '',
deleting: false,
saving: false,
};
},
computed: {
...mapState(['notes']),
...mapGetters(['nightMode']),
},
methods: {
show() {
this.deleting = false;
this.saving = false;
const { id } = this.game;
2021-01-10 18:01:49 +00:00
if (this.notes[id]) {
this.localNote = typeof this.notes[id] === 'object' && this.notes[id].text
? this.notes[id].text
: JSON.parse(JSON.stringify(this.notes[id]));
}
2020-11-03 22:48:40 +00:00
},
async saveNote() {
this.saving = true;
this.$store.commit('SET_GAME_NOTE', {
note: this.localNote,
gameId: this.game.id,
});
await this.$store.dispatch('SAVE_NOTES')
.catch(() => {
this.saving = false;
2020-12-10 05:26:57 +00:00
this.$bvToast.toast('There was an error saving your note', { variant: 'danger' });
2020-11-03 22:48:40 +00:00
});
2020-12-10 05:26:57 +00:00
this.$bvToast.toast('Note saved');
2020-11-03 22:48:40 +00:00
this.$bvModal.hide('notes');
},
async deleteNote() {
this.deleting = true;
2021-01-25 21:14:07 +00:00
this.localNote = '';
2020-11-03 22:48:40 +00:00
this.$store.commit('REMOVE_GAME_NOTE', this.game.id);
await this.$store.dispatch('SAVE_NOTES_NO_MERGE')
.catch(() => {
this.deleting = false;
2020-12-10 05:26:57 +00:00
this.$bvToast.toast('There was an error deleting your note', { variant: 'danger' });
2020-11-03 22:48:40 +00:00
});
2020-12-10 05:26:57 +00:00
this.$bvToast.toast('Note deleted');
2020-11-03 22:48:40 +00:00
this.$bvModal.hide('notes');
},
},
};
</script>