From 13725f040bca346a7b35b832f36f4e86c5da11e4 Mon Sep 17 00:00:00 2001 From: taehoon Date: Thu, 7 Feb 2019 03:05:59 -0500 Subject: Add avatar crop popup --- src/components/image_cropper/image_cropper.js | 88 +++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 src/components/image_cropper/image_cropper.js (limited to 'src/components/image_cropper/image_cropper.js') diff --git a/src/components/image_cropper/image_cropper.js b/src/components/image_cropper/image_cropper.js new file mode 100644 index 00000000..e4bf5ea2 --- /dev/null +++ b/src/components/image_cropper/image_cropper.js @@ -0,0 +1,88 @@ +import Cropper from 'cropperjs' +import Modal from '../modal/modal.vue' +import 'cropperjs/dist/cropper.css' + +const ImageCropper = { + props: { + trigger: { + type: [String, Element], + required: true + }, + cropperOptions: { + type: Object, + default () { + return { + aspectRatio: 1, + autoCropArea: 1, + viewMode: 1, + movable: false, + zoomable: false, + guides: false + } + } + }, + mimes: { + type: String, + default: 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon' + }, + title: { + type: String, + default: 'Crop picture' + }, + saveButtonLabel: { + type: String, + default: 'Save' + } + }, + data () { + return { + cropper: undefined, + dataUrl: undefined, + filename: undefined + } + }, + components: { + Modal + }, + methods: { + destroy () { + this.cropper.destroy() + this.$refs.input.value = '' + this.dataUrl = undefined + }, + submit () { + this.$emit('submit', this.cropper, this.filename) + this.destroy() + }, + pickImage () { + this.$refs.input.click() + }, + createCropper () { + this.cropper = new Cropper(this.$refs.img, this.cropperOptions) + } + }, + mounted () { + // listen for click event on trigger + let trigger = typeof this.trigger === 'object' ? this.trigger : document.querySelector(this.trigger) + if (!trigger) { + this.$emit('error', 'No image make trigger found.', 'user') + } else { + trigger.addEventListener('click', this.pickImage) + } + // listen for input file changes + let fileInput = this.$refs.input + fileInput.addEventListener('change', () => { + if (fileInput.files != null && fileInput.files[0] != null) { + let reader = new FileReader() + reader.onload = (e) => { + this.dataUrl = e.target.result + } + reader.readAsDataURL(fileInput.files[0]) + this.filename = fileInput.files[0].name || 'unknown' + this.$emit('changed', fileInput.files[0], reader) + } + }) + } +} + +export default ImageCropper -- cgit v1.2.3-70-g09d2 From 228e6681e3fd4a16d08d96edb9eea21d64be5600 Mon Sep 17 00:00:00 2001 From: taehoon Date: Fri, 8 Feb 2019 11:42:02 -0500 Subject: Localization of ImageCropper component --- src/components/image_cropper/image_cropper.js | 14 ++++++++++---- src/components/image_cropper/image_cropper.vue | 4 ++-- src/i18n/en.json | 4 ++++ 3 files changed, 16 insertions(+), 6 deletions(-) (limited to 'src/components/image_cropper/image_cropper.js') diff --git a/src/components/image_cropper/image_cropper.js b/src/components/image_cropper/image_cropper.js index e4bf5ea2..86bd2d67 100644 --- a/src/components/image_cropper/image_cropper.js +++ b/src/components/image_cropper/image_cropper.js @@ -26,12 +26,10 @@ const ImageCropper = { default: 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon' }, title: { - type: String, - default: 'Crop picture' + type: String }, saveButtonLabel: { - type: String, - default: 'Save' + type: String } }, data () { @@ -44,6 +42,14 @@ const ImageCropper = { components: { Modal }, + computed: { + modalTitle () { + return this.title || this.$t('image_cropper.crop_picture') + }, + modalSaveButtonLabel () { + return this.saveButtonLabel || this.$t('image_cropper.save') + } + }, methods: { destroy () { this.cropper.destroy() diff --git a/src/components/image_cropper/image_cropper.vue b/src/components/image_cropper/image_cropper.vue index 1c52842c..b2367128 100644 --- a/src/components/image_cropper/image_cropper.vue +++ b/src/components/image_cropper/image_cropper.vue @@ -1,13 +1,13 @@