{"version":3,"file":"imageEditor.obs.js","sources":["../../../Framework/Controls/imageEditor.obs"],"sourcesContent":["<!-- Copyright by the Spark Development Network; Licensed under the Rock Community License -->\r\n<template>\r\n <RockFormField\r\n v-bind=\"standardFieldProps\"\r\n :modelValue=\"fileGuid\"\r\n formGroupClasses=\"image-uploader\"\r\n name=\"imageuploader\">\r\n <template #default=\"{ uniqueId, field }\">\r\n <div class=\"control-wrapper\">\r\n <NotificationBox v-if=\"errorMessage\" alertType=\"warning\">\r\n <strong><i class=\"fa fa-exclamation-triangle\"></i> Warning </strong>\r\n <span>{{ errorMessage }}</span>\r\n </NotificationBox>\r\n\r\n <div ref=\"dropZoneElement\"\r\n :id=\"uniqueId\"\r\n class=\"image-editor-group imageupload-group\"\r\n @click.prevent=\"onSelectFileClick\"\r\n @keypress.enter.prevent.stop=\"onSelectFileClick\"\r\n @keypress.space.prevent.stop=\"onSelectFileClick\"\r\n role=\"button\"\r\n :tabindex=\"disabled ? -1 : 0\"\r\n aria-label=\"Select an Image File\"\r\n :style=\"{ pointerEvents: disabled ? 'none' : undefined }\"\r\n v-bind=\"field\">\r\n <div class=\"image-editor-photo\">\r\n <div v-if=\"isUploading\" class=\"text-bold text-center p-3\" style=\"position:absolute; top:0; right: 0; bottom:0; left:0; background: rgba(255, 255, 255, .75)\">\r\n <div class=\"js-upload-progress\">\r\n <i class=\"fa fa-refresh fa-3x fa-spin\"></i>\r\n </div>\r\n <span style=\"opacity: 0.75\">Uploading...</span>\r\n </div>\r\n <div class=\"image-container\" :style=\"thumbnailStyle\"></div>\r\n <div class=\"options\">\r\n <a @click.prevent.stop=\"onSelectFileClick\" aria-label=\"Select an Image File\" title=\"Select an Image File\"><i class=\"fa fa-pencil\" aria-hidden></i></a>\r\n <a @click.prevent.stop=\"onRemoveFileClick\" v-if=\"isDeleteVisible\" aria-label=\"Clear Image\" title=\"Clear Image\"><i class=\"fa fa-times\" aria-hidden></i></a>\r\n </div>\r\n <div class=\"image-editor-fileinput\">\r\n <input ref=\"fileInputElement\" type=\"file\" style=\"display: none;\" @change=\"onFileChange\" @remove=\"onFileRemove\" @click.stop />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </RockFormField>\r\n <Modal v-model=\"showModal\" title=\"Crop Image\" @close=\"cancelCrop\">\r\n <div style=\"max-width:480px; max-height: 480px; margin:auto; aspect-ratio: 1;\">\r\n <img :src=\"selectedImageUrl ?? ''\" ref=\"imgRef\" style=\"display:block; max-width:100%;\" />\r\n </div>\r\n <template #customButtons>\r\n <RockButton type=\"button\" :btnType=\"BtnType.Primary\" @click.prevent=\"cropAndUpload\">Crop</RockButton>\r\n </template>\r\n </Modal>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { Guid } from \"@Obsidian/Types\";\r\n import { computed, PropType, ref, watch } from \"vue\";\r\n import NotificationBox from \"./notificationBox.obs\";\r\n import Modal from \"./modal.obs\";\r\n import RockButton from \"./rockButton.obs\";\r\n import RockFormField from \"./rockFormField.obs\";\r\n import { BinaryFiletype } from \"@Obsidian/SystemGuids/binaryFiletype\";\r\n import { uploadBinaryFile } from \"@Obsidian/Utility/http\";\r\n import { BtnType } from \"@Obsidian/Enums/Controls/btnType\";\r\n import { standardRockFormFieldProps, useStandardRockFormFieldProps } from \"@Obsidian/Utility/component\";\r\n import { ListItemBag } from \"@Obsidian/ViewModels/Utility/listItemBag\";\r\n import Cropper from \"@Obsidian/Libs/cropper\";\r\n import { toGuidOrNull } from \"@Obsidian/Utility/guid\";\r\n\r\n const imgRef = ref<HTMLImageElement | null>(null);\r\n let cropper: Cropper | undefined | null;\r\n\r\n const props = defineProps({\r\n modelValue: {\r\n type: Object as PropType<ListItemBag | null>,\r\n required: false\r\n },\r\n\r\n /** The GUID of the type of file the image will be uploaded as */\r\n binaryFileTypeGuid: {\r\n type: String as PropType<Guid>,\r\n default: BinaryFiletype.Default\r\n },\r\n\r\n disabled: {\r\n type: Boolean as PropType<boolean>,\r\n default: false\r\n },\r\n\r\n /** Max pixel height of the cropped image to be uploaded. Set to 0 (default) to remove limit */\r\n maxImageHeight: {\r\n type: Number,\r\n default: 0\r\n },\r\n\r\n /** Max pixel width of the cropped image to be uploaded. Set to 0 (default) to remove limit */\r\n maxImageWidth: {\r\n type: Number,\r\n default: 0\r\n },\r\n\r\n /** Image aspect ratio expressed as a number: width / height. E.g. for 16:9 ratio, use 16/9. Default is square (1) */\r\n aspectRatio: {\r\n type: Number,\r\n default: 1 // square\r\n },\r\n\r\n /** URL of the image to show when there is no image value */\r\n noPictureUrl: {\r\n type: String,\r\n default: \"/Assets/Images/person-no-photo-unknown.svg\"\r\n },\r\n\r\n /** Whether or not to hide the delete button */\r\n hideDeleteButton: {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n ...standardRockFormFieldProps\r\n });\r\n\r\n const emit = defineEmits<{\r\n (e: \"update:modelValue\", value: ListItemBag | null): void;\r\n (e: \"cropped\", /** The local URL of cropped image */value: string): void;\r\n }>();\r\n\r\n // Main Values\r\n const fileGuid = ref<Guid | null>(toGuidOrNull(props.modelValue?.value));\r\n const fileName = ref(props.modelValue?.text ?? \"\");\r\n\r\n // Variables related to the progress of uploading a new file.\r\n const isUploading = ref(false);\r\n const uploadProgressText = ref(\"\");\r\n const errorMessage = ref(\"\");\r\n\r\n // Element references used to interact directly with the DOM.\r\n const fileInputElement = ref<HTMLInputElement | null>(null);\r\n const dropZoneElement = ref<HTMLElement | null>(null);\r\n const standardFieldProps = useStandardRockFormFieldProps(props);\r\n\r\n const showModal = ref(false);\r\n\r\n const selectedImageFileName = ref<string>(\"\");\r\n\r\n // Image URLs\r\n const selectedImageUrl = ref<string | null>(null);\r\n const croppedImageUrl = ref<string | null>(null);\r\n const thumbnailUrl = computed(() => {\r\n if (fileGuid.value) {\r\n return `/GetImage.ashx?guid=${fileGuid.value}&width=150`;\r\n }\r\n\r\n if (croppedImageUrl.value) {\r\n return croppedImageUrl.value;\r\n }\r\n\r\n return props.noPictureUrl;\r\n });\r\n\r\n // The CSS styles to use for the thumbnail element.\r\n const thumbnailStyle = computed((): Record<string, string> => {\r\n return {\r\n backgroundImage: `url('${thumbnailUrl.value}')`,\r\n backgroundSize: \"cover\",\r\n backgroundPosition: \"50%\"\r\n };\r\n });\r\n\r\n // True if the delete button should be visible.\r\n const isDeleteVisible = computed((): boolean => {\r\n return !props.hideDeleteButton && !!(fileGuid.value || selectedImageUrl.value);\r\n });\r\n\r\n /** Take the file chosen in the file picker and bring it up to be cropped */\r\n async function showCropperForSelectedFile(file: File): Promise<void> {\r\n errorMessage.value = \"\";\r\n selectedImageUrl.value = \"\";\r\n\r\n const url = await getUrlForFile(file);\r\n\r\n if (!url) {\r\n errorMessage.value = \"Error processing the file. File type may not be supported.\";\r\n }\r\n\r\n selectedImageUrl.value = url;\r\n selectedImageFileName.value = file.name;\r\n showModal.value = true;\r\n }\r\n\r\n /** Get URL for file */\r\n async function getUrlForFile(file: File): Promise<string> {\r\n return new Promise((res) => {\r\n if (URL) {\r\n res(URL.createObjectURL(file));\r\n }\r\n else if (FileReader) {\r\n let reader = new FileReader();\r\n reader.onload = () => res(reader.result?.toString() ?? \"\");\r\n reader.onerror = () => res(\"\");\r\n reader.readAsDataURL(file);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Upload the specified file into Rock with the current settings.\r\n *\r\n * @param file The file to be uploaded.\r\n */\r\n async function uploadFile(file: Blob): Promise<void> {\r\n // Update the UI to reflect that we are currently uploading.\r\n isUploading.value = true;\r\n uploadProgressText.value = \"0%\";\r\n errorMessage.value = \"\";\r\n\r\n const fileToUpload = new File([file], selectedImageFileName.value, { type: file.type });\r\n\r\n try {\r\n // Perform the actual file upload using the helper function.\r\n const result = await uploadBinaryFile(fileToUpload, props.binaryFileTypeGuid || BinaryFiletype.Default, {\r\n baseUrl: \"/ImageUploader.ashx\",\r\n isTemporary: false,\r\n progress: (progress, total, percent) => {\r\n uploadProgressText.value = `${percent}%`;\r\n }\r\n });\r\n\r\n fileGuid.value = toGuidOrNull(result.value);\r\n fileName.value = result.text ?? \"\";\r\n }\r\n catch (e) {\r\n // Show any error message we got.\r\n errorMessage.value = String(e);\r\n }\r\n finally {\r\n // Clear the uploading progress whether success or failure.\r\n isUploading.value = false;\r\n }\r\n }\r\n\r\n /**\r\n * Event handler for when the individual clicks to manually select a file\r\n * to be uploaded into Rock.\r\n */\r\n function onSelectFileClick(e): void {\r\n if (!isUploading.value) {\r\n fileInputElement.value?.click();\r\n }\r\n }\r\n\r\n /**\r\n * Event handler for when the remove file button is clicked.\r\n */\r\n function onRemoveFileClick(): void {\r\n selectedImageUrl.value = \"\";\r\n errorMessage.value = \"\";\r\n fileGuid.value = null;\r\n fileName.value = \"\";\r\n }\r\n\r\n /**\r\n * Event handler for when the file input has a new file selected. This\r\n * is triggered for manual selection only, not drag and drop.\r\n */\r\n function onFileChange(): void {\r\n if (isUploading.value) {\r\n return;\r\n }\r\n\r\n if (fileInputElement.value && fileInputElement.value.files && fileInputElement.value.files.length > 0) {\r\n showCropperForSelectedFile(fileInputElement.value.files[0]);\r\n fileInputElement.value.value = \"\";\r\n }\r\n }\r\n\r\n /**\r\n * Event handler for when the file input has been cleared. This is\r\n * probably not actually needed since the control is hidden but including\r\n * it just in case.\r\n */\r\n function onFileRemove(): void {\r\n if (isUploading.value) {\r\n return;\r\n }\r\n\r\n fileGuid.value = null;\r\n fileName.value = \"\";\r\n }\r\n\r\n /** Crop the image according to specifications from the cropper and then upload the cropped image */\r\n function cropAndUpload(): void {\r\n let { width, height } = cropper?.getData(true) ?? { width: 150, height: 150 };\r\n\r\n // Scale down if necessary to be within max width\r\n if (props.maxImageWidth && width > props.maxImageWidth) {\r\n const ratio = props.maxImageWidth / width;\r\n width = width * ratio;\r\n height = height * ratio;\r\n }\r\n\r\n // Scale down if necessary to be within max height\r\n if (props.maxImageHeight && height > props.maxImageHeight) {\r\n const ratio = props.maxImageHeight / height;\r\n width = width * ratio;\r\n height = height * ratio;\r\n }\r\n\r\n const canvas = cropper?.getCroppedCanvas({ width, height });\r\n canvas?.toBlob(async (blob) => {\r\n if (blob) {\r\n croppedImageUrl.value = URL.createObjectURL(blob);\r\n emit(\"cropped\", croppedImageUrl.value);\r\n showModal.value = false;\r\n\r\n await uploadFile(blob);\r\n\r\n croppedImageUrl.value = \"\";\r\n URL.revokeObjectURL(croppedImageUrl.value);\r\n selectedImageUrl.value = \"\";\r\n selectedImageFileName.value = \"\";\r\n }\r\n });\r\n }\r\n\r\n /** Cancel cropping */\r\n function cancelCrop(): void {\r\n selectedImageUrl.value = \"\";\r\n selectedImageFileName.value = \"\";\r\n }\r\n\r\n // Watch for the drop zone element to become available. Once we have it\r\n // register for the drag and drop events to support dropping a file onto\r\n // the file uploader component.\r\n watch(dropZoneElement, () => {\r\n if (dropZoneElement.value) {\r\n // Register the dragover event so we can indicate that we will\r\n // accept a file dropped on us.\r\n dropZoneElement.value.addEventListener(\"dragover\", event => {\r\n if (!isUploading.value && event.dataTransfer) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n if (event.dataTransfer.items.length === 1 && event.dataTransfer.items[0].kind === \"file\") {\r\n event.dataTransfer.dropEffect = \"copy\";\r\n }\r\n else {\r\n event.dataTransfer.dropEffect = \"none\";\r\n }\r\n }\r\n });\r\n\r\n // Register the drop event so we can begin the upload for the\r\n // file that was dropped on us.\r\n dropZoneElement.value.addEventListener(\"drop\", event => {\r\n if (!isUploading.value && event.dataTransfer && event.dataTransfer.files.length > 0) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n showCropperForSelectedFile(event.dataTransfer.files[0]);\r\n }\r\n });\r\n }\r\n });\r\n\r\n // Watch for changes to the model value and update our internal values.\r\n watch(() => props.modelValue, () => {\r\n fileGuid.value = toGuidOrNull(props.modelValue?.value);\r\n fileName.value = props.modelValue?.text ?? \"\";\r\n });\r\n\r\n // Watch for changes to our internal values and update the model value.\r\n watch([fileGuid, fileName], () => {\r\n let newValue: ListItemBag | null = null;\r\n\r\n if (fileGuid.value) {\r\n newValue = {\r\n value: fileGuid.value,\r\n text: fileName.value\r\n };\r\n }\r\n\r\n emit(\"update:modelValue\", newValue);\r\n });\r\n\r\n watch(imgRef, () => {\r\n if (imgRef.value) {\r\n // Show Image Cropper\r\n cropper = new Cropper(imgRef.value, {\r\n aspectRatio: props.aspectRatio,\r\n viewMode: 1\r\n });\r\n }\r\n else {\r\n // Reset Image Cropper\r\n cropper?.destroy();\r\n cropper = null;\r\n }\r\n });\r\n</script>\r\n"],"names":["imgRef","ref","cropper","fileGuid","toGuidOrNull","_props$modelValue","props","modelValue","value","fileName","_props$modelValue$tex","_props$modelValue2","text","isUploading","uploadProgressText","errorMessage","fileInputElement","dropZoneElement","standardFieldProps","useStandardRockFormFieldProps","showModal","selectedImageFileName","selectedImageUrl","croppedImageUrl","thumbnailUrl","computed","concat","noPictureUrl","thumbnailStyle","backgroundImage","backgroundSize","backgroundPosition","isDeleteVisible","hideDeleteButton","showCropperForSelectedFile","_x","_showCropperForSelectedFile","apply","arguments","_asyncToGenerator","file","url","getUrlForFile","name","_x2","_getUrlForFile","Promise","res","URL","createObjectURL","FileReader","reader","onload","_reader$result$toStri","_reader$result","result","toString","onerror","readAsDataURL","uploadFile","_x3","_uploadFile","fileToUpload","File","type","_result$text","uploadBinaryFile","binaryFileTypeGuid","BinaryFiletype","Default","baseUrl","isTemporary","progress","total","percent","e","String","onSelectFileClick","_fileInputElement$val","click","onRemoveFileClick","onFileChange","files","length","onFileRemove","cropAndUpload","_cropper$getData","_cropper","_cropper2","_ref2","getData","width","height","maxImageWidth","ratio","maxImageHeight","canvas","getCroppedCanvas","toBlob","_ref3","blob","emit","revokeObjectURL","_x4","cancelCrop","watch","addEventListener","event","dataTransfer","stopPropagation","preventDefault","items","kind","dropEffect","_props$modelValue3","_props$modelValue$tex2","_props$modelValue4","newValue","Cropper","aspectRatio","viewMode","_cropper3","destroy"],"mappings":"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"}