190 lines
4.2 KiB
Vue
190 lines
4.2 KiB
Vue
<script>
|
|
import BaseComponent from 'primevue/basecomponent';
|
|
import { useStyle } from 'primevue/usestyle';
|
|
|
|
const styles = `
|
|
.p-fileupload-content {
|
|
position: relative;
|
|
}
|
|
|
|
.p-fileupload-content .p-progressbar {
|
|
width: 100%;
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
}
|
|
|
|
.p-button.p-fileupload-choose {
|
|
position: relative;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.p-fileupload-buttonbar {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.p-fileupload > input[type='file'],
|
|
.p-fileupload-basic input[type='file'] {
|
|
display: none;
|
|
}
|
|
|
|
.p-fluid .p-fileupload .p-button {
|
|
width: auto;
|
|
}
|
|
|
|
.p-fileupload-file {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
align-items: center;
|
|
}
|
|
|
|
.p-fileupload-file-thumbnail {
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.p-fileupload-file-actions {
|
|
margin-left: auto;
|
|
}
|
|
`;
|
|
|
|
const classes = {
|
|
root: ({ props }) => [`p-fileupload p-fileupload-${props.mode} p-component`],
|
|
buttonbar: 'p-fileupload-buttonbar',
|
|
chooseButton: ({ instance, props }) => [
|
|
'p-button p-component p-fileupload-choose',
|
|
{
|
|
'p-fileupload-choose-selected': props.mode === 'basic' && instance.hasFiles,
|
|
'p-disabled': props.disabled,
|
|
'p-focus': instance.focused
|
|
}
|
|
],
|
|
chooseIcon: 'p-button-icon p-button-icon-left',
|
|
chooseButtonLabel: 'p-button-label',
|
|
content: 'p-fileupload-content',
|
|
empty: 'p-fileupload-empty',
|
|
uploadIcon: 'p-button-icon p-button-icon-left',
|
|
label: 'p-button-label',
|
|
file: 'p-fileupload-file',
|
|
thumbnail: 'p-fileupload-file-thumbnail',
|
|
details: 'p-fileupload-file-details',
|
|
fileName: 'p-fileupload-file-name',
|
|
fileSize: 'p-fileupload-file-size',
|
|
badge: 'p-fileupload-file-badge',
|
|
actions: 'p-fileupload-file-actions',
|
|
removeButton: 'p-fileupload-file-remove'
|
|
};
|
|
|
|
const { load: loadStyle } = useStyle(styles, { id: 'primevue_fileupload_style', manual: true });
|
|
|
|
export default {
|
|
name: 'BaseFileUpload',
|
|
extends: BaseComponent,
|
|
props: {
|
|
name: {
|
|
type: String,
|
|
default: null
|
|
},
|
|
url: {
|
|
type: String,
|
|
default: null
|
|
},
|
|
mode: {
|
|
type: String,
|
|
default: 'advanced'
|
|
},
|
|
multiple: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
accept: {
|
|
type: String,
|
|
default: null
|
|
},
|
|
disabled: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
auto: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
maxFileSize: {
|
|
type: Number,
|
|
default: null
|
|
},
|
|
invalidFileSizeMessage: {
|
|
type: String,
|
|
default: '{0}: Invalid file size, file size should be smaller than {1}.'
|
|
},
|
|
invalidFileTypeMessage: {
|
|
type: String,
|
|
default: '{0}: Invalid file type, allowed file types: {1}.'
|
|
},
|
|
fileLimit: {
|
|
type: Number,
|
|
default: null
|
|
},
|
|
invalidFileLimitMessage: {
|
|
type: String,
|
|
default: 'Maximum number of files exceeded, limit is {0} at most.'
|
|
},
|
|
withCredentials: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
previewWidth: {
|
|
type: Number,
|
|
default: 50
|
|
},
|
|
chooseLabel: {
|
|
type: String,
|
|
default: null
|
|
},
|
|
uploadLabel: {
|
|
type: String,
|
|
default: null
|
|
},
|
|
cancelLabel: {
|
|
type: String,
|
|
default: null
|
|
},
|
|
customUpload: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
showUploadButton: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
showCancelButton: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
chooseIcon: {
|
|
type: String,
|
|
default: undefined
|
|
},
|
|
uploadIcon: {
|
|
type: String,
|
|
default: undefined
|
|
},
|
|
cancelIcon: {
|
|
type: String,
|
|
default: undefined
|
|
},
|
|
style: null,
|
|
class: null
|
|
},
|
|
css: {
|
|
classes,
|
|
loadStyle
|
|
},
|
|
provide() {
|
|
return {
|
|
$parentInstance: this
|
|
};
|
|
}
|
|
};
|
|
</script>
|