Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
chamilo-lms/assets/vue/components/documents/FormUpload.vue

140 lines
3.1 KiB

<template>
<b-form>
<b-row>
<b-col
cols="12"
sm="6"
md="6"
>
<!-- v-model="item.uploadFile"-->
<!-- <b-form-file-->
<!-- ref="fileList"-->
<!-- multiple-->
<!-- @change="selectFile"-->
<!-- />-->
<div class="input-group mb-3">
<div class="custom-file">
<input
id="file_upload"
type="file"
class="custom-file-input"
ref="fileList"
multiple
placeholder="File upload"
@change="selectFile"
/>
<label
class="custom-file-label"
for="file_upload"
aria-describedby="File upload">
Choose file
</label>
</div>
</div>
<div class="field">
<div
v-for="(file, index) in files"
:key="index"
:class="{ error : file.invalidMessage}"
>
<div>
{{ file.name }}
<span v-if="file.invalidMessage">
- {{ file.invalidMessage }}
</span>
<span>
<a @click.prevent="files.splice(index, 1)"
class="delete"
>
<font-awesome-icon icon="trash" />
</a>
</span>
</div>
</div>
</div>
</b-col>
</b-row>
</b-form>
</template>
<script>
import has from 'lodash/has';
import map from 'lodash/map';
import { validationMixin } from 'vuelidate';
import { required } from 'vuelidate/lib/validators';
import { mapActions } from 'vuex';
import { mapFields } from 'vuex-map-fields';
export default {
name: 'DocumentsFormUpload',
mixins: [validationMixin],
props: {
values: {
type: Array,
required: true
},
parentResourceNodeId: {
type: Number
},
resourceLinkList: {
type: String,
},
errors: {
type: Object,
default: () => {}
}
},
data() {
return {
fileList:[],
files: [],
};
},
computed: {
titleErrors() {
const errors = [];
if (!this.$v.item.title.$dirty) return errors;
has(this.violations, 'title') && errors.push(this.violations.title);
!this.$v.item.title.required && errors.push(this.$t('Field is required'));
return errors;
},
violations() {
return this.errors || {};
}
},
methods: {
selectFile() {
const files = this.$refs.fileList.files;
this.files = [
...this.files,
...map(files, file => ({
name: file.name,
size: file.size,
type: file.type,
filetype: 'file',
parentResourceNodeId: this.parentResourceNodeId,
resourceLinkList: this.resourceLinkList,
uploadFile: file,
invalidMessage: this.validate(file),
}))
]
},
validate(file) {
if (file) {
return '';
}
return 'error';
}
},
validations: {
files: {}
}
};
</script>