Commit 8c6922be authored by Tình Trương's avatar Tình Trương

update

parent 9867a483
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
:model-value="isOpened" :model-value="isOpened"
@update:model-value="$emit('update:isOpened', $event)" @update:model-value="$emit('update:isOpened', $event)"
> >
<q-card class="full-width" style="max-width: 50rem" bordered> <q-card class="full-width" style="max-width: 60rem" bordered>
<q-form <q-form
greedy greedy
@submit.prevent=" @submit.prevent="
...@@ -30,46 +30,53 @@ ...@@ -30,46 +30,53 @@
style="max-height: calc(100vh - 10rem)" style="max-height: calc(100vh - 10rem)"
> >
<div class="row q-col-gutter-sm"> <div class="row q-col-gutter-sm">
<div class="col-6"> <div class="col-5">
<div> <div class="row q-mt-sm flex-center">
<q-card style="margin-bottom: 8px" v-if="image !== null"> <div>
<q-img :src="image" style="height: 180px; width: 135px"> <q-card style="margin-bottom: 8px" v-if="image !== null">
</q-img> <q-img
<q-icon :src="image"
name="mdi-close-circle" style="height: 268px; width: 350px"
color="red" @click="uploadAvatar"
style="position: absolute; right: 0; font-size: 18px" >
></q-icon> </q-img>
</q-card>
<q-card v-else style="margin-bottom: 8px">
<q-img
src="~/assets/noavatar.png"
style="height: 180px; width: 135px"
></q-img>
</q-card>
<q-card @click="uploadAvatar">
<div align="center" class="flex flex-center q-py-xs">
<q-icon <q-icon
name="mdi-plus-circle-outline" name="mdi-close-circle"
:size="'xs'" color="red"
style="position: absolute; right: 0; font-size: 18px"
@click="deleteAvatar"
></q-icon> ></q-icon>
<div class="q-mt-xs"> </q-card>
{{ $t('uploadImage.uploadBanner') }} <q-card v-else style="margin-bottom: 8px">
<q-img
src="~/assets/noavatar.png"
style="height: 268px; width: 350px"
></q-img>
</q-card>
<q-card @click="uploadAvatar">
<div align="center" class="flex flex-center q-py-xs">
<q-icon
name="mdi-plus-circle-outline"
:size="'xs'"
></q-icon>
<div class="q-mt-xs">
{{ $t('uploadImage.uploadBanner') }}
</div>
</div> </div>
</div>
<input <input
ref="upload" ref="upload"
hidden hidden
type="file" type="file"
@change="selectedFile($event.target.files)" @change="selectedFile($event.target.files)"
accept="image/png, image/jpeg" accept="image/png, image/jpeg"
/> />
</q-card> </q-card>
</div>
</div> </div>
</div> </div>
<div class="col-6"> <div class="col-7">
<q-input <q-input
:model-value="name" :model-value="name"
@update:model-value="$emit('update:name', $event)" @update:model-value="$emit('update:name', $event)"
...@@ -80,14 +87,19 @@ ...@@ -80,14 +87,19 @@
:rules="nameRules" :rules="nameRules"
clearable clearable
></q-input> ></q-input>
<q-input <q-select
:model-value="description" :model-value="category"
@update:model-value="$emit('update:description', $event)" @update:model-value="$emit('update:category', $event)"
:label="$t('post.dialogLabel.postLabels.description')" :label="$t('post.dialogLabel.postLabels.category')"
:rules="categoryRules"
:options="categoryOptions"
map-options
option-value="id"
option-label="name"
type="text" type="text"
class="q-my-sm" class="q-my-sm"
outlined outlined
></q-input> ></q-select>
<q-input <q-input
:model-value="content" :model-value="content"
@update:model-value="$emit('update:content', $event)" @update:model-value="$emit('update:content', $event)"
...@@ -96,6 +108,7 @@ ...@@ -96,6 +108,7 @@
type="textarea" type="textarea"
class="q-my-sm" class="q-my-sm"
outlined outlined
clearable
></q-input> ></q-input>
<div class="q-pt-sm"> <div class="q-pt-sm">
<span class="text-body1">{{ <span class="text-body1">{{
...@@ -138,8 +151,11 @@ ...@@ -138,8 +151,11 @@
<script lang="ts"> <script lang="ts">
import { defineComponent, ref } from 'vue'; import { defineComponent, ref } from 'vue';
import { i18n } from 'src/boot/i18n'; import { i18n } from 'src/boot/i18n';
// import UploadImage from '../../upload-image/index.vue';
export default defineComponent({ export default defineComponent({
// components: {
// UploadImage,
// },
props: { props: {
isOpened: { isOpened: {
type: Boolean, type: Boolean,
...@@ -148,19 +164,23 @@ export default defineComponent({ ...@@ -148,19 +164,23 @@ export default defineComponent({
isUpdate: { type: Boolean, default: false }, isUpdate: { type: Boolean, default: false },
image: { type: String, required: true }, image: { type: String, required: true },
name: { type: String, required: true }, name: { type: String, required: true },
description: { type: String, required: true }, category: { type: Number, required: true },
categoryOptions: { type: Array, required: true },
content: { type: String, required: true }, content: { type: String, required: true },
status: { type: Number, required: true }, status: { type: Number, required: true },
}, },
setup(props, context) { setup(_, context) {
const selectedFile = (value: FileList) => { const selectedFile = (value: FileList) => {
console.log(value, 'valueee image'); console.log(value, 'valueee image');
// console.log(URL.createObjectURL(value[0]));
context.emit('SetAvatar', { context.emit('SetAvatar', {
file: value[0], file: value[0],
url: URL.createObjectURL(value[0]), url: URL.createObjectURL(value[0]),
}); });
}; };
const deleteAvatar = () => {
console.log('object');
context.emit('deleteAvatar');
};
const upload = ref(null); const upload = ref(null);
const uploadAvatar = () => { const uploadAvatar = () => {
// eslint-disable-next-line // eslint-disable-next-line
...@@ -168,6 +188,11 @@ export default defineComponent({ ...@@ -168,6 +188,11 @@ export default defineComponent({
// eslint-disable-next-line // eslint-disable-next-line
upload.value?.click(); upload.value?.click();
}; };
const categoryRules = [
(val?: number) =>
val !== undefined ||
i18n.global.t('post.validateMessages.requireCategory'),
];
const imageRules = [ const imageRules = [
(val?: string) => (val?: string) =>
(val && val.trim().length) || (val && val.trim().length) ||
...@@ -188,19 +213,22 @@ export default defineComponent({ ...@@ -188,19 +213,22 @@ export default defineComponent({
nameRules, nameRules,
imageRules, imageRules,
selectedFile, selectedFile,
categoryRules,
upload, upload,
uploadAvatar, uploadAvatar,
deleteAvatar,
}; };
}, },
emits: [ emits: [
'update:isOpened', 'update:isOpened',
'update:image', 'update:image',
'update:name', 'update:name',
'update:description', 'update:category',
'update:content', 'update:content',
'update:status', 'update:status',
'savePostInfo', 'savePostInfo',
'SetAvatar', 'SetAvatar',
'deleteAvatar',
], ],
}); });
</script> </script>
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
@update:model-value="$emit('update:bank', $event)" @update:model-value="$emit('update:bank', $event)"
:label="$t('managingUnitAdd.dialogLabel.fieldLabels.bank')" :label="$t('managingUnitAdd.dialogLabel.fieldLabels.bank')"
:options="bankOptions" :options="bankOptions"
:rules="bankdRules" :rules="bankRules"
map-options map-options
option-value="id" option-value="id"
option-label="name" option-label="name"
...@@ -147,7 +147,7 @@ export default defineComponent({ ...@@ -147,7 +147,7 @@ export default defineComponent({
isDefault: { type: Number, required: true }, isDefault: { type: Number, required: true },
}, },
setup() { setup() {
const bankdRules = [ const bankRules = [
(val?: number) => (val?: number) =>
val !== undefined || val !== undefined ||
i18n.global.t('managingUnitAdd.validateMessages.requireBank'), i18n.global.t('managingUnitAdd.validateMessages.requireBank'),
...@@ -173,7 +173,7 @@ export default defineComponent({ ...@@ -173,7 +173,7 @@ export default defineComponent({
i18n.global.t('managingUnitAdd.validateMessages.requireUserCard'), i18n.global.t('managingUnitAdd.validateMessages.requireUserCard'),
]; ];
return { return {
bankdRules, bankRules,
cardTypeRules, cardTypeRules,
cardCodeRules, cardCodeRules,
numberCardRules, numberCardRules,
......
...@@ -650,12 +650,12 @@ export default { ...@@ -650,12 +650,12 @@ export default {
dialogLabel: { dialogLabel: {
title: { title: {
addPost: 'Thêm bài viết', addPost: 'Thêm bài viết',
updatePost: 'Cập nhật Bài viết', updatePost: 'Cập nhật bài viết',
}, },
postLabels: { postLabels: {
name: 'Tên bài viết *', name: 'Tên bài viết *',
image: 'Avatar *', image: 'Avatar *',
description: 'Mô tả', category: 'Danh mục bài viết *',
content: 'Nội dung *', content: 'Nội dung *',
status: 'Trạng thái', status: 'Trạng thái',
}, },
...@@ -672,6 +672,7 @@ export default { ...@@ -672,6 +672,7 @@ export default {
requireName: 'Vui lòng nhập Tên bài viết', requireName: 'Vui lòng nhập Tên bài viết',
requireImage: 'Vui lòng chọn Avatar', requireImage: 'Vui lòng chọn Avatar',
requireContent: 'Vui lòng nhập Nội dung', requireContent: 'Vui lòng nhập Nội dung',
requireCategory: 'Vui lòng chọn Danh mục bài viết',
}, },
confirmActionsTitle: { confirmActionsTitle: {
confirmDeletePostTitle: 'Xác nhận', confirmDeletePostTitle: 'Xác nhận',
......
...@@ -125,22 +125,27 @@ ...@@ -125,22 +125,27 @@
<AddUpdatePostDialog <AddUpdatePostDialog
v-model:isOpened="addPostDialogIsOpened" v-model:isOpened="addPostDialogIsOpened"
v-model:name="name" v-model:name="name"
v-model:description="description" v-model:category="category"
v-model:image="image" v-model:image="image"
v-model:content="content" v-model:content="content"
v-model:status="status" v-model:status="status"
:categoryOptions="categoryOptions"
isUpdate isUpdate
@SetAvatar="setAvatar" @SetAvatar="setAvatar($event)"
@deleteAvatar="deleteAvatar"
@savePostInfo="addNewPost" @savePostInfo="addNewPost"
/> />
<AddUpdatePostDialog <AddUpdatePostDialog
v-model:isOpened="updatePostDialogIsOpened" v-model:isOpened="updatePostDialogIsOpened"
v-model:name="name" v-model:name="name"
v-model:description="description" v-model:category="category"
v-model:image="image" v-model:image="image"
v-model:content="content" v-model:content="content"
v-model:status="status" v-model:status="status"
:categoryOptions="categoryOptions"
@SetAvatar="setAvatar($event)"
@deleteAvatar="deleteAvatar"
@savePostInfo="updateNewPost" @savePostInfo="updateNewPost"
/> />
</div> </div>
...@@ -153,11 +158,15 @@ import Pagination from 'components/pagination/index.vue'; ...@@ -153,11 +158,15 @@ import Pagination from 'components/pagination/index.vue';
import { API_PATHS } from 'src/assets/configurations'; import { API_PATHS } from 'src/assets/configurations';
import { AxiosResponse } from 'axios'; import { AxiosResponse } from 'axios';
import { api, BaseResponseBody } from 'src/boot/axios'; import { api, BaseResponseBody } from 'src/boot/axios';
import { PaginationResponse, Post } from 'src/assets/type'; import { PaginationResponse, Post, FileUploadType } from 'src/assets/type';
import { config } from 'src/assets/configurations'; import { config } from 'src/assets/configurations';
import { PostStatus } from 'src/assets/enums'; import { PostStatus } from 'src/assets/enums';
import AddUpdatePostDialog from 'components/add-update-post/index.vue'; import AddUpdatePostDialog from 'components/add-update-post/index.vue';
import { Dialog, Notify } from 'quasar'; import { Dialog, Notify } from 'quasar';
export type AvatarType = {
file?: File;
url?: string | null;
};
export default defineComponent({ export default defineComponent({
components: { components: {
...@@ -263,13 +272,16 @@ export default defineComponent({ ...@@ -263,13 +272,16 @@ export default defineComponent({
const postTableRows: Ref<unknown[]> = ref([]); const postTableRows: Ref<unknown[]> = ref([]);
const addPostDialogIsOpened = ref(false); const addPostDialogIsOpened = ref(false);
const updatePostDialogIsOpened = ref(false); const updatePostDialogIsOpened = ref(false);
const description = ref(''); const category: Ref<number | undefined> = ref(undefined);
const categoryOptions: Ref<unknown[]> = ref([]);
const name = ref(''); const name = ref('');
const content = ref(''); const content = ref('');
const image = ref(''); const image: Ref<string | null> = ref(null);
const status: Ref<number> = ref(PostStatus.active); const status: Ref<number> = ref(PostStatus.active);
const postId: Ref<number | undefined> = ref(undefined); const postId: Ref<number | undefined> = ref(undefined);
const namePost = ref(''); const namePost = ref('');
const avatarFile: Ref<File | null> = ref(null);
const avatarUploaded: Ref<string | null> = ref(null);
const changePageSize = () => { const changePageSize = () => {
pageIndex.value = 1; pageIndex.value = 1;
...@@ -330,9 +342,9 @@ export default defineComponent({ ...@@ -330,9 +342,9 @@ export default defineComponent({
const openAddPostDialog = () => { const openAddPostDialog = () => {
name.value = ''; name.value = '';
description.value = ''; category.value = undefined;
content.value = ''; content.value = '';
image.value = ''; image.value = null;
status.value = PostStatus.active; status.value = PostStatus.active;
addPostDialogIsOpened.value = true; addPostDialogIsOpened.value = true;
}; };
...@@ -408,9 +420,29 @@ export default defineComponent({ ...@@ -408,9 +420,29 @@ export default defineComponent({
// } // }
}; };
const setAvatar = (value: { file?: File; url?: string }) => { const setAvatar = (value: { file?: File; url?: string }) => {
avatarFile.value = value.file as File;
image.value = value.url as string; image.value = value.url as string;
}; };
const callApiUploadAvatar = async (file: File) => {
try {
const bodyFormData = new FormData();
bodyFormData.append('file', file);
const response = (await api({
headers: { 'Content-Type': 'multipart/form-data' },
url: 'http://cms.vab.xteldev.com/file/upload',
method: 'POST',
data: bodyFormData,
})) as AxiosResponse<BaseResponseBody<FileUploadType>>;
if (response.data.error.code === config.API_RES_CODE.OK.code) {
avatarUploaded.value = response.data.data.fileName;
}
} catch (error) {}
};
const deleteAvatar = () => {
image.value = null;
};
onMounted(() => { onMounted(() => {
void getListPost(); void getListPost();
}); });
...@@ -427,8 +459,9 @@ export default defineComponent({ ...@@ -427,8 +459,9 @@ export default defineComponent({
PostStatus, PostStatus,
openAddPostDialog, openAddPostDialog,
name, name,
description, category,
status, status,
categoryOptions,
addNewPost, addNewPost,
confirmDeletePost, confirmDeletePost,
deletePost, deletePost,
...@@ -440,6 +473,8 @@ export default defineComponent({ ...@@ -440,6 +473,8 @@ export default defineComponent({
image, image,
postId, postId,
setAvatar, setAvatar,
callApiUploadAvatar,
deleteAvatar,
}; };
}, },
}); });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment