| 
									
										
										
										
											2021-11-20 14:30:38 -09:00
										 |  |  | <template> | 
					
						
							|  |  |  |   <div> | 
					
						
							| 
									
										
										
										
											2022-01-09 21:04:24 -09:00
										 |  |  |     <div v-if="displayPreview" class="d-flex justify-end"> | 
					
						
							|  |  |  |       <BaseButtonGroup | 
					
						
							|  |  |  |         :buttons="[ | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             icon: previewState ? $globals.icons.edit : $globals.icons.eye, | 
					
						
							| 
									
										
										
										
											2022-06-05 11:28:38 -08:00
										 |  |  |             text: previewState ? $tc('general.edit') : 'Preview Markdown', | 
					
						
							| 
									
										
										
										
											2022-01-09 21:04:24 -09:00
										 |  |  |             event: 'toggle', | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         ]" | 
					
						
							|  |  |  |         @toggle="previewState = !previewState" | 
					
						
							|  |  |  |       /> | 
					
						
							|  |  |  |     </div> | 
					
						
							| 
									
										
										
										
											2021-11-20 14:30:38 -09:00
										 |  |  |     <v-textarea | 
					
						
							| 
									
										
										
										
											2022-01-09 21:04:24 -09:00
										 |  |  |       v-if="!previewState" | 
					
						
							| 
									
										
										
										
											2022-06-05 11:28:38 -08:00
										 |  |  |       v-bind="textarea" | 
					
						
							| 
									
										
										
										
											2021-11-20 14:30:38 -09:00
										 |  |  |       v-model="inputVal" | 
					
						
							|  |  |  |       :class="label == '' ? '' : 'mt-5'" | 
					
						
							|  |  |  |       :label="label" | 
					
						
							|  |  |  |       auto-grow | 
					
						
							|  |  |  |       dense | 
					
						
							|  |  |  |       rows="4" | 
					
						
							| 
									
										
										
										
											2022-06-05 11:28:38 -08:00
										 |  |  |     /> | 
					
						
							|  |  |  |     <VueMarkdown v-else :source="value" /> | 
					
						
							| 
									
										
										
										
											2021-11-20 14:30:38 -09:00
										 |  |  |   </div> | 
					
						
							|  |  |  | </template> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <script lang="ts"> | 
					
						
							| 
									
										
										
										
											2022-01-16 03:38:11 +01:00
										 |  |  | // @ts-ignore vue-markdown has no types
 | 
					
						
							| 
									
										
										
										
											2021-11-20 14:30:38 -09:00
										 |  |  | import VueMarkdown from "@adapttive/vue-markdown"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-09 21:04:24 -09:00
										 |  |  | import { defineComponent, computed, ref } from "@nuxtjs/composition-api"; | 
					
						
							| 
									
										
										
										
											2021-11-20 14:30:38 -09:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default defineComponent({ | 
					
						
							|  |  |  |   name: "MarkdownEditor", | 
					
						
							|  |  |  |   components: { | 
					
						
							|  |  |  |     VueMarkdown, | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   props: { | 
					
						
							|  |  |  |     value: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							|  |  |  |       required: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     label: { | 
					
						
							|  |  |  |       type: String, | 
					
						
							|  |  |  |       default: "", | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2022-01-09 21:04:24 -09:00
										 |  |  |     preview: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: undefined, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     displayPreview: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: true, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2022-06-05 11:28:38 -08:00
										 |  |  |     textarea: { | 
					
						
							|  |  |  |       type: Object, | 
					
						
							|  |  |  |       default: () => ({}), | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-11-20 14:30:38 -09:00
										 |  |  |   }, | 
					
						
							|  |  |  |   setup(props, context) { | 
					
						
							| 
									
										
										
										
											2022-01-09 21:04:24 -09:00
										 |  |  |     const fallbackPreview = ref(false); | 
					
						
							|  |  |  |     const previewState = computed({ | 
					
						
							|  |  |  |       get: () => { | 
					
						
							|  |  |  |         return props.preview ?? fallbackPreview.value; | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       set: (val) => { | 
					
						
							|  |  |  |         if (props.preview) { | 
					
						
							|  |  |  |           context.emit("input:preview", val); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           fallbackPreview.value = val; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2021-11-20 14:30:38 -09:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const inputVal = computed({ | 
					
						
							|  |  |  |       get: () => { | 
					
						
							|  |  |  |         return props.value; | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       set: (val) => { | 
					
						
							|  |  |  |         context.emit("input", val); | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     return { | 
					
						
							| 
									
										
										
										
											2022-01-09 21:04:24 -09:00
										 |  |  |       previewState, | 
					
						
							| 
									
										
										
										
											2021-11-20 14:30:38 -09:00
										 |  |  |       inputVal, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | </script> |