İmport page design
This commit is contained in:
		
							
								
								
									
										252
									
								
								resources/assets/js/components/AkauntingImport.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										252
									
								
								resources/assets/js/components/AkauntingImport.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,252 @@
 | 
			
		||||
<template>
 | 
			
		||||
    <div :id="'dropzone-' + _uid" class="dropzone dropzone-single dz-clickable group w-full">
 | 
			
		||||
        <div class="fallback">
 | 
			
		||||
            <div class="custom-file">
 | 
			
		||||
                <input type="file" class="custom-file-input" :id="'projectCoverUploads' + _uid">
 | 
			
		||||
 | 
			
		||||
                <label class="custom-file-label" :for="'projectCoverUploads' + _uid">
 | 
			
		||||
                    {{ textChooseFile }}
 | 
			
		||||
                </label>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="dz-preview dz-preview-single" :class="previewClasses" ref="previewSingle">
 | 
			
		||||
            <div class="dz-preview-cover dz-default dz-preview-message flex flex-col">
 | 
			
		||||
                <div class="dz-import">
 | 
			
		||||
                    <div class="dz-import-icon relative">
 | 
			
		||||
                        <span class="material-icons-outlined text-default text-7xl">file_copy</span>
 | 
			
		||||
 | 
			
		||||
                        <button data-dz-remove="true" class="absolute z-10 right-18 top-0 hidden group-hover:flex bg-body">
 | 
			
		||||
                            <span class="material-icons-outlined text-gray-300 text-8xl">cancel</span>
 | 
			
		||||
                        </button>
 | 
			
		||||
                    </div>
 | 
			
		||||
 | 
			
		||||
                    <div class="relative h-12">
 | 
			
		||||
                        <p class="absolute dz-import-upload z-10" data-dz-name>...</p>
 | 
			
		||||
 | 
			
		||||
                        <p class="dz-import-text pt-6" v-html="textExtensionAndLimitationFile"></p>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
 | 
			
		||||
                <div class="w-full h-2 bg-purple-100 rounded-b-md -bottom-1 absolute group-hover:hidden">
 | 
			
		||||
                    <div class="w-0 h-2 bg-default rounded-b-md progress"></div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="dz-default dz-message flex flex-col">
 | 
			
		||||
            <div class="dz-import">
 | 
			
		||||
                <div class="dz-import-icon">
 | 
			
		||||
                    <span class="material-icons-outlined text-7xl" :class="(files.length) ? 'text-default opacity-0' : ''">file_copy</span>
 | 
			
		||||
                </div>
 | 
			
		||||
 | 
			
		||||
                <div>
 | 
			
		||||
                    <p class="dz-import-upload" :class="(files.length) ? 'opacity-0' : ''" v-html="textDropFile"></p>
 | 
			
		||||
 | 
			
		||||
                    <p class="dz-import-text" v-html="textExtensionAndLimitationFile"></p>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import Dropzone from 'dropzone';
 | 
			
		||||
 | 
			
		||||
Dropzone.autoDiscover = false;
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
    name: 'akaunting-import',
 | 
			
		||||
 | 
			
		||||
    props: {
 | 
			
		||||
        textDropFile: {
 | 
			
		||||
            type: String,
 | 
			
		||||
            default: '<span style="color: #006EA6;">Upload a file</span> or drag and drop',
 | 
			
		||||
            description: 'Drop file text'
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        textExtensionAndLimitationFile: {
 | 
			
		||||
            type: String,
 | 
			
		||||
            default: '<span>XLS or XLSX</span> up to <span>500 rows</span>',
 | 
			
		||||
            description: 'Drop message text'
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        textChooseFile: {
 | 
			
		||||
            type: String,
 | 
			
		||||
            default: 'Choose File',
 | 
			
		||||
            description: 'Choose file text'
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        options: {
 | 
			
		||||
            type: [Object, Array],
 | 
			
		||||
            default: () => ({})
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        value: [String, Object, Array, File],
 | 
			
		||||
 | 
			
		||||
        url: {
 | 
			
		||||
            type: String,
 | 
			
		||||
            default: 'http:'
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        previewClasses: [String, Object, Array],
 | 
			
		||||
 | 
			
		||||
        attachments: {
 | 
			
		||||
            type: Array,
 | 
			
		||||
            default: () => ([])
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    model: {
 | 
			
		||||
        prop: 'value',
 | 
			
		||||
        event: 'change'
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    data() {
 | 
			
		||||
        return {
 | 
			
		||||
            files: [],
 | 
			
		||||
            configurations: this.options,
 | 
			
		||||
            progress:0,
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    methods: {
 | 
			
		||||
        async initDropzone() {
 | 
			
		||||
            let self = this;
 | 
			
		||||
            let preview = this.$refs.previewSingle;
 | 
			
		||||
 | 
			
		||||
            if (this.configurations.maxFiles === undefined) {
 | 
			
		||||
                this.configurations.maxFiles = 1;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (this.configurations.acceptedFiles === undefined) {
 | 
			
		||||
                this.configurations.acceptedFiles = 'image/*';
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            let finalOptions = {
 | 
			
		||||
                ...self.configurations,
 | 
			
		||||
                url: this.url,
 | 
			
		||||
                previewsContainer: preview,
 | 
			
		||||
                previewTemplate: preview.innerHTML,
 | 
			
		||||
                dictDefaultMessage: this.textDropFile,
 | 
			
		||||
                autoProcessQueue: false,
 | 
			
		||||
 | 
			
		||||
                init: function () {
 | 
			
		||||
                    let dropzone = this;
 | 
			
		||||
 | 
			
		||||
                    dropzone.on('addedfile', function (file) {
 | 
			
		||||
                        self.pushProgressbar();
 | 
			
		||||
 | 
			
		||||
                        self.files.push(file);
 | 
			
		||||
 | 
			
		||||
                        if (self.configurations.maxFiles == 1) {
 | 
			
		||||
                            self.$emit('change', file);
 | 
			
		||||
                        } else {
 | 
			
		||||
                            self.$emit('change', self.files);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        self.onMaxFilesReached(self);
 | 
			
		||||
                    }),
 | 
			
		||||
 
 | 
			
		||||
                    dropzone.on('removedfile', function (file) {
 | 
			
		||||
                        let index = self.files.findIndex(f => f.name === file.name)
 | 
			
		||||
 | 
			
		||||
                        if (index !== -1) {
 | 
			
		||||
                            self.files.splice(index, 1);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        self.$emit('change', self.files);
 | 
			
		||||
 | 
			
		||||
                        self.resetProgressBar();
 | 
			
		||||
                    }),
 | 
			
		||||
 | 
			
		||||
                    dropzone.on('maxfilesexceeded', function(file) {
 | 
			
		||||
                        this.removeAllFiles('notCancel');
 | 
			
		||||
                        this.addFile(file);
 | 
			
		||||
                    }),
 | 
			
		||||
 | 
			
		||||
                    dropzone.on('maxfilesreached', function(file) {
 | 
			
		||||
                        //
 | 
			
		||||
                    })
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            this.dropzone = new Dropzone(this.$el, finalOptions);
 | 
			
		||||
 | 
			
		||||
            preview.innerHTML = '';
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        onMaxFilesReached(arg) {
 | 
			
		||||
            if (arg.attachments.length == 1) {
 | 
			
		||||
                arg.$nextTick(() => {
 | 
			
		||||
                    document.querySelector("#dropzone-" + arg._uid).classList.add("dz-max-files-reached");
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        async pushProgressbar() {
 | 
			
		||||
            if (this.progress == 0) {
 | 
			
		||||
                var elem = document.querySelector(".progress");
 | 
			
		||||
                var width = 1;
 | 
			
		||||
                var id = setInterval(frame, 2);
 | 
			
		||||
                var self = this;
 | 
			
		||||
 | 
			
		||||
                function frame() {
 | 
			
		||||
                    if (width >= 100) {
 | 
			
		||||
                        self.progress = 1;
 | 
			
		||||
 | 
			
		||||
                        clearInterval(id);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        width++;
 | 
			
		||||
 | 
			
		||||
                        elem.style.width = width + "%";
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        async resetProgressBar() {
 | 
			
		||||
            this.progress = 0;
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    async mounted() {
 | 
			
		||||
        this.initDropzone();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    watch: {
 | 
			
		||||
        progress: function(new_value) {
 | 
			
		||||
            this.progress = new_value;
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        attachments: function (attachments) {
 | 
			
		||||
            attachments.forEach((attachment) => {
 | 
			
		||||
                if (attachment.length != undefined) {
 | 
			
		||||
                    var mockFile = {
 | 
			
		||||
                        id: attachment[0].id,
 | 
			
		||||
                        name: attachment[0].name,
 | 
			
		||||
                        size: attachment[0].size,
 | 
			
		||||
                        type: attachment[0].type,
 | 
			
		||||
                        download: attachment[0].downloadPath,
 | 
			
		||||
                        dropzone: 'edit',
 | 
			
		||||
                    };
 | 
			
		||||
 | 
			
		||||
                    this.dropzone.emit("addedfile", mockFile);
 | 
			
		||||
                    this.dropzone.options.thumbnail.call(this.dropzone, mockFile, attachment[0].path);
 | 
			
		||||
 | 
			
		||||
                    // Make sure that there is no progress bar, etc...
 | 
			
		||||
                    this.dropzone.emit("complete", mockFile);
 | 
			
		||||
 | 
			
		||||
                    this.onMaxFilesReached(this);
 | 
			
		||||
                }
 | 
			
		||||
            }, this);
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style>
 | 
			
		||||
    .avatar.hidden {
 | 
			
		||||
        display: none;
 | 
			
		||||
    }
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										2
									
								
								resources/assets/js/mixins/global.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								resources/assets/js/mixins/global.js
									
									
									
									
										vendored
									
									
								
							@@ -24,6 +24,7 @@ import AkauntingConnectTransactions from './../components/AkauntingConnectTransa
 | 
			
		||||
import AkauntingSwitch from './../components/AkauntingSwitch';
 | 
			
		||||
import AkauntingSlider from './../components/AkauntingSlider';
 | 
			
		||||
import AkauntingColor from './../components/AkauntingColor';
 | 
			
		||||
import AkauntingImport from './../components/AkauntingImport';
 | 
			
		||||
import CardForm from './../components/CreditCard/CardForm';
 | 
			
		||||
 | 
			
		||||
import NProgress from 'nprogress';
 | 
			
		||||
@@ -79,6 +80,7 @@ export default {
 | 
			
		||||
        AkauntingSwitch,
 | 
			
		||||
        AkauntingSlider,
 | 
			
		||||
        AkauntingColor,
 | 
			
		||||
        AkauntingImport,
 | 
			
		||||
        CardForm,
 | 
			
		||||
        [Select.name]: Select,
 | 
			
		||||
        [Option.name]: Option,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user