guns/guns-front-project/src/components/CropperModal/index.vue

175 lines
3.4 KiB
Vue

<template>
<!-- 新增编辑 -->
<a-modal
:width="props.width"
:maskClosable="false"
:visible="props.visible"
:confirm-loading="loading"
:forceRender="true"
:title="props.title"
:body-style="{ padding: '16px 18px 18px 18px' }"
@update:visible="updateVisible"
footer=""
@close="updateVisible(false)"
>
<!-- 裁剪 -->
<guns-cropper v-bind="props" @done="done" :ok-text="props.okText" v-if="props.visible"/>
</a-modal>
</template>
<script setup name="CropperModal">
import { ref } from 'vue';
import GunsCropper from './components/cropper.vue';
const props = defineProps({
visible: Boolean,
//
title: {
type: String,
default: ''
},
//
width: {
type: String,
default: '660px'
},
//
src: String,
// , : 'image/jpeg'
imageType: {
type: String,
default: 'image/png'
},
//
accept: {
type: String,
default: 'image/*'
},
//
tools: {
type: String,
default: ['zoomIn,zoomOut', 'moveL,moveR,moveT,moveB', 'rotateL,rotateR', 'scaleX,scaleY', 'reset,upload', 'crop'].join(' | ')
},
//
showPreview: {
type: Boolean,
default: true
},
//
previewWidth: {
type: Number,
default: 120
},
//
okText: {
type: String,
defalut: ''
},
// blob
toBlob: {
type: Boolean,
defalut: false
},
// cropperjs
options: {
type: Object,
defalut: {}
},
// cropperjs
croppedOptions: {
type: Object,
defalut: {}
},
//------------------------
//
aspectRatio: {
type: Number,
default: 1
},
//
viewMode: {
type: Number,
default: 0
},
//
dragMode: {
type: String,
default: 'crop'
},
//
initialAspectRatio: Number,
//
minContainerWidth: {
type: Number,
default: 200
},
//
minContainerHeight: {
type: Number,
default: 100
},
//
minCanvasWidth: {
type: Number,
default: 0
},
//
minCanvasHeight: {
type: Number,
default: 0
},
//
minCropBoxWidth: {
type: Number,
default: 0
},
//
minCropBoxHeight: {
type: Number,
default: 0
},
//
croppedWidth: Number,
//
croppedHeight: Number,
//
croppedMinWidth: {
type: Number,
default: 0
},
//
croppedMinHeight: {
type: Number,
default: 0
},
//
croppedMaxWidth: Number,
//
croppedMaxHeight: Number,
//
croppedFillColor: {
type: String,
default: 'transparent'
},
//
imageSmoothingEnabled: Boolean,
//
imageSmoothingQuality: String
});
const emits = defineEmits(['update:visible', 'done']);
//
const loading = ref(false);
//
const updateVisible = value => {
emits('update:visible', value);
};
/* 裁剪完成 */
const done = result => {
emits('done', result);
};
</script>
<style></style>