| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  | <template> | 
					
						
							|  |  |  |   <div v-if="value.length > 0 || edit"> | 
					
						
							| 
									
										
										
										
											2023-11-24 10:40:35 +01:00
										 |  |  |     <v-card class="mt-4"> | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |       <v-card-title class="py-2"> | 
					
						
							|  |  |  |         {{ $t("asset.assets") }} | 
					
						
							|  |  |  |       </v-card-title> | 
					
						
							|  |  |  |       <v-divider class="mx-2"></v-divider> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |       <v-list v-if="value.length > 0" :flat="!edit"> | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |         <v-list-item v-for="(item, i) in value" :key="i"> | 
					
						
							|  |  |  |           <v-list-item-icon class="ma-auto"> | 
					
						
							|  |  |  |             <v-tooltip bottom> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |               <template #activator="{ on, attrs }"> | 
					
						
							| 
									
										
										
										
											2022-05-25 09:38:21 -08:00
										 |  |  |                 <v-icon v-bind="attrs" v-on="on"> | 
					
						
							|  |  |  |                   {{ getIconDefinition(item.icon).icon }} | 
					
						
							|  |  |  |                 </v-icon> | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |               </template> | 
					
						
							|  |  |  |               <span>{{ getIconDefinition(item.icon).title }}</span> | 
					
						
							|  |  |  |             </v-tooltip> | 
					
						
							|  |  |  |           </v-list-item-icon> | 
					
						
							|  |  |  |           <v-list-item-content> | 
					
						
							| 
									
										
										
										
											2022-05-25 09:38:21 -08:00
										 |  |  |             <v-list-item-title class="pl-2"> | 
					
						
							|  |  |  |               {{ item.name }} | 
					
						
							|  |  |  |             </v-list-item-title> | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |           </v-list-item-content> | 
					
						
							|  |  |  |           <v-list-item-action> | 
					
						
							| 
									
										
										
										
											2022-05-25 11:50:45 -08:00
										 |  |  |             <v-btn v-if="!edit" color="primary" icon :href="assetURL(item.fileName)" target="_blank" top> | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |               <v-icon> {{ $globals.icons.download }} </v-icon> | 
					
						
							|  |  |  |             </v-btn> | 
					
						
							|  |  |  |             <div v-else> | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  |               <v-btn color="error" icon top @click="value.splice(i, 1)"> | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |                 <v-icon>{{ $globals.icons.delete }}</v-icon> | 
					
						
							|  |  |  |               </v-btn> | 
					
						
							| 
									
										
										
										
											2022-05-25 11:50:45 -08:00
										 |  |  |               <AppButtonCopy color="" :copy-text="assetEmbed(item.fileName)" /> | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |             </div> | 
					
						
							|  |  |  |           </v-list-item-action> | 
					
						
							|  |  |  |         </v-list-item> | 
					
						
							|  |  |  |       </v-list> | 
					
						
							|  |  |  |     </v-card> | 
					
						
							|  |  |  |     <div class="d-flex ml-auto mt-2"> | 
					
						
							|  |  |  |       <v-spacer></v-spacer> | 
					
						
							| 
									
										
										
										
											2021-11-25 14:17:02 -09:00
										 |  |  |       <BaseDialog | 
					
						
							| 
									
										
										
										
											2022-05-25 11:50:45 -08:00
										 |  |  |         v-model="state.newAssetDialog" | 
					
						
							| 
									
										
										
										
											2022-05-25 09:38:21 -08:00
										 |  |  |         :title="$tc('asset.new-asset')" | 
					
						
							| 
									
										
										
										
											2022-05-25 11:50:45 -08:00
										 |  |  |         :icon="getIconDefinition(state.newAsset.icon).icon" | 
					
						
							| 
									
										
										
										
											2021-11-25 14:17:02 -09:00
										 |  |  |         @submit="addAsset" | 
					
						
							|  |  |  |       > | 
					
						
							|  |  |  |         <template #activator> | 
					
						
							| 
									
										
										
										
											2022-06-05 11:28:38 -08:00
										 |  |  |           <BaseButton v-if="edit" small create @click="state.newAssetDialog = true" /> | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |         </template> | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  |         <v-card-text class="pt-4"> | 
					
						
							| 
									
										
										
										
											2022-05-25 11:50:45 -08:00
										 |  |  |           <v-text-field v-model="state.newAsset.name" dense :label="$t('general.name')"></v-text-field> | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |           <div class="d-flex justify-space-between"> | 
					
						
							|  |  |  |             <v-select | 
					
						
							| 
									
										
										
										
											2022-05-25 11:50:45 -08:00
										 |  |  |               v-model="state.newAsset.icon" | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |               dense | 
					
						
							| 
									
										
										
										
											2022-05-25 11:50:45 -08:00
										 |  |  |               :prepend-icon="getIconDefinition(state.newAsset.icon).icon" | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |               :items="iconOptions" | 
					
						
							|  |  |  |               item-text="title" | 
					
						
							|  |  |  |               item-value="name" | 
					
						
							|  |  |  |               class="mr-2" | 
					
						
							|  |  |  |             > | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |               <template #item="{ item }"> | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |                 <v-list-item-avatar> | 
					
						
							|  |  |  |                   <v-icon class="mr-auto"> | 
					
						
							|  |  |  |                     {{ item.icon }} | 
					
						
							|  |  |  |                   </v-icon> | 
					
						
							|  |  |  |                 </v-list-item-avatar> | 
					
						
							|  |  |  |                 {{ item.title }} | 
					
						
							|  |  |  |               </template> | 
					
						
							|  |  |  |             </v-select> | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |             <AppButtonUpload :post="false" file-name="file" :text-btn="false" @uploaded="setFileObject" /> | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |           </div> | 
					
						
							| 
									
										
										
										
											2022-05-25 11:50:45 -08:00
										 |  |  |           {{ state.fileObject.name }} | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |         </v-card-text> | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |       </BaseDialog> | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |     </div> | 
					
						
							|  |  |  |   </div> | 
					
						
							|  |  |  | </template> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  | <script lang="ts"> | 
					
						
							| 
									
										
										
										
											2022-05-25 11:50:45 -08:00
										 |  |  | import { defineComponent, reactive, useContext } from "@nuxtjs/composition-api"; | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  | import { useStaticRoutes, useUserApi } from "~/composables/api"; | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  | import { alert } from "~/composables/use-toast"; | 
					
						
							| 
									
										
										
										
											2022-08-28 13:54:32 -08:00
										 |  |  | import { detectServerBaseUrl } from "~/composables/use-utils"; | 
					
						
							| 
									
										
										
										
											2022-10-22 11:51:07 -08:00
										 |  |  | import { RecipeAsset } from "~/lib/api/types/recipe"; | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default defineComponent({ | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |   props: { | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |     slug: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							|  |  |  |       required: true, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2022-02-13 12:23:42 -09:00
										 |  |  |     recipeId: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							|  |  |  |       required: true, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |     value: { | 
					
						
							| 
									
										
										
										
											2022-05-25 09:38:21 -08:00
										 |  |  |       type: Array as () => RecipeAsset[], | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |       required: true, | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     edit: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  |   setup(props, context) { | 
					
						
							| 
									
										
										
										
											2021-11-06 11:28:47 -08:00
										 |  |  |     const api = useUserApi(); | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  |     const state = reactive({ | 
					
						
							| 
									
										
										
										
											2021-11-25 14:17:02 -09:00
										 |  |  |       newAssetDialog: false, | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  |       fileObject: {} as File, | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |       newAsset: { | 
					
						
							|  |  |  |         name: "", | 
					
						
							|  |  |  |         icon: "mdi-file", | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-28 13:54:32 -08:00
										 |  |  |     const { $globals, i18n, req } = useContext(); | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const iconOptions = [ | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: "mdi-file", | 
					
						
							|  |  |  |         title: i18n.t("asset.file"), | 
					
						
							|  |  |  |         icon: $globals.icons.file, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: "mdi-file-pdf-box", | 
					
						
							|  |  |  |         title: i18n.t("asset.pdf"), | 
					
						
							|  |  |  |         icon: $globals.icons.filePDF, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: "mdi-file-image", | 
					
						
							|  |  |  |         title: i18n.t("asset.image"), | 
					
						
							|  |  |  |         icon: $globals.icons.fileImage, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: "mdi-code-json", | 
					
						
							|  |  |  |         title: i18n.t("asset.code"), | 
					
						
							|  |  |  |         icon: $globals.icons.codeJson, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         name: "mdi-silverware-fork-knife", | 
					
						
							|  |  |  |         title: i18n.t("asset.recipe"), | 
					
						
							|  |  |  |         icon: $globals.icons.primary, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-28 13:54:32 -08:00
										 |  |  |     const serverBase = detectServerBaseUrl(req); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  |     function getIconDefinition(icon: string) { | 
					
						
							|  |  |  |       return iconOptions.find((item) => item.name === icon) || iconOptions[0]; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |     const { recipeAssetPath } = useStaticRoutes(); | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  |     function assetURL(assetName: string) { | 
					
						
							| 
									
										
										
										
											2022-02-13 12:23:42 -09:00
										 |  |  |       return recipeAssetPath(props.recipeId, assetName); | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function assetEmbed(name: string) { | 
					
						
							| 
									
										
										
										
											2022-08-28 13:54:32 -08:00
										 |  |  |       return `<img src="${serverBase}${assetURL(name)}" height="100%" width="100%"> </img>`; | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  |     function setFileObject(fileObject: File) { | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  |       state.fileObject = fileObject; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function validFields() { | 
					
						
							|  |  |  |       return state.newAsset.name.length > 0 && state.fileObject.name.length > 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function addAsset() { | 
					
						
							|  |  |  |       if (!validFields()) { | 
					
						
							| 
									
										
										
										
											2022-08-10 07:12:45 +02:00
										 |  |  |         alert.error(i18n.t("asset.error-submitting-form") as string); | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const { data } = await api.recipes.createAsset(props.slug, { | 
					
						
							|  |  |  |         name: state.newAsset.name, | 
					
						
							|  |  |  |         icon: state.newAsset.icon, | 
					
						
							|  |  |  |         file: state.fileObject, | 
					
						
							|  |  |  |         extension: state.fileObject.name.split(".").pop() || "", | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context.emit("input", [...props.value, data]); | 
					
						
							|  |  |  |       state.newAsset = { name: "", icon: "mdi-file" }; | 
					
						
							|  |  |  |       state.fileObject = {} as File; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return { | 
					
						
							| 
									
										
										
										
											2022-05-25 11:50:45 -08:00
										 |  |  |       state, | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  |       addAsset, | 
					
						
							|  |  |  |       assetURL, | 
					
						
							|  |  |  |       assetEmbed, | 
					
						
							|  |  |  |       getIconDefinition, | 
					
						
							|  |  |  |       iconOptions, | 
					
						
							|  |  |  |       setFileObject, | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  |     }; | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2021-07-31 15:07:19 -08:00
										 |  |  | </script> |