done delete , add PostCategory feature

parent 8f863776
...@@ -76,4 +76,6 @@ export enum API_PATHS { ...@@ -76,4 +76,6 @@ export enum API_PATHS {
getLanguage = 'language', getLanguage = 'language',
getDetailPost = 'post/detail', getDetailPost = 'post/detail',
updatePost = 'post/update', updatePost = 'post/update',
addCategoryPost = 'postCategory/add',
deleteCategoryPost = 'postCategory/delete',
} }
import { i18n } from 'src/boot/i18n'; import { i18n } from 'src/boot/i18n';
import { defineComponent, PropType, Ref, ref, watch } from 'vue'; import { defineComponent, PropType, Ref, ref, watch } from 'vue';
import UploadImage from 'components/upload-image/index.vue'; import UploadImage from 'components/upload-image/index.vue';
import { PostType, LanguageType } from 'src/assets/type'; import { PostType, LanguageType, FileUploadType } from 'src/assets/type';
import ListPostDialog from 'components/post-category/list-post-dialog/index.vue'; import ListPostDialog from 'components/post-category/list-post-dialog/index.vue';
import { api, BaseResponseBody } from 'src/boot/axios';
import { AxiosResponse } from 'axios';
import { config } from 'src/assets/configurations';
export default defineComponent({ export default defineComponent({
// name: 'ComponentName' // name: 'ComponentName'
...@@ -11,7 +14,7 @@ export default defineComponent({ ...@@ -11,7 +14,7 @@ export default defineComponent({
isOpenAddDialog: { type: Boolean, required: true }, isOpenAddDialog: { type: Boolean, required: true },
languages: { type: Array as PropType<LanguageType[]>, required: true }, languages: { type: Array as PropType<LanguageType[]>, required: true },
}, },
setup(props) { setup(props, context) {
type FromDataType = { type FromDataType = {
name: string; name: string;
title: string; title: string;
...@@ -109,15 +112,41 @@ export default defineComponent({ ...@@ -109,15 +112,41 @@ export default defineComponent({
const isOpenListPost: Ref<boolean> = ref(false); const isOpenListPost: Ref<boolean> = ref(false);
const langs: Ref<FromDataType[]> = ref([]); const langs: Ref<FromDataType[]> = ref([]);
const tabName: Ref<string> = ref('vi'); const tabName: Ref<string> = ref('vi');
const tabTitle: Ref<string> = ref('vi');
const uploadImage = (value: FileList) => { const uploadImage = (value: FileList) => {
urlFileLocal.value = URL.createObjectURL(value[0]); urlFileLocal.value = URL.createObjectURL(value[0]);
file.value = value[0]; file.value = value[0];
image.value = urlFileLocal.value; image.value = urlFileLocal.value;
console.log(value, 'FileList'); console.log(value, 'FileList');
}; };
const imageUploaded: Ref<string | null> = ref(null);
const deletePostSelected = (postIdx: number) => { const deletePostSelected = (postIdx: number) => {
userTableRowsPost.value.splice(postIdx, 1); userTableRowsPost.value.splice(postIdx, 1);
}; };
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: config.API_IMAGE_ENDPOINT,
method: 'POST',
data: bodyFormData,
})) as AxiosResponse<BaseResponseBody<FileUploadType>>;
if (response.data.error.code === config.API_RES_CODE.OK.code) {
imageUploaded.value = response.data.data.fileName;
}
} catch (error) {}
};
const confirmAddPostCategory = async () => {
await callApiUploadAvatar(file.value as File);
context.emit('addPostCategory', {
image: imageUploaded.value,
status: status.value,
posts: userTableRowsPost.value,
langs: langs.value,
});
};
return { return {
name, name,
...@@ -135,6 +164,8 @@ export default defineComponent({ ...@@ -135,6 +164,8 @@ export default defineComponent({
deletePostSelected, deletePostSelected,
langs, langs,
tabName, tabName,
tabTitle,
confirmAddPostCategory,
}; };
}, },
emits: [ emits: [
...@@ -142,5 +173,6 @@ export default defineComponent({ ...@@ -142,5 +173,6 @@ export default defineComponent({
'click:closeBtnDialog', 'click:closeBtnDialog',
'SetImage', 'SetImage',
'deleteImage', 'deleteImage',
'addPostCategory',
], ],
}); });
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
@update:model-value="$emit('update:isOpenAddDialog', $event)" @update:model-value="$emit('update:isOpenAddDialog', $event)"
> >
<q-card class="full-width" style="max-width: 60rem" bordered> <q-card class="full-width" style="max-width: 60rem" bordered>
<q-form greedy @submit.prevent> <q-form greedy @submit.prevent="confirmAddPostCategory">
<q-card-section class="q-pa-none"> <q-card-section class="q-pa-none">
<q-item> <q-item>
<q-item-section> <q-item-section>
...@@ -46,22 +46,58 @@ ...@@ -46,22 +46,58 @@
> >
<q-input <q-input
v-model="info.name" v-model="info.name"
:label="$t('postCategory.labelInput.namePost')" :label="`${
tabName === 'vi'
? $t('postCategory.labelInput.namePost')
: $t('postCategory.labelInput.nameEnglish')
}`"
type="text"
class="q-my-sm"
outlined
:rules="tabName === 'vi' ? nameRules : ''"
hide-bottom-space
></q-input>
</q-tab-panel>
</q-tab-panels>
<q-tabs
v-model="tabTitle"
dense
class="text-grey"
active-color="primary"
indicator-color="primary"
align="left"
narrow-indicator
>
<q-tab
v-for="(lang, idxLang) in langs"
:key="`${lang.language.id}-${idxLang}`"
:name="lang.language.code"
:label="lang.language.name"
no-caps
/>
</q-tabs>
<q-separator />
<q-tab-panels v-model="tabTitle" animated>
<q-tab-panel
v-for="(info, index) in langs"
:key="`${info.language.id}-${index}`"
:name="info.language.code"
>
<q-input
v-model="info.title"
:label="`${
tabTitle === 'vi'
? $t('postCategory.labelInput.description')
: $t('postCategory.labelInput.shortDescription')
}`"
type="text" type="text"
class="q-my-sm" class="q-my-sm"
outlined outlined
:rules="nameRules"
></q-input> ></q-input>
</q-tab-panel> </q-tab-panel>
</q-tab-panels> </q-tab-panels>
<q-input
v-model="title"
:label="$t('postCategory.labelInput.description')"
type="text"
class="q-my-sm"
outlined
></q-input>
<div class="row"> <div class="row">
<div class="col-6"> <div class="col-6">
<q-card v-if="image" flat style="max-height: 200px"> <q-card v-if="image" flat style="max-height: 200px">
......
...@@ -718,7 +718,17 @@ export default { ...@@ -718,7 +718,17 @@ export default {
labelInput: { labelInput: {
namePost: 'Tên danh mục', namePost: 'Tên danh mục',
description: 'Mô tả ngắn', description: 'Mô tả ngắn',
shortDescription: 'Short description',
uploadImg: 'Tải lên ảnh bìa', uploadImg: 'Tải lên ảnh bìa',
nameEnglish: 'Article category name',
},
actionMessages: {
addPostCategoryAccess: 'Thêm danh mục bài viết thành công',
deletePostCategoryAccess: 'Xoá danh mục bài viết thành công',
},
confirmActionsTitle: {
confirmDeletePostCategory:
'Bạn có chắc muốn xoá danh mục bài viết này không?',
}, },
}, },
......
...@@ -3,8 +3,13 @@ import { defineComponent, onMounted, Ref, ref } from 'vue'; ...@@ -3,8 +3,13 @@ import { defineComponent, onMounted, Ref, ref } from 'vue';
import { API_PATHS, config } from 'src/assets/configurations'; import { API_PATHS, config } 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 { CategoryPostType, LanguageType } from 'src/assets/type'; import {
CategoryPostType,
LanguageType,
PostCategoryDetailType,
} from 'src/assets/type';
import AddCategoryPostDialog from 'components/post-category/add-post-category/index.vue'; import AddCategoryPostDialog from 'components/post-category/add-post-category/index.vue';
import { Dialog, Notify } from 'quasar';
// import { Dialog, Notify } from 'quasar'; // import { Dialog, Notify } from 'quasar';
export default defineComponent({ export default defineComponent({
components: { components: {
...@@ -97,6 +102,65 @@ export default defineComponent({ ...@@ -97,6 +102,65 @@ export default defineComponent({
} catch (error) {} } catch (error) {}
}; };
const addPostCategory = async (formData: PostCategoryDetailType) => {
try {
const response = (await api({
url: API_PATHS.addCategoryPost,
method: 'POST',
data: {
image: formData.image,
status: formData.status,
posts: formData.posts,
langs: formData.langs,
},
})) as AxiosResponse<BaseResponseBody<unknown>>;
if (response.data.error.code === config.API_RES_CODE.OK.code) {
isOpenAddDialog.value = false;
Notify.create({
type: 'positive',
message: i18n.global.t(
'postCategory.actionMessages.addPostCategoryAccess'
),
});
void getListCategoryPost();
}
} catch (error) {}
};
const confirmDelete = (id: number) => {
Dialog.create({
title: i18n.global.t(
'artist.bankAccount.confirmActionsTitle.confirmDeleteAccBankTitle'
),
message: i18n.global.t(
'postCategory.confirmActionsTitle.confirmDeletePostCategory'
),
cancel: i18n.global.t(
'artist.bankAccount.confirmActionsTitle.confirmDeleteAccBankBtnLabel'
),
color: 'negative',
}).onOk(async () => {
try {
const response = (await api({
url: API_PATHS.deleteCategoryPost,
method: 'GET',
params: {
id: id,
},
})) as AxiosResponse<BaseResponseBody<unknown>>;
if (response.data.error.code === config.API_RES_CODE.OK.code) {
Notify.create({
type: 'positive',
message: i18n.global.t(
'postCategory.actionMessages.deletePostCategoryAccess'
),
});
void getListCategoryPost();
}
} catch (error) {}
});
};
onMounted(() => { onMounted(() => {
void getListCategoryPost(); void getListCategoryPost();
void getLanguages(); void getLanguages();
...@@ -110,6 +174,8 @@ export default defineComponent({ ...@@ -110,6 +174,8 @@ export default defineComponent({
getListCategoryPost, getListCategoryPost,
getLanguages, getLanguages,
languages, languages,
addPostCategory,
confirmDelete,
}; };
}, },
}); });
...@@ -82,7 +82,7 @@ ...@@ -82,7 +82,7 @@
</div> </div>
</q-td> </q-td>
</template> </template>
<template v-slot:body-cell-action> <template v-slot:body-cell-action="item">
<q-td style="padding: 0; height: 100%"> <q-td style="padding: 0; height: 100%">
<div align="center"> <div align="center">
<q-btn flat round color="primary" icon="mdi-account-edit-outline"> <q-btn flat round color="primary" icon="mdi-account-edit-outline">
...@@ -90,7 +90,13 @@ ...@@ -90,7 +90,13 @@
$t('customer.toolTipMessage.updateCustomerInfo') $t('customer.toolTipMessage.updateCustomerInfo')
}}</q-tooltip> }}</q-tooltip>
</q-btn> </q-btn>
<q-btn flat round color="primary" icon="mdi-delete-outline"> <q-btn
flat
round
color="primary"
icon="mdi-delete-outline"
@click="confirmDelete(item.row.id)"
>
<q-tooltip :offset="[20, 10]">{{ <q-tooltip :offset="[20, 10]">{{
$t('customer.toolTipMessage.deleteCustomer') $t('customer.toolTipMessage.deleteCustomer')
}}</q-tooltip> }}</q-tooltip>
...@@ -104,6 +110,7 @@ ...@@ -104,6 +110,7 @@
v-model:is-open-add-dialog="isOpenAddDialog" v-model:is-open-add-dialog="isOpenAddDialog"
:languages="languages" :languages="languages"
@click:closeBtnDialog="isOpenAddDialog = false" @click:closeBtnDialog="isOpenAddDialog = false"
@addPostCategory="addPostCategory($event)"
/> />
</div> </div>
</template> </template>
......
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