Skip to content

Commit 2698f2d

Browse files
committed
feat: single download support for each crop type
added download button on each crop panel
1 parent a86666b commit 2698f2d

File tree

4 files changed

+66
-3
lines changed

4 files changed

+66
-3
lines changed

components/Panel/CropPanel/CropPanel.component.vue

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,15 @@
3737
template(v-if="panel.cropper")
3838
span.crop-panel-footer__label {{ $t('editor.original') }}: {{ panel.cropper.image.width }}x{{ panel.cropper.image.height }}
3939
span.crop-panel-footer__label {{ $t('editor.cropped') }}: {{ panel.cropper.coordinates.width }}x{{ panel.cropper.coordinates.height }}
40+
vs-tooltip(bottom dark not-arrow)
41+
vs-button(flat active dark size="mini" :loading="panel.isBusy" :disabled="panel.isBusy" @click="download({ type })")
42+
AppIcon(name="charm:download")
43+
template(#tooltip)
44+
span {{ $t('general.download') }} ({{ $t(`cropType.${type}.title`) }})
4045
</template>
4146

4247
<script>
43-
import { defineComponent, useStore, ref, reactive, computed, onMounted, onUnmounted } from '@nuxtjs/composition-api'
48+
import { defineComponent, useStore, ref, reactive, computed, onMounted } from '@nuxtjs/composition-api'
4449
import { cropTypeEnum } from '@/enums'
4550
import useEditor from '@/hooks/useEditor'
4651
import { Cropper } from 'vue-advanced-cropper'
@@ -81,15 +86,18 @@ export default defineComponent({
8186
}
8287
},
8388
setup(props) {
89+
const FileSaver = require('file-saver')
90+
8491
const store = useStore()
85-
const { sleep } = useEditor()
92+
const { sleep, getFileExtension } = useEditor()
8693
8794
const cropperRef = ref(null)
8895
8996
const isReady = computed(() => store.getters['editor/isReady'])
9097
const original = computed(() => store.getters['editor/original'])
9198
9299
const panel = reactive({
100+
isBusy: false,
93101
cropper: null
94102
})
95103
@@ -136,13 +144,15 @@ export default defineComponent({
136144
const handleOnChangeCropper = ({ coordinates, image, visibleArea, canvas }) => {
137145
panel.cropper = { coordinates, image, visibleArea, canvas }
138146
147+
panel.isBusy = true
139148
store.commit('editor/SET_IS_BUSY', true)
140149
141150
canvas.toBlob(blob => {
142151
store.commit('editor/SET_CROPPED', { type: props.type, coordinates, file: blob })
143152
}, original.value.file.type)
144153
145154
sleep(1000).then(() => {
155+
panel.isBusy = false
146156
store.commit('editor/SET_IS_BUSY', false)
147157
})
148158
}
@@ -151,6 +161,20 @@ export default defineComponent({
151161
cropperRef.value.zoom(value)
152162
}
153163
164+
const cropped = computed(() => store.getters['editor/cropped'])
165+
166+
const download = ({ type }) => {
167+
store.commit('editor/SET_IS_BUSY', true)
168+
panel.isBusy = true
169+
170+
FileSaver.saveAs(cropped.value[type].file, `image-${cropped.value[type].key}.${getFileExtension(original.value.file.name)}`)
171+
172+
sleep(1000).then(() => {
173+
store.commit('editor/SET_IS_BUSY', false)
174+
panel.isBusy = false
175+
})
176+
}
177+
154178
onMounted(() => {
155179
window.addEventListener('resize', () => {
156180
if (isReady.value) {
@@ -167,7 +191,8 @@ export default defineComponent({
167191
handleOnSelectFreeFormRatio,
168192
getFreeStencilProps,
169193
handleOnReadyCropper,
170-
handleOnChangeCropper
194+
handleOnChangeCropper,
195+
download
171196
}
172197
}
173198
})

locales/en.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,23 @@ export default {
3030
cropped: 'Cropped',
3131
freeform: 'Freeform'
3232
},
33+
cropType: {
34+
original: {
35+
title: 'Original'
36+
},
37+
horizontal: {
38+
title: 'Horizontal'
39+
},
40+
vertical: {
41+
title: 'Vertical'
42+
},
43+
square: {
44+
title: 'Square'
45+
},
46+
free: {
47+
title: 'Free ratio'
48+
}
49+
},
3350
credits: {
3451
description: 'Useful for blog, photo blog, news websites and social media posts.'
3552
}

locales/tr.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,23 @@ export default {
3030
cropped: 'Kırpılmış',
3131
freeform: 'Serbest mod'
3232
},
33+
cropType: {
34+
original: {
35+
title: 'Orijinal'
36+
},
37+
horizontal: {
38+
title: 'Yatay'
39+
},
40+
vertical: {
41+
title: 'Dikey'
42+
},
43+
square: {
44+
title: 'Kare'
45+
},
46+
free: {
47+
title: 'Serbest mod'
48+
}
49+
},
3350
credits: {
3451
description: 'Blog, foto blog, haber siteleri ve sosyal medya postları için kullanışlıdır.'
3552
}

store/editor/getters.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ export default {
1515
return state.original
1616
},
1717

18+
cropped(state) {
19+
return state.cropped
20+
},
21+
1822
horizontalCropped(state) {
1923
return state.cropped.horizontal
2024
},

0 commit comments

Comments
 (0)