330 lines
8.3 KiB
Vue
330 lines
8.3 KiB
Vue
|
<template>
|
||
|
<div class="container">
|
||
|
<the-content-loading v-if="fetchingData"></the-content-loading>
|
||
|
<div v-else>
|
||
|
<form class="section-form" role="section" @submit.prevent="save()">
|
||
|
<div class="form-group">
|
||
|
<label for="title">عنوان</label>
|
||
|
<input
|
||
|
type="text"
|
||
|
class="form-control"
|
||
|
id="title"
|
||
|
name="title"
|
||
|
v-model="form?._source.title"
|
||
|
/>
|
||
|
</div>
|
||
|
|
||
|
<div class="form-group">
|
||
|
<label for="title">عکس</label>
|
||
|
<div class="form-group">
|
||
|
<div
|
||
|
class="image-uploader-container"
|
||
|
:class="{ 'hide-preview': hasImage }"
|
||
|
>
|
||
|
<image-uploader
|
||
|
ref="file-uploader"
|
||
|
:preview="true"
|
||
|
:debug="1"
|
||
|
:maxWidth="300"
|
||
|
:maxHeight="300"
|
||
|
:maxSize="2"
|
||
|
:quality="1"
|
||
|
:autoRotate="true"
|
||
|
outputFormat="file"
|
||
|
accept="image/*"
|
||
|
:className="['fileinput', { 'fileinput--loaded': hasImage }]"
|
||
|
:capture="false"
|
||
|
@input="setImage"
|
||
|
>
|
||
|
<label class="upload-label" for="fileInput" slot="upload-label">
|
||
|
<img
|
||
|
v-if="
|
||
|
form?._source.attachment &&
|
||
|
form?._source.attachment[0].link?.length &&
|
||
|
(getFileExtension(form?._source.attachment[0].link) ==
|
||
|
'png' ||
|
||
|
getFileExtension(form?._source.attachment[0].link) ==
|
||
|
'jpg' ||
|
||
|
getFileExtension(form?._source.attachment[0].link) ==
|
||
|
'jpeg')
|
||
|
"
|
||
|
:src="imageBaseUrl + form?._source.attachment[0].link"
|
||
|
class="img-fluid"
|
||
|
:alt="form?._source.attachment[0].link"
|
||
|
/>
|
||
|
|
||
|
<span
|
||
|
v-else-if="
|
||
|
form?._source.attachment &&
|
||
|
form?._source.attachment[0].link?.length
|
||
|
"
|
||
|
class="tavasi"
|
||
|
:class="`tavasi-${getFileExtension(
|
||
|
form?._source.attachment[0].link
|
||
|
)}-file`"
|
||
|
></span>
|
||
|
|
||
|
<!-- replace image src with incoming src -->
|
||
|
|
||
|
<span v-else class="tavasi tavasi-cloud-upload"></span>
|
||
|
</label>
|
||
|
</image-uploader>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div class="form-group">
|
||
|
<label for="title">متن</label>
|
||
|
<my-quill
|
||
|
ref="quill-editor"
|
||
|
:parentButtonLoading="buttonLoading"
|
||
|
:tinyText="form?._source.description"
|
||
|
:showSaveButton="false"
|
||
|
></my-quill>
|
||
|
</div>
|
||
|
|
||
|
<div class="form-group d-flex">
|
||
|
<div>
|
||
|
<button
|
||
|
v-if="form?._id"
|
||
|
@click="onDeleteItem(form)"
|
||
|
title="حذف"
|
||
|
class="btn delete-btn btn-danger"
|
||
|
type="button"
|
||
|
>
|
||
|
<svg class="icon icon-Component-295--1">
|
||
|
<use xlink:href="#icon-Component-295--1"></use>
|
||
|
</svg>
|
||
|
|
||
|
حذف
|
||
|
</button>
|
||
|
</div>
|
||
|
|
||
|
<div class="me-auto">
|
||
|
<button
|
||
|
:disabled="buttonLoading"
|
||
|
@click.prevent="$emit('close-modal')"
|
||
|
type="button"
|
||
|
class="btn btn-default"
|
||
|
data-dismiss="modal"
|
||
|
>
|
||
|
لغو
|
||
|
</button>
|
||
|
<button
|
||
|
type="submit"
|
||
|
class="btn btn-primary"
|
||
|
:disabled="buttonLoading"
|
||
|
@click.prevent="save()"
|
||
|
>
|
||
|
<the-button-loading
|
||
|
v-if="buttonLoading"
|
||
|
:style="{ transform: 'scale(0.5)' }"
|
||
|
></the-button-loading>
|
||
|
ثبت
|
||
|
</button>
|
||
|
</div>
|
||
|
</div>
|
||
|
</form>
|
||
|
</div>
|
||
|
</div>
|
||
|
</template>
|
||
|
|
||
|
<script>
|
||
|
import adminApi from "~/apis/adminApi";
|
||
|
import repoApi from "~/apis/repoApi";
|
||
|
import notificationMixin from "~/mixins/notifications/notificationMixin";
|
||
|
|
||
|
export default {
|
||
|
extends: notificationMixin,
|
||
|
props: {
|
||
|
formData: undefined,
|
||
|
},
|
||
|
mounted() {
|
||
|
if (this.formData) this.form = this.formData;
|
||
|
},
|
||
|
computed: {
|
||
|
imageBaseUrl() {
|
||
|
return import.meta.env.VITE_BASE_URL;
|
||
|
},
|
||
|
},
|
||
|
|
||
|
// watch: {
|
||
|
// $route: {
|
||
|
// handler: function () {
|
||
|
// this.$store.state.collapsed = false;
|
||
|
// },
|
||
|
// deep: true,
|
||
|
// immediate: true,
|
||
|
// },
|
||
|
// },
|
||
|
data() {
|
||
|
return {
|
||
|
form: {
|
||
|
_index: "",
|
||
|
_type: "",
|
||
|
_id: "",
|
||
|
_score: 0,
|
||
|
_source: {
|
||
|
title: "",
|
||
|
description: "",
|
||
|
attachment: [
|
||
|
{
|
||
|
type: "",
|
||
|
link: "",
|
||
|
decription: "",
|
||
|
},
|
||
|
],
|
||
|
user_id: -1,
|
||
|
username: "",
|
||
|
entity_type: "",
|
||
|
data_type: "",
|
||
|
time_edit: 1111111111,
|
||
|
},
|
||
|
},
|
||
|
hasImage: false,
|
||
|
imageUrl: undefined,
|
||
|
uploading: false,
|
||
|
};
|
||
|
},
|
||
|
computed: {
|
||
|
imageBaseUrl() {
|
||
|
return import.meta.env.VITE_BASE_URL;
|
||
|
},
|
||
|
},
|
||
|
methods: {
|
||
|
setImage: function (file) {
|
||
|
this.hasImage = true;
|
||
|
this.imageUrl = file;
|
||
|
this.saveFile(file);
|
||
|
},
|
||
|
getFileExtension(filename) {
|
||
|
const validtypes = [
|
||
|
"xlsx",
|
||
|
"xls",
|
||
|
"doc",
|
||
|
"docx",
|
||
|
"ppt",
|
||
|
"pptx",
|
||
|
"txt",
|
||
|
"pdf",
|
||
|
"jpg",
|
||
|
"png",
|
||
|
"jpeg",
|
||
|
];
|
||
|
const fileExtension = filename?.split(".").pop();
|
||
|
return validtypes.includes(fileExtension) ? fileExtension : "other";
|
||
|
},
|
||
|
saveFile(file) {
|
||
|
if (this.uploading) return;
|
||
|
this.uploading = true;
|
||
|
|
||
|
let url = "public/entity/" + repoApi.entity.upload;
|
||
|
const formData = new FormData();
|
||
|
// formData.append('file', files)
|
||
|
formData.append("file", file);
|
||
|
|
||
|
this.httpService
|
||
|
.postRequest(url, formData, {
|
||
|
headers: {
|
||
|
"Content-Type": "multipart/form-data",
|
||
|
},
|
||
|
})
|
||
|
.then((response) => {
|
||
|
this.form._source.attachment[0].type = this.getFileExtension(
|
||
|
file.name
|
||
|
);
|
||
|
this.form._source.attachment[0].link = response.file;
|
||
|
this.form._source.attachment[0].decription = "";
|
||
|
})
|
||
|
|
||
|
.finally(() => {
|
||
|
this.uploading = false;
|
||
|
});
|
||
|
},
|
||
|
|
||
|
save() {
|
||
|
if (this.buttonLoading) return;
|
||
|
this.buttonLoading = true;
|
||
|
|
||
|
this.form._source.description = this.$refs["quill-editor"].editorData;
|
||
|
var url = adminApi.notification.add;
|
||
|
|
||
|
if (this.form._id.length) {
|
||
|
url = adminApi.notification.edit;
|
||
|
url = url.replace("{{id}}", this.form._id);
|
||
|
}
|
||
|
|
||
|
const payload = {
|
||
|
title: this.form._source.title,
|
||
|
description: this.form._source.description,
|
||
|
attachment: this.form._source.attachment,
|
||
|
};
|
||
|
|
||
|
this.httpService
|
||
|
.postRequest(url, payload)
|
||
|
.then((res) => {
|
||
|
this.$emit("close-modal", true);
|
||
|
|
||
|
this.mySwalToast({
|
||
|
title: "تبریک",
|
||
|
html: res.message,
|
||
|
icon: "success",
|
||
|
});
|
||
|
})
|
||
|
|
||
|
.finally(() => {
|
||
|
this.buttonLoading = false;
|
||
|
});
|
||
|
},
|
||
|
onDeleteItem(item) {
|
||
|
this.mySwalConfirm({
|
||
|
title: "هشدار!!!",
|
||
|
html: "از حذف این مورد مطمئن هستید؟",
|
||
|
}).then((result) => {
|
||
|
if (result.isConfirmed) {
|
||
|
this.deleteItem(item).then(() => {
|
||
|
this.$emit("close-modal");
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
},
|
||
|
},
|
||
|
|
||
|
};
|
||
|
</script>
|
||
|
<style lang="scss">
|
||
|
.picture-input input[type="file"],
|
||
|
#fileInput {
|
||
|
display: none !important;
|
||
|
}
|
||
|
|
||
|
.image-uploader-container {
|
||
|
position: relative;
|
||
|
border: 2px dashed #eee;
|
||
|
padding: 0.2em;
|
||
|
|
||
|
&.hide-preview {
|
||
|
.upload-label {
|
||
|
position: absolute;
|
||
|
right: 0;
|
||
|
left: 0;
|
||
|
top: 0;
|
||
|
bottom: 0;
|
||
|
width: auto !important;
|
||
|
overflow: hidden;
|
||
|
}
|
||
|
|
||
|
.upload-label img {
|
||
|
visibility: hidden;
|
||
|
}
|
||
|
}
|
||
|
.img-preview {
|
||
|
width: 300px;
|
||
|
max-width: 100%;
|
||
|
height: auto;
|
||
|
max-height: 200px;
|
||
|
object-fit: contain;
|
||
|
}
|
||
|
}
|
||
|
</style>
|