| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  | <template> | 
					
						
							|  |  |  |   <v-container v-if="shoppingLists" class="narrow-container"> | 
					
						
							| 
									
										
										
										
											2022-03-19 11:31:17 -08:00
										 |  |  |     <BaseDialog v-model="createDialog" :title="$tc('shopping-list.create-shopping-list')" @submit="createOne"> | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |       <v-card-text> | 
					
						
							|  |  |  |         <v-text-field v-model="createName" autofocus :label="$t('shopping-list.new-list')"> </v-text-field> | 
					
						
							|  |  |  |       </v-card-text> | 
					
						
							|  |  |  |     </BaseDialog> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-19 11:31:17 -08:00
										 |  |  |     <BaseDialog v-model="deleteDialog" :title="$tc('general.confirm')" color="error" @confirm="deleteOne"> | 
					
						
							| 
									
										
										
										
											2023-01-29 02:39:51 +01:00
										 |  |  |       <v-card-text>{{ $t('shopping-list.are-you-sure-you-want-to-delete-this-item') }}</v-card-text> | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |     </BaseDialog> | 
					
						
							|  |  |  |     <BasePageTitle divider> | 
					
						
							|  |  |  |       <template #header> | 
					
						
							|  |  |  |         <v-img max-height="100" max-width="100" :src="require('~/static/svgs/shopping-cart.svg')"></v-img> | 
					
						
							|  |  |  |       </template> | 
					
						
							| 
									
										
										
										
											2023-01-29 02:39:51 +01:00
										 |  |  |       <template #title>{{ $t('shopping-list.shopping-lists') }}</template> | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |     </BasePageTitle> | 
					
						
							|  |  |  |     <BaseButton create @click="createDialog = true" /> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     <section> | 
					
						
							|  |  |  |       <v-card v-for="list in shoppingLists" :key="list.id" class="my-2 left-border" :to="`/shopping-lists/${list.id}`"> | 
					
						
							|  |  |  |         <v-card-title> | 
					
						
							|  |  |  |           <v-icon left> | 
					
						
							|  |  |  |             {{ $globals.icons.cartCheck }} | 
					
						
							|  |  |  |           </v-icon> | 
					
						
							|  |  |  |           {{ list.name }} | 
					
						
							|  |  |  |           <v-btn class="ml-auto" icon @click.prevent="openDelete(list.id)"> | 
					
						
							|  |  |  |             <v-icon> | 
					
						
							|  |  |  |               {{ $globals.icons.delete }} | 
					
						
							|  |  |  |             </v-icon> | 
					
						
							|  |  |  |           </v-btn> | 
					
						
							|  |  |  |         </v-card-title> | 
					
						
							|  |  |  |       </v-card> | 
					
						
							|  |  |  |     </section> | 
					
						
							| 
									
										
										
										
											2022-01-16 15:24:24 -09:00
										 |  |  |     <div class="d-flex justify-end mt-10"> | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |       <ButtonLink :to="`/group/data/labels`" :text="$tc('shopping-list.manage-labels')" :icon="$globals.icons.tags" /> | 
					
						
							| 
									
										
										
										
											2022-01-16 15:24:24 -09:00
										 |  |  |     </div> | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |   </v-container> | 
					
						
							|  |  |  | </template> | 
					
						
							| 
									
										
										
										
											2022-03-19 11:31:17 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  | <script lang="ts"> | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  | import { computed, defineComponent, useAsync, useContext, reactive, toRefs, useRoute } from "@nuxtjs/composition-api"; | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  | import { useUserApi } from "~/composables/api"; | 
					
						
							|  |  |  | import { useAsyncKey } from "~/composables/use-utils"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default defineComponent({ | 
					
						
							| 
									
										
										
										
											2024-02-02 16:00:18 +00:00
										 |  |  |   middleware: "auth", | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |   setup() { | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |     const { $auth } = useContext(); | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |     const userApi = useUserApi(); | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |     const route = useRoute(); | 
					
						
							|  |  |  |     const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || ""); | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const state = reactive({ | 
					
						
							|  |  |  |       createName: "", | 
					
						
							|  |  |  |       createDialog: false, | 
					
						
							|  |  |  |       deleteDialog: false, | 
					
						
							|  |  |  |       deleteTarget: "", | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const shoppingLists = useAsync(async () => { | 
					
						
							|  |  |  |       return await fetchShoppingLists(); | 
					
						
							|  |  |  |     }, useAsyncKey()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function fetchShoppingLists() { | 
					
						
							| 
									
										
										
										
											2024-02-23 16:03:56 +00:00
										 |  |  |       const { data } = await userApi.shopping.lists.getAll(1, -1, { orderBy: "name", orderDirection: "asc" }); | 
					
						
							| 
									
										
										
										
											2022-06-25 14:39:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |       if (!data) { | 
					
						
							|  |  |  |         return []; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       return data.items; | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function refresh() { | 
					
						
							|  |  |  |       shoppingLists.value = await fetchShoppingLists(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function createOne() { | 
					
						
							|  |  |  |       const { data } = await userApi.shopping.lists.createOne({ name: state.createName }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (data) { | 
					
						
							|  |  |  |         refresh(); | 
					
						
							|  |  |  |         state.createName = ""; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function openDelete(id: string) { | 
					
						
							|  |  |  |       state.deleteDialog = true; | 
					
						
							|  |  |  |       state.deleteTarget = id; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function deleteOne() { | 
					
						
							|  |  |  |       const { data } = await userApi.shopping.lists.deleteOne(state.deleteTarget); | 
					
						
							|  |  |  |       if (data) { | 
					
						
							|  |  |  |         refresh(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |       ...toRefs(state), | 
					
						
							| 
									
										
										
										
											2023-11-05 19:07:02 -06:00
										 |  |  |       groupSlug, | 
					
						
							| 
									
										
										
										
											2022-01-08 22:24:34 -09:00
										 |  |  |       shoppingLists, | 
					
						
							|  |  |  |       createOne, | 
					
						
							|  |  |  |       deleteOne, | 
					
						
							|  |  |  |       openDelete, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   head() { | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |       title: this.$t("shopping-list.shopping-list") as string, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | </script> |