create add-post feature in postCategory

parent 950d4e55
...@@ -21,10 +21,6 @@ export default defineComponent({ ...@@ -21,10 +21,6 @@ export default defineComponent({
() => props.showDialogUpdate, () => props.showDialogUpdate,
(value) => { (value) => {
if (value) { if (value) {
console.log(
props.customerInfo,
'customerInfocustomerInfocustomerInfo'
);
void getData(); void getData();
} }
} }
......
...@@ -2,9 +2,10 @@ import { i18n } from 'src/boot/i18n'; ...@@ -2,9 +2,10 @@ import { i18n } from 'src/boot/i18n';
import { defineComponent, Ref, ref } from 'vue'; import { defineComponent, Ref, ref } from 'vue';
import UploadImage from 'components/upload-image/index.vue'; import UploadImage from 'components/upload-image/index.vue';
import { PostType } from 'src/assets/type'; import { PostType } from 'src/assets/type';
import ListPostDialog from 'components/post-category/list-post-dialog/index.vue';
export default defineComponent({ export default defineComponent({
// name: 'ComponentName' // name: 'ComponentName'
components: { UploadImage }, components: { UploadImage, ListPostDialog },
props: { props: {
isOpenAddDialog: { type: Boolean, required: true }, isOpenAddDialog: { type: Boolean, required: true },
}, },
...@@ -75,15 +76,17 @@ export default defineComponent({ ...@@ -75,15 +76,17 @@ export default defineComponent({
}, },
]; ];
const userTableRowsPost: Ref<PostType[]> = ref([]); const userTableRowsPost: Ref<PostType[]> = ref([]);
const isOpenListPost: Ref<boolean> = ref(false);
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 getListPosts = () => { const deletePostSelected = (postIdx: number) => {
console.log('getListPosts'); userTableRowsPost.value.splice(postIdx, 1);
}; };
return { return {
name, name,
title, title,
...@@ -92,11 +95,12 @@ export default defineComponent({ ...@@ -92,11 +95,12 @@ export default defineComponent({
nameRules, nameRules,
file, file,
urlFileLocal, urlFileLocal,
isOpenListPost,
uploadImage, uploadImage,
userTableColumnsPost, userTableColumnsPost,
userTableRowsPost, userTableRowsPost,
keywordSearch, keywordSearch,
getListPosts, deletePostSelected,
}; };
}, },
emits: [ emits: [
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
<q-card-section class="q-pa-none"> <q-card-section class="q-pa-none">
<q-item> <q-item>
<q-item-section> <q-item-section>
<q-item-label class="text-h6 text-weight-regular"> <q-item-label class="text-h6 q-py-md text-weight-regular">
{{ $t('postCategory.title.addPost') }} {{ $t('postCategory.title.addPost') }}
</q-item-label> </q-item-label>
</q-item-section> </q-item-section>
...@@ -63,14 +63,14 @@ ...@@ -63,14 +63,14 @@
</div> </div>
</div> </div>
<div class="q-mt-md"> <div class="q-mt-md">
<span class="text-h6 text-weight-regular">{{ <span class="text-body1 text-weight-regular">{{
$t('customerRank.dialogLabel.fieldLabels.status') $t('customerRank.dialogLabel.fieldLabels.status')
}}</span }}</span
><q-toggle ><q-toggle
v-model="status" v-model="status"
:true-value="1" :true-value="1"
:false-value="2" :false-value="2"
size="56px" size="50px"
></q-toggle> ></q-toggle>
</div> </div>
</q-card-section> </q-card-section>
...@@ -84,11 +84,11 @@ ...@@ -84,11 +84,11 @@
q-mr-md q-mr-md
" "
> >
{{ $t('postCategory.title.listPosts') }} {{ $t('postCategory.title.listPostsSelected') }}
<q-separator vertical spaced /> <q-separator vertical spaced />
</div> </div>
<q-space></q-space> <q-space></q-space>
<div class="col-2"> <!-- <div class="col-2">
<q-input <q-input
v-model="keywordSearch" v-model="keywordSearch"
dense dense
...@@ -103,16 +103,16 @@ ...@@ -103,16 +103,16 @@
no-caps no-caps
:label="$t('crudActions.search')" :label="$t('crudActions.search')"
style="width: 100px" style="width: 100px"
@click="getListPosts"
> >
</q-btn> </q-btn>
</div> </div> -->
<div class="col-auto"> <div class="col-auto">
<q-btn <q-btn
color="primary" color="primary"
no-caps no-caps
:label="$t('crudActions.add')" :label="$t('crudActions.add')"
style="width: 100px" style="width: 100px"
@click="isOpenListPost = true"
> >
</q-btn> </q-btn>
</div> </div>
...@@ -149,7 +149,7 @@ ...@@ -149,7 +149,7 @@
</div> </div>
</q-td> </q-td>
</template> </template>
<template v-slot:body-cell-action> <template v-slot:body-cell-action="post">
<q-td style="padding: 0; height: 100%"> <q-td style="padding: 0; height: 100%">
<div align="center"> <div align="center">
<q-btn <q-btn
...@@ -157,6 +157,7 @@ ...@@ -157,6 +157,7 @@
round round
color="primary" color="primary"
icon="mdi-delete-outline" icon="mdi-delete-outline"
@click="deletePostSelected(post.rowIndex)"
> >
<q-tooltip :offset="[20, 10]">{{ <q-tooltip :offset="[20, 10]">{{
$t('customer.toolTipMessage.deleteCustomer') $t('customer.toolTipMessage.deleteCustomer')
...@@ -191,6 +192,12 @@ ...@@ -191,6 +192,12 @@
</q-form> </q-form>
</q-card> </q-card>
</q-dialog> </q-dialog>
<ListPostDialog
v-model:is-open-list-post="isOpenListPost"
:post-selected="userTableRowsPost"
@click:closeBtnDialog="isOpenListPost = false"
@submit-data="(userTableRowsPost = $event), (isOpenListPost = false)"
></ListPostDialog>
</template> </template>
<script lang="ts" src="./AddPostCategory.ts"></script> <script lang="ts" src="./AddPostCategory.ts"></script>
import { defineComponent } from 'vue'; import { defineComponent, PropType, Ref, ref, watch } from 'vue';
import { PaginationResponse, PostType } from 'src/assets/type';
import { i18n } from 'src/boot/i18n';
import { API_PATHS, config } from 'src/assets/configurations';
import { api, BaseResponseBody } from 'src/boot/axios';
import { AxiosResponse } from 'axios';
import Pagination from 'components/pagination/index.vue';
export default defineComponent({ export default defineComponent({
// name: 'ComponentName' components: {
Pagination,
},
props: {
isOpenListPost: { type: Boolean, required: true },
postSelected: { type: Array as PropType<PostType[]>, required: true },
},
setup(props) {
watch(
() => props.isOpenListPost,
(value) => {
if (value) {
void getListPosts();
selected.value = props.postSelected;
}
}
);
const keywordSearch: Ref<string | null> = ref(null);
const userTableRowsPost: Ref<PostType[]> = ref([]);
const userTableColumnsPost = [
{
name: 'stt',
field: 'stt',
required: true,
label: i18n.global.t('postCategory.tableColumnsPost.stt'),
align: 'center',
sortable: false,
},
{
name: 'name',
field: 'name',
required: true,
label: i18n.global.t('postCategory.tableColumnsPost.name'),
align: 'center',
headerStyle: 'text-align: center !important;',
sortable: false,
},
{
name: 'image',
field: 'image',
required: true,
label: i18n.global.t('postCategory.tableColumnsPost.imageMini'),
headerStyle: 'text-align: center !important;',
align: 'left',
sortable: false,
},
];
const pageIndex = ref(1);
const pageSize = ref(20);
const totalPage = ref(1);
const configImg = config;
const selected: Ref<PostType[]> = ref([]);
const getListPosts = async () => {
const response = (await api({
url: API_PATHS.getListPost,
method: 'GET',
params: {
pageIndex: pageIndex.value,
pageSize: pageSize.value,
name: keywordSearch.value,
// langId: 1,
},
})) as AxiosResponse<BaseResponseBody<PaginationResponse<PostType>>>;
if (response.data.error.code === config.API_RES_CODE.OK.code) {
userTableRowsPost.value = response.data.data.data;
totalPage.value = response.data.data.totalPages;
}
};
const changePageSize = () => {
pageIndex.value = 1;
void getListPosts();
};
const getSelectedString = () => {
return selected.value.length === 0
? ''
: `${selected.value.length} bài viết đã được chọn `;
};
return {
keywordSearch,
userTableRowsPost,
userTableColumnsPost,
pageIndex,
pageSize,
totalPage,
configImg,
selected,
getListPosts,
changePageSize,
getSelectedString,
};
},
emits: ['update:isOpenListPost', 'click:closeBtnDialog', 'submitData'],
}); });
<template> <template>
<div>My component</div> <q-dialog
persistent
:model-value="isOpenListPost"
@update:model-value="$emit('update:isOpenListPost', $event)"
>
<q-card class="full-width" style="max-width: 60rem" bordered>
<q-form greedy @submit.prevent="$emit('submitData', selected)">
<q-card-section class="q-pa-none">
<q-item>
<q-item-section>
<q-item-label class="text-h6 text-weight-medium">
{{ $t('postCategory.title.addPostDialog') }}
</q-item-label>
</q-item-section>
</q-item>
</q-card-section>
<q-separator />
<q-card-section>
<div class="row q-col-gutter-sm flex-center q-mt-sm">
<div
class="
col-auto
text-body1 text-weight-regular
flex flex-center
q-mr-md
"
>
{{ $t('postCategory.title.listPosts') }}
<q-separator vertical spaced />
</div>
<q-space></q-space>
<div class="col-2">
<q-input
v-model="keywordSearch"
dense
outlined
:label="$t('postCategory.tableColumnsPost.name')"
clearable
></q-input>
</div>
<div class="col-auto">
<q-btn
color="primary"
no-caps
:label="$t('crudActions.search')"
style="width: 100px"
@click="getListPosts"
>
</q-btn>
</div>
<div class="col-12 q-mt-sm">
<q-table
v-model:selected="selected"
:rows="userTableRowsPost"
:columns="userTableColumnsPost"
:pagination="{ rowsPerPage: pageSize }"
:selected-rows-label="getSelectedString"
:no-data-label="$t('emptyData')"
row-key="name"
separator="cell"
selection="multiple"
hide-pagination
>
<template v-slot:body-cell-stt="item">
<q-td style="padding: 0; height: 100%">
<div align="center">
{{ item.rowIndex + 1 }}
</div>
</q-td>
</template>
<template v-slot:body-cell-image="image">
<q-td
style="padding: auto; height: 100%"
class="flex flex-center"
>
<q-img
style="width: 9rem"
fit="contain"
:ratio="16 / 9"
:src="configImg.API_IMAGE_ENDPOINT + image.row.image"
></q-img>
</q-td>
</template>
</q-table>
</div>
<div class="col-12 q-mt-sm">
<Pagination
v-model:currentPage="pageIndex"
v-model:pageSize="pageSize"
:totalPage="totalPage"
@update:pageSize="changePageSize"
@update:currentPage="getListPosts"
/>
</div>
</div>
</q-card-section>
<q-card-actions align="right">
<div>
<q-btn
color="grey"
no-caps
style="width: 90px"
class="q-mr-sm"
:label="$t('post.crudActions.cancel')"
@click="$emit('click:closeBtnDialog')"
/>
<q-btn
type="submit"
color="primary"
no-caps
style="width: 90px"
:label="$t('post.crudActions.save')"
/>
</div>
</q-card-actions>
</q-form>
</q-card>
</q-dialog>
</template> </template>
<script lang="ts" src="./ListPostDialog.ts"></script> <script lang="ts" src="./ListPostDialog.ts"></script>
...@@ -695,6 +695,8 @@ export default { ...@@ -695,6 +695,8 @@ export default {
addPost: 'Thêm mới danh mục bài viết', addPost: 'Thêm mới danh mục bài viết',
editPost: 'Cập nhật danh mục bài viết', editPost: 'Cập nhật danh mục bài viết',
listPosts: 'Danh sách bài viết', listPosts: 'Danh sách bài viết',
listPostsSelected: 'Danh sách bài viết đã chọn',
addPostDialog: 'Thêm bài viết',
}, },
tableColumnsPostCategory: { tableColumnsPostCategory: {
stt: 'STT', stt: 'STT',
...@@ -711,6 +713,7 @@ export default { ...@@ -711,6 +713,7 @@ export default {
updateTime: 'Thời gian cập nhật gần nhất', updateTime: 'Thời gian cập nhật gần nhất',
status: 'Trạng thái', status: 'Trạng thái',
action: 'Chức năng', action: 'Chức năng',
imageMini: 'Ảnh thu nhỏ',
}, },
labelInput: { labelInput: {
namePost: 'Tên danh mục', namePost: 'Tên danh mục',
......
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