Vue

by Annisa_Lianda30

HTML

<div id="app">
  <div class="py-4 bg-white rounded-sv-xl">
    <div class="card card-custom mt-2 mb-5">
      <div class="title position-absolute d-sm-block d-md-flex d-lg-flex ml-3">
        <div class="px-3 mt-4">
          <div class="border border-1 border-neutral-40 rounded-sv-lg position-relative mt-2">
            <div class="card-body p-3">
              <div class="row">
                <div class="d-flex">
                  <div class="icon-report-label">
                    <div class="rounded-sv-md p-3 bg-brown-surface d-inline-flex">
                      <i width="24" class="fa fa-info-circle text-brown-main"></i>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
        <div class="col-12 mt-3 p-0">
          <div class="d-sm-block d-md-flex d-lg-flex flex-wrap">
            <!-- preview -->
            <div class="mt-3 mx-lg-3 mx-auto position-relative photo-lg photo rounded-sv-sm" v-for="(img, key) in crudData.arrImage" :key="key" :style="{ 'background-image': `url(${img.blob})` }">
              <input class="position-absolute ml-2 mt-2 rounded-sv-xs shadow-brown-focus" type="checkbox" v-model="img.checked">
              <span class="float-right mr-2 mt-2 btn btn-sv-red btn-sm py-1 px-2 fa fa-trash-alt" @click="removeProperty(key)"></span>
              <div class="position-absolute d-block bottom-0 mb-3 px-2 w-100">
                <input class="form-control form-control-sm border border-1 border-neutral-30" placeholder="Input Name" v-model="img.name" type="text" required>
              </div>
            </div>
            <!-- uploader -->
            <div class="photo-lg photo mt-3 mx-md-3 mx-auto border border-1 rounded-sv-sm bg-neutral-white cursor-pointer" @click="uploadImageProperty()">
              <div class="d-block">
                <div class="font-icon-sv-xxl mt-5 pt-3 text-brown-main"><i class="fa fa-image text-center...

CSS

body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

#check{
  margin-bottom: 10px;
}
#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
}

.photo {
    background-size: cover;
    background-repeat: no-repeat
}

.photo-xl {
    width: 400px;
    height: 400px;
}

.photo-lg {
    width: 237px;
    height: 237px;
}

.photo-md {
    width: 100px;
    height: 100px;
}

.photo-sm{
    width: 48px;
    height: 48px;
}

.photo-xs{
    width: 40px;
    height: 40px;
}

Vue

new Vue({
	el: "#app",
	data() {
		return {
			datas: [],
			axiosRespon: null,
			crudData: {
				id: null,
				name: [],
				image: [],
				arrImage: [],
				url: "property",
				toRoute: "property",
				action: null,
			},
			data: {
				imageFiles:[],
				names:[]
			}
		};
	},
	methods: {
		propertyImageUpload(e, maxItem) {
			let input = this.$refs.uploadProperty;
			let file = input.files;
			if (file.length > maxItem - this.crudData.arrImage.length) {
				$("#uploadMultiFile").val("");
				alert("You can only upload max " + maxItem + " items");
			} else {
				for (let i = 0; i < file.length; i++) {
					var valueArr = this.crudData.arrImage.map(function (item) {
						return item.fileName;
					});
					var isDuplicate = valueArr.some(function (item, idx) {
						return item == file[i].name;
					});
					if (isDuplicate) {
						alert("You've already uploaded this file");
						continue;
					} else {
						var arrImg = {
							blob: URL.createObjectURL(file[i]),
							image: file[i],
							fileName: file[i].name,
							checked: false,
							name: null,
						};
						this.crudData.arrImage.push(arrImg);
						// console.log(this.crudData.arrImage);
					}
				}
			}
      propertyImageUpload(e, maxItem){                    
                let input = this.$refs.uploadProperty
                let file = input.files
                if(file.length > (maxItem - this.crudData.arrImage.length)){
                    $('#uploadMultiFile').val('')
                    alert('You can only upload max '+maxItem+' items')
                } else {
                    for(let i = 0; i < file.length; i++){
                        var valueArr = this.crudData.arrImage.map(function(item){ return item.fileName })
                        var isDuplicate = valueArr.some(function(item, idx){ 
                            return item == file[i].name 
                        })
                        if (isDuplicate) {
                            alert("You've already...