diff --git a/src/components/ButtonBase.vue b/src/components/ButtonBase.vue index cff24ff..0215065 100644 --- a/src/components/ButtonBase.vue +++ b/src/components/ButtonBase.vue @@ -16,6 +16,8 @@ defineProps({ :class="{ 'border-0 bg-cyan-600 text-white disabled:bg-cyan-600 disabled:hover:bg-cyan-600 dark:bg-cyan-600 dark:hover:bg-cyan-600 dark:disabled:hover:bg-cyan-600': mode === 'primary', + 'border-0 bg-rose-500 text-white disabled:bg-rose-500 disabled:hover:bg-rose-500 dark:bg-rose-500 dark:hover:bg-rose-500 dark:disabled:hover:bg-rose-500': + mode === 'danger', 'border-stone-200 text-stone-500 hover:bg-stone-100 disabled:hover:bg-white dark:border-stone-700 dark:text-white/70 dark:hover:bg-stone-700 disabled:hover:dark:bg-stone-900': mode === 'secondary', }" @@ -23,9 +25,8 @@ defineProps({ diff --git a/src/components/FormWishlistItem.vue b/src/components/FormWishlistItem.vue new file mode 100644 index 0000000..2c7c908 --- /dev/null +++ b/src/components/FormWishlistItem.vue @@ -0,0 +1,36 @@ + + + + + + + + + emits('delete')" + :icon="IconDelete" + >{{ t('components.wishlist-item.delete-button.text') }} + + + diff --git a/src/components/icons/IconDelete.vue b/src/components/icons/IconDelete.vue new file mode 100644 index 0000000..006e96a --- /dev/null +++ b/src/components/icons/IconDelete.vue @@ -0,0 +1,7 @@ + + + + + diff --git a/src/components/icons/index.ts b/src/components/icons/index.ts index 30c3a6f..573801f 100644 --- a/src/components/icons/index.ts +++ b/src/components/icons/index.ts @@ -11,3 +11,4 @@ export { default as IconCloudQuestion } from './IconCloudQuestion.vue' export { default as IconToggleOn } from './IconToggleOn.vue' export { default as IconToggleOff } from './IconToggleOff.vue' export { default as IconSave } from './IconSave.vue' +export { default as IconDelete } from './IconDelete.vue' diff --git a/src/components/index.ts b/src/components/index.ts index 79ff6c5..87c6626 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -8,4 +8,5 @@ export { default as InputFile } from './InputFile.vue' export { default as InputTextArea } from './InputTextArea.vue' export { default as Modal } from './Modal.vue' export { default as FormWishlist } from './FormWishlist.vue' +export { default as FormWishlistItem } from './FormWishlistItem.vue' export { default as WishlistItem } from './WishlistItem.vue' diff --git a/src/composables/useWishlistStore.ts b/src/composables/useWishlistStore.ts index d3800f1..0eb1c53 100644 --- a/src/composables/useWishlistStore.ts +++ b/src/composables/useWishlistStore.ts @@ -45,6 +45,11 @@ const itemBought = async (item: WishlistItem): Promise => { item.bought = true } +const itemDelete = async (item: WishlistItem): Promise => { + await client.delete(`/wishlist/${item.wishlistId}/item/${item.id}`) + state.value?.items?.splice(state.value.items.indexOf(item), 1) +} + const filteredItems = computed(() => { if (!state.value || !state.value.items) { return [] @@ -61,6 +66,7 @@ export const useWishlistStore = () => { fetch, update, itemBought, + itemDelete, filteredItems, } } diff --git a/src/config/locales/de-DE.json b/src/config/locales/de-DE.json index 278f0ca..bb1a43c 100644 --- a/src/config/locales/de-DE.json +++ b/src/config/locales/de-DE.json @@ -53,7 +53,7 @@ "text": "Diese Wunschliste ist leer." } }, - "confirmation-modal": { + "modal-bought-item": { "title": { "text": "Möchten Sie den Gegenstand von der Liste nehmen?" }, @@ -66,6 +66,17 @@ "cancel-button": { "text": "Nein" } + }, + "modal-delete-item": { + "title": { + "text": "Möchten Sie den Gegenstand von der Liste löschen?" + }, + "confirm-button": { + "text": "Ja" + }, + "cancel-button": { + "text": "Nein" + } } } }, @@ -76,6 +87,9 @@ }, "bought-button": { "text": "Gekauft" + }, + "delete-button": { + "text": "Löschen" } }, "wishlist-header": { diff --git a/src/config/locales/en-US.json b/src/config/locales/en-US.json index e0a0936..9b33633 100644 --- a/src/config/locales/en-US.json +++ b/src/config/locales/en-US.json @@ -53,7 +53,7 @@ "text": "This wishlist is empty." } }, - "confirmation-modal": { + "modal-bought-item": { "title": { "text": "Do you want to remove the item from the list?" }, @@ -66,6 +66,17 @@ "cancel-button": { "text": "No" } + }, + "modal-delete-item": { + "title": { + "text": "Do you want to delete the item from the list?" + }, + "confirm-button": { + "text": "Yes" + }, + "cancel-button": { + "text": "No" + } } } }, @@ -76,6 +87,9 @@ }, "bought-button": { "text": "Bought" + }, + "delete-button": { + "text": "Delete" } }, "wishlist-header": { diff --git a/src/views/DetailView.vue b/src/views/DetailView.vue index ad0b7de..ef6abe1 100644 --- a/src/views/DetailView.vue +++ b/src/views/DetailView.vue @@ -3,7 +3,12 @@ import { useI18n } from 'vue-i18n' import { WishlistItem as WishlistItemType } from '@/types' import { useRoute } from 'vue-router' import { useWishlistStore, useModal, useEditMode } from '@/composables' -import { FormWishlist, ImageTile, WishlistItem } from '@/components' +import { + FormWishlist, + ImageTile, + WishlistItem, + FormWishlistItem, +} from '@/components' import { IconNoGift } from '../components/icons' const route = useRoute() @@ -11,20 +16,31 @@ const modal = useModal() const { t } = useI18n() const { isActive: editModeIsActive } = useEditMode() -const { state, fetch, isReady, itemBought, filteredItems } = useWishlistStore() +const { state, fetch, isReady, itemBought, itemDelete, filteredItems } = + useWishlistStore() await fetch(route.params.slug as string) const bought = async (item: WishlistItemType): Promise => { const confirmed = await modal.show( - t('pages.detail-view.confirmation-modal.title.text'), - t('pages.detail-view.confirmation-modal.confirm-button.text'), - t('pages.detail-view.confirmation-modal.cancel-button.text'), - t('pages.detail-view.confirmation-modal.body.text') + t('pages.detail-view.modal-bought-item.title.text'), + t('pages.detail-view.modal-bought-item.confirm-button.text'), + t('pages.detail-view.modal-bought-item.cancel-button.text'), + t('pages.detail-view.modal-bought-item.body.text') ) if (confirmed) { itemBought(item) } } +const deleteItem = async (item: WishlistItemType): Promise => { + const confirmed = await modal.show( + t('pages.detail-view.modal-delete-item.title.text'), + t('pages.detail-view.modal-delete-item.confirm-button.text'), + t('pages.detail-view.modal-delete-item.cancel-button.text') + ) + if (confirmed) { + itemDelete(item) + } +} @@ -50,13 +66,11 @@ const bought = async (item: WishlistItemType): Promise => { > +