Skip to content

Commit eb65e47

Browse files
committed
Parametrize upload mixin as provider component ♻️
1 parent 60ae99b commit eb65e47

File tree

9 files changed

+81
-56
lines changed

9 files changed

+81
-56
lines changed

client/api/asset.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@ const urls = {
55
};
66

77
function getUrl(folder, key) {
8-
const params = { key: `${folder}/${key}` };
8+
const params = { key: folder ? `${folder}/${key}` : key };
99
return request.get(urls.base, { params }).then(res => res.data.url);
1010
}
1111

12-
function upload(folder, data) {
13-
if (folder) data.append('folder', folder);
12+
function upload(data) {
1413
return request.post(urls.base, data).then(res => res.data);
1514
}
1615

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,56 @@
11
<template>
2-
<form @submit.prevent>
3-
<v-file-input
4-
v-if="!fileKey"
5-
:ref="id"
6-
@change.native="upload"
7-
@click:append="$refs[id].$el.querySelector('input').click()"
8-
:accept="acceptedFileTypes"
9-
:label="label"
10-
:placeholder="placeholder"
11-
:outlined="outlined"
12-
:dense="dense"
13-
:clearable="false"
14-
:append-icon="uploading ? 'mdi-loading mdi-spin' : 'mdi-upload'"
15-
prepend-icon="" />
16-
<div v-else class="mb-5 px-1 grey--text text--darken-3">
17-
<div>{{ label }}</div>
18-
<v-btn
19-
@click="downloadFile(fileKey, fileName)"
20-
text
21-
class="grey--text text--darken-4 text-none px-0">
22-
{{ fileName | truncate(35) }}
23-
</v-btn>
24-
<v-btn
25-
@click="deleteFile({ id, fileName })"
26-
color="grey darken-4"
27-
icon x-small
28-
class="ml-1">
29-
<v-icon>mdi-close</v-icon>
30-
</v-btn>
31-
</div>
32-
</form>
2+
<upload-provider
3+
v-slot="{ uploading, uploadFile, downloadFile, deleteFile }"
4+
@upload="$emit('upload', $event)"
5+
@uploading="$emit('update:uploading', $event)"
6+
@delete="$emit('delete', $event)"
7+
:folder="folder">
8+
<form @submit.prevent>
9+
<v-file-input
10+
v-if="!fileKey"
11+
:ref="id"
12+
@change.native="uploadFile"
13+
@click:append="$refs[id].$el.querySelector('input').click()"
14+
:accept="acceptedFileTypes"
15+
:label="label"
16+
:placeholder="placeholder"
17+
:outlined="outlined"
18+
:dense="dense"
19+
:clearable="false"
20+
:append-icon="uploading ? 'mdi-loading mdi-spin' : 'mdi-upload'"
21+
prepend-icon="" />
22+
<div v-else class="mb-5 px-1 grey--text text--darken-3">
23+
<div>{{ label }}</div>
24+
<v-btn
25+
@click="downloadFile(fileKey, fileName)"
26+
text
27+
class="grey--text text--darken-4 text-none px-0">
28+
{{ fileName | truncate(35) }}
29+
</v-btn>
30+
<v-btn
31+
@click="deleteFile({ id, fileName })"
32+
color="grey darken-4"
33+
icon x-small
34+
class="ml-1">
35+
<v-icon>mdi-close</v-icon>
36+
</v-btn>
37+
</div>
38+
</form>
39+
</upload-provider>
3340
</template>
3441

3542
<script>
3643
import get from 'lodash/get';
3744
import uniqueId from 'lodash/uniqueId';
38-
import uploadMixin from '@/components/common/mixins/upload';
45+
import UploadProvider from '@/components/common/mixins/UploadProvider';
3946
4047
export default {
4148
name: 'file-input',
42-
mixins: [uploadMixin],
4349
props: {
4450
id: { type: String, default: () => uniqueId('file_') },
4551
fileKey: { type: String, default: '' },
4652
fileName: { type: String, default: '' },
53+
folder: { type: String, default: null },
4754
validate: { type: Object, default: () => ({ ext: [] }) },
4855
label: { type: String, default: 'File upload' },
4956
placeholder: { type: String, default: 'Choose a file' },
@@ -56,10 +63,6 @@ export default {
5663
return ext.length ? `.${ext.join(',.')}` : '';
5764
}
5865
},
59-
watch: {
60-
uploading(val) {
61-
this.$emit('update:uploading', val);
62-
}
63-
}
66+
components: { UploadProvider }
6467
};
6568
</script>

client/components/common/InputAsset.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
:uploading.sync="uploading"
1616
:validate="{ ext: extensions }"
1717
:confirm-deletion="false"
18+
:folder="folder"
1819
:label="uploadLabel"
1920
class="upload-btn" />
2021
<template v-if="file">
@@ -93,6 +94,7 @@ function isUploaded(url) {
9394
export default {
9495
name: 'input-asset',
9596
props: {
97+
folder: { type: String, default: null },
9698
url: { type: String, default: null },
9799
publicUrl: { type: String, default: null },
98100
extensions: { type: Array, required: true },

client/components/common/mixins/upload.js renamed to client/components/common/mixins/UploadProvider.vue

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,33 @@
1+
<template>
2+
<div>
3+
<slot v-bind="{ uploading, uploadFile, downloadFile, deleteFile }"></slot>
4+
</div>
5+
</template>
6+
7+
<script>
18
import downloadMixin from 'utils/downloadMixin';
29
import loader from '@/components/common/loader';
3-
import { mapGetters } from 'vuex';
410
import { mapRequests } from '@/plugins/radio';
511
612
export default {
713
inject: ['$storageService'],
814
mixins: [downloadMixin],
15+
props: {
16+
folder: { type: String, default: null }
17+
},
918
data: () => ({ uploading: false }),
10-
computed: mapGetters('repository', { repositoryId: 'id' }),
1119
methods: {
1220
...mapRequests('app', ['showConfirmationModal']),
1321
createFileForm(e) {
1422
this.form = new FormData();
1523
const [file] = e.target.files;
1624
if (!file) return;
1725
this.form.append('file', file, file.name);
26+
if (this.folder) this.form.append('folder', this.folder);
1827
},
19-
upload: loader(function (e) {
28+
uploadFile: loader(function (e) {
2029
this.createFileForm(e);
21-
const folder = `repository/${this.repositoryId}`;
22-
return this.$storageService.upload(folder, this.form)
30+
return this.$storageService.upload(this.form)
2331
.then(data => {
2432
const { name } = this.form.get('file');
2533
this.$emit('upload', { ...data, name });
@@ -38,5 +46,11 @@ export default {
3846
action: () => this.$emit('delete', item.id, null)
3947
});
4048
}
49+
},
50+
watch: {
51+
uploading(val) {
52+
this.$emit('uploading', val);
53+
}
4154
}
4255
};
56+
</script>;

client/components/common/tce-core/UploadBtn.vue

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
<template>
2-
<div class="file-upload">
2+
<upload-provider
3+
v-slot="{ uploading, downloadFile, deleteFile }"
4+
ref="provider"
5+
@upload="$emit('upload', $event)"
6+
@uploading="$emit('update:uploading', $event)"
7+
@delete="$emit('delete', $event)"
8+
:folder="folder"
9+
class="file-upload">
310
<form @submit.prevent class="upload-form">
411
<validation-provider ref="validator" :rules="validate">
512
<input
@@ -32,35 +39,31 @@
3239
<v-icon>mdi-delete</v-icon>
3340
</v-btn>
3441
</form>
35-
</div>
42+
</upload-provider>
3643
</template>
3744

3845
<script>
3946
import uniqueId from 'lodash/uniqueId';
40-
import uploadMixin from '@/components/common/mixins/upload';
47+
import UploadProvider from '@/components/common/mixins/UploadProvider';
4148
4249
export default {
4350
name: 'upload-btn',
44-
mixins: [uploadMixin],
4551
props: {
4652
id: { type: String, default: () => uniqueId('file_') },
4753
fileName: { type: String, default: '' },
4854
fileKey: { type: String, default: '' },
55+
folder: { type: String, default: null },
4956
validate: { type: Object, default: () => ({ ext: [] }) },
5057
label: { type: String, default: 'Choose a file' },
5158
sm: { type: Boolean, default: false }
5259
},
5360
methods: {
5461
async validateAndUpload(e) {
5562
const { valid } = await this.$refs.validator.validate(e);
56-
if (valid) this.upload(e);
63+
if (valid) this.$refs.provider.uploadFile(e);
5764
}
5865
},
59-
watch: {
60-
uploading(val) {
61-
this.$emit('update:uploading', val);
62-
}
63-
}
66+
components: { UploadProvider }
6467
};
6568
</script>
6669

client/components/content-elements/tce-audio/edit/Toolbar.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<v-toolbar-title class="pl-1">Audio Component</v-toolbar-title>
77
<input-asset
88
@input="save"
9+
:folder="`repository/${element.repositoryId}`"
910
:url="url"
1011
:public-url="publicUrl"
1112
:extensions="[

client/components/content-elements/tce-image/edit/Toolbar.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
<v-toolbar-items class="mx-auto">
88
<upload-btn
99
@change="upload"
10+
:folder="`repository/${element.repositoryId}`"
1011
:label="isUploaded ? 'Upload a new image' : 'Upload image'" />
1112
<template v-if="isUploaded">
1213
<v-btn @click="toggleTool('cropper')" text>

client/components/content-elements/tce-pdf/edit/Toolbar.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<v-toolbar-title>PDF Component</v-toolbar-title>
77
<input-asset
88
@input="save"
9+
:folder="`repository/${element.repositoryId}`"
910
:url="url"
1011
:public-url="publicUrl"
1112
:extensions="['.pdf']"

client/components/content-elements/tce-video/edit/Toolbar.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<v-toolbar-title class="pl-1">Video component</v-toolbar-title>
77
<input-asset
88
@input="save"
9+
:folder="`repository/${element.repositoryId}`"
910
:url="url"
1011
:public-url="publicUrl"
1112
:extensions="['.mp4']"

0 commit comments

Comments
 (0)