{"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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"}