update

parent 3ce550a7
...@@ -134,4 +134,5 @@ export enum API_PATHS { ...@@ -134,4 +134,5 @@ export enum API_PATHS {
getListDeposit = 'deposit', getListDeposit = 'deposit',
formalityDeposit = 'common/formalityDeposit', // danh sách hình thức đặt cọc formalityDeposit = 'common/formalityDeposit', // danh sách hình thức đặt cọc
configHomeProduct = 'config/home/product', configHomeProduct = 'config/home/product',
artistFeaturedProduct= 'artist/featuredProduct'
} }
...@@ -177,8 +177,6 @@ ...@@ -177,8 +177,6 @@
<q-separator /> <q-separator />
<q-tab-panels v-model="tabContent" animated> <q-tab-panels v-model="tabContent" animated>
<q-tab-panel <q-tab-panel
v-for="(info, index) in languageOptions" v-for="(info, index) in languageOptions"
...@@ -195,7 +193,6 @@ ...@@ -195,7 +193,6 @@
toolbar-bg="primary" toolbar-bg="primary"
style="height: 100%" style="height: 100%"
:definitions="{ :definitions="{
upload: { upload: {
tip: 'Upload to cloud', tip: 'Upload to cloud',
icon: 'cloud_upload', icon: 'cloud_upload',
...@@ -302,7 +299,7 @@ ...@@ -302,7 +299,7 @@
> >
</q-btn> </q-btn>
</template> </template>
</q-editor> </q-editor>
</q-tab-panel> </q-tab-panel>
</q-tab-panels> </q-tab-panels>
</div> </div>
...@@ -335,8 +332,17 @@ ...@@ -335,8 +332,17 @@
<script lang="ts"> <script lang="ts">
import { defineComponent, PropType, ref, Ref } from 'vue'; import { defineComponent, PropType, ref, Ref } from 'vue';
import { i18n } from 'src/boot/i18n'; import { i18n } from 'src/boot/i18n';
import { config } from 'src/assets/configurations.example';
import { API_PATHS } from 'src/assets/configurations.example';
import { AxiosResponse } from 'axios';
import { api, BaseResponseBody } from 'src/boot/axios';
import { FileUploadType } from 'src/assets/type';
export type AvatarType = {
file?: File;
url?: string | null;
};
export default defineComponent({ export default defineComponent({
props: { props: {
...@@ -349,7 +355,7 @@ export default defineComponent({ ...@@ -349,7 +355,7 @@ export default defineComponent({
name: { type: String, required: true }, name: { type: String, required: true },
category: { type: Number, required: true }, category: { type: Number, required: true },
categoryOptions: { type: Array, required: true }, categoryOptions: { type: Array, required: true },
status: { type: Number, required: true }, status: { type: Number, required: true },
languageOptions: { languageOptions: {
type: Array as PropType< type: Array as PropType<
...@@ -372,7 +378,7 @@ export default defineComponent({ ...@@ -372,7 +378,7 @@ export default defineComponent({
methods: {}, methods: {},
setup(_, context) { setup(_, context) {
const avatarUploaded: Ref<string> = ref('');
const uploadImage = ref(null); const uploadImage = ref(null);
const uploadFile = () => { const uploadFile = () => {
// eslint-disable-next-line // eslint-disable-next-line
...@@ -388,6 +394,28 @@ export default defineComponent({ ...@@ -388,6 +394,28 @@ export default defineComponent({
}); });
}; };
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, // pro
method: 'POST',
data: bodyFormData,
})) as AxiosResponse<BaseResponseBody<FileUploadType>>;
if (response.data.error.code === config.API_RES_CODE.OK.code) {
return response.data.data.fileName;
} else {
return '';
}
} catch (error) {
return '';
}
};
const insertImg = () => { const insertImg = () => {
// eslint-disable-next-line // eslint-disable-next-line
// @ts-ignore // @ts-ignore
...@@ -396,24 +424,31 @@ export default defineComponent({ ...@@ -396,24 +424,31 @@ export default defineComponent({
const input = document.createElement('input'); const input = document.createElement('input');
input.type = 'file'; input.type = 'file';
input.accept = '.png, .jpg'; // file extensions allowed input.accept = '.png, .jpg'; // file extensions allowed
input.onchange = (e) => { input.onchange = (e) => {
// const div = `<img src="${url}>`
const files = (<HTMLInputElement & EventTarget>e.target).files; const files = (<HTMLInputElement & EventTarget>e.target).files;
// eslint-disable-next-line // eslint-disable-next-line
// @ts-ignore // @ts-ignore
// eslint-disable-next-line // eslint-disable-next-line
const url = URL.createObjectURL(files[0]); const file = files[0]
// eslint-disable-next-line // eslint-disable-next-line
// @ts-ignore // @ts-ignore
// eslint-disable-next-line // eslint-disable-next-line
document.execCommand( avatarUploaded.value = callApiUploadAvatar(
file
).then(res => {
console.log(res,'res')
document.execCommand(
'insertHTML', 'insertHTML',
true, true,
'<div><img src="' + url + '" /></div>' '<div><img src="' + config.API_IMAGE_ENDPOINT + res + '" /></div>'
); );
})
// eslint-disable-next-line
// @ts-ignore
// eslint-disable-next-line
}; };
input.click(); input.click();
}; };
...@@ -447,11 +482,11 @@ export default defineComponent({ ...@@ -447,11 +482,11 @@ export default defineComponent({
const tab = ref('vi'); const tab = ref('vi');
const tabContent = ref('vi'); const tabContent = ref('vi');
return { return {
nameRules, nameRules,
imageRules, imageRules,
selectedFile, selectedFile,
callApiUploadAvatar,
categoryRules, categoryRules,
uploadImage, uploadImage,
upload, upload,
......
...@@ -3,8 +3,11 @@ import { defineComponent, Ref, ref } from 'vue'; ...@@ -3,8 +3,11 @@ import { defineComponent, Ref, ref } from 'vue';
import Pagination from 'components/pagination/index.vue'; import Pagination from 'components/pagination/index.vue';
import { ProductType } from 'src/assets/type'; import { ProductType } from 'src/assets/type';
import { HotProductStatus } from 'src/assets/enums'; import { HotProductStatus } from 'src/assets/enums';
import { config } from 'src/assets/configurations.example';
import { Dialog, Notify } from 'quasar'; import { Dialog, Notify } from 'quasar';
import { AxiosResponse } from 'axios';
import { config, API_PATHS } from 'src/assets/configurations.example';
import { api, BaseResponseBody } from 'src/boot/axios';
export default defineComponent({ export default defineComponent({
components: { components: {
Pagination, Pagination,
...@@ -102,7 +105,8 @@ export default defineComponent({ ...@@ -102,7 +105,8 @@ export default defineComponent({
}; };
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
const showHiden = (index: any) => {
const showHiden = (index: any) => {
Dialog.create({ Dialog.create({
title: i18n.global.t( title: i18n.global.t(
'managingUnit.confirmActionsTitle.confirmDeleteManagingUnitsTitle' 'managingUnit.confirmActionsTitle.confirmDeleteManagingUnitsTitle'
...@@ -113,20 +117,30 @@ export default defineComponent({ ...@@ -113,20 +117,30 @@ export default defineComponent({
'managingUnit.confirmActionsTitle.confirmDeleteManagingUnitsCancelBtnLabel' 'managingUnit.confirmActionsTitle.confirmDeleteManagingUnitsCancelBtnLabel'
), ),
color: 'negative', color: 'negative',
}).onOk(() => { }).onOk( () => {
context.emit('click:updateStatusHot'); void deleteBanner(index);
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
console.log(index.id,'index') });
}
const deleteBanner = async (index: {id: number, isFeaturedOnHomepage :number}) =>{
try {
const deleteResult = (await api({
url: API_PATHS.artistFeaturedProduct,
method: 'GET',
params: {
id: index?.id,
isFeaturedOnHomepage: index?.isFeaturedOnHomepage === 1 ? 0 : 1 ,
},
})) as AxiosResponse<BaseResponseBody<unknown>>;
if (deleteResult.data.error.code === config.API_RES_CODE.OK.code) {
context.emit('click:updateStatusHot');
Notify.create({ Notify.create({
type: 'positive', type: 'positive',
message: 'Thay đổi trạng thái thành công', message: 'Thay đổi trạng thái thành công',
actions: [{ icon: 'close', color: 'white' }], actions: [{ icon: 'close', color: 'white' }],
}); });
}); }
} catch (error) {}
} }
......
...@@ -383,9 +383,18 @@ ...@@ -383,9 +383,18 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, PropType } from 'vue';
import { i18n } from 'src/boot/i18n';
import { i18n } from 'src/boot/i18n';
import { config } from 'src/assets/configurations.example';
import { API_PATHS } from 'src/assets/configurations.example';
import { AxiosResponse } from 'axios';
import { api, BaseResponseBody } from 'src/boot/axios';
import { FileUploadType } from 'src/assets/type';
import { defineComponent, PropType, ref, Ref } from 'vue';
export type AvatarType = {
file?: File;
url?: string | null;
};
export default defineComponent({ export default defineComponent({
props: { props: {
isOpened: { isOpened: {
...@@ -419,6 +428,29 @@ export default defineComponent({ ...@@ -419,6 +428,29 @@ export default defineComponent({
}, },
}, },
setup() { setup() {
const avatarUploaded: Ref<string> = ref('');
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, // pro
method: 'POST',
data: bodyFormData,
})) as AxiosResponse<BaseResponseBody<FileUploadType>>;
if (response.data.error.code === config.API_RES_CODE.OK.code) {
return response.data.data.fileName;
} else {
return '';
}
} catch (error) {
return '';
}
};
const selectedFile = () => { const selectedFile = () => {
// eslint-disable-next-line // eslint-disable-next-line
// @ts-ignore // @ts-ignore
...@@ -428,23 +460,31 @@ export default defineComponent({ ...@@ -428,23 +460,31 @@ export default defineComponent({
input.type = 'file'; input.type = 'file';
input.accept = '.png, .jpg'; // file extensions allowed input.accept = '.png, .jpg'; // file extensions allowed
input.onchange = (e) => { input.onchange = (e) => {
// const div = `<img src="${url}>`
const files = (<HTMLInputElement & EventTarget>e.target).files; const files = (<HTMLInputElement & EventTarget>e.target).files;
// eslint-disable-next-line // eslint-disable-next-line
// @ts-ignore // @ts-ignore
// eslint-disable-next-line // eslint-disable-next-line
const url = URL.createObjectURL(files[0]); const file = files[0]
// eslint-disable-next-line // eslint-disable-next-line
// @ts-ignore // @ts-ignore
// eslint-disable-next-line // eslint-disable-next-line
document.execCommand( avatarUploaded.value = callApiUploadAvatar(
file
).then(res => {
console.log(res,'res')
document.execCommand(
'insertHTML', 'insertHTML',
true, true,
'<div><img src="' + url + '" /></div>' '<div><img src="' + config.API_IMAGE_ENDPOINT + res + '" /></div>'
); );
})
// eslint-disable-next-line
// @ts-ignore
// eslint-disable-next-line
}; };
input.click(); input.click();
}; };
......
...@@ -71,9 +71,6 @@ ...@@ -71,9 +71,6 @@
isUpdate isUpdate
@saveBannerInfo="addBanner" @saveBannerInfo="addBanner"
/> --> /> -->
</div> </div>
</template> </template>
...@@ -86,9 +83,8 @@ import { api, BaseResponseBody } from 'src/boot/axios'; ...@@ -86,9 +83,8 @@ import { api, BaseResponseBody } from 'src/boot/axios';
import { import {
PaginationResponse, PaginationResponse,
FileUploadType, FileUploadType,
ListBannerConfig,
DetailBannerConfig, DetailBannerConfig,
ListHomeConfig, ListHomeConfig,
AddBannerConfig, AddBannerConfig,
} from 'src/assets/type'; } from 'src/assets/type';
import { config, API_PATHS } from 'src/assets/configurations.example'; import { config, API_PATHS } from 'src/assets/configurations.example';
...@@ -114,7 +110,7 @@ export default defineComponent({ ...@@ -114,7 +110,7 @@ export default defineComponent({
required: true, required: true,
label: 'Tên sản phẩm', label: 'Tên sản phẩm',
headerStyle: 'text-align: center !important; width: 10%', headerStyle: 'text-align: center !important; width: 10%',
align: 'left', align: 'left',
sortable: false, sortable: false,
}, },
...@@ -133,7 +129,7 @@ export default defineComponent({ ...@@ -133,7 +129,7 @@ export default defineComponent({
required: true, required: true,
label: 'Tên nghệ sỹ', label: 'Tên nghệ sỹ',
align: 'center', align: 'center',
headerStyle: 'width: 10%', headerStyle: 'width: 10%',
sortable: false, sortable: false,
}, },
{ {
...@@ -144,7 +140,6 @@ export default defineComponent({ ...@@ -144,7 +140,6 @@ export default defineComponent({
headerStyle: 'text-align: center !important; width: 25%', headerStyle: 'text-align: center !important; width: 25%',
align: 'left', align: 'left',
sortable: false, sortable: false,
}, },
{ {
name: 'imageUrl', name: 'imageUrl',
...@@ -155,7 +150,7 @@ export default defineComponent({ ...@@ -155,7 +150,7 @@ export default defineComponent({
), ),
align: 'center', align: 'center',
sortable: false, sortable: false,
headerStyle:'width: 25%' headerStyle: 'width: 25%',
}, },
{ {
name: 'action', name: 'action',
...@@ -164,7 +159,7 @@ export default defineComponent({ ...@@ -164,7 +159,7 @@ export default defineComponent({
label: i18n.global.t('artist.bankAccount.tableColumnsBank.action'), label: i18n.global.t('artist.bankAccount.tableColumnsBank.action'),
align: 'center', align: 'center',
sortable: false, sortable: false,
headerStyle:'width: 5%' headerStyle: 'width: 5%',
}, },
]; ];
...@@ -210,7 +205,8 @@ export default defineComponent({ ...@@ -210,7 +205,8 @@ export default defineComponent({
title: i18n.global.t( title: i18n.global.t(
'banner.confirmActionsTitle.confirmDeleteBannerTitle' 'banner.confirmActionsTitle.confirmDeleteBannerTitle'
), ),
message: 'Bạn chắc chắn muốn xóa sản phẩm này khỏi danh sách nổi bật không?', message:
'Bạn chắc chắn muốn xóa sản phẩm này khỏi danh sách nổi bật không?',
cancel: i18n.global.t( cancel: i18n.global.t(
'banner.confirmActionsTitle.confirmDeleteBannerCancelBtnLabel' 'banner.confirmActionsTitle.confirmDeleteBannerCancelBtnLabel'
), ),
...@@ -224,16 +220,17 @@ export default defineComponent({ ...@@ -224,16 +220,17 @@ export default defineComponent({
const deleteBanner = async (id: number) => { const deleteBanner = async (id: number) => {
try { try {
const deleteResult = (await api({ const deleteResult = (await api({
url: API_PATHS.deleteBanner, url: API_PATHS.artistFeaturedProduct,
method: 'GET', method: 'GET',
params: { params: {
id: id, id: id,
isFeaturedOnHomepage: 0,
}, },
})) as AxiosResponse<BaseResponseBody<unknown>>; })) as AxiosResponse<BaseResponseBody<unknown>>;
if (deleteResult.data.error.code === config.API_RES_CODE.OK.code) { if (deleteResult.data.error.code === config.API_RES_CODE.OK.code) {
Notify.create({ Notify.create({
type: 'positive', type: 'positive',
message: i18n.global.t('banner.actionMessages.deleteBannerAccess'), message: 'Xóa thành công',
}); });
void configHomeProduct(); void configHomeProduct();
} }
...@@ -275,8 +272,6 @@ export default defineComponent({ ...@@ -275,8 +272,6 @@ export default defineComponent({
} }
}; };
//gọi api detail //gọi api detail
const getDetailBanner = async (id: number) => { const getDetailBanner = async (id: number) => {
try { try {
...@@ -298,11 +293,6 @@ export default defineComponent({ ...@@ -298,11 +293,6 @@ export default defineComponent({
} catch (error) {} } catch (error) {}
}; };
const setAvatar = (value: { file?: File; url?: string }) => { const setAvatar = (value: { file?: File; url?: string }) => {
avatarFile.value = value.file as File; avatarFile.value = value.file as File;
image.value = value.url as string; image.value = value.url as string;
...@@ -342,7 +332,7 @@ export default defineComponent({ ...@@ -342,7 +332,7 @@ export default defineComponent({
}); });
return { return {
addBannerDialogIsOpened, addBannerDialogIsOpened,
bannerTableColumns, bannerTableColumns,
bannerTableRows, bannerTableRows,
configHomeProduct, configHomeProduct,
...@@ -357,9 +347,9 @@ export default defineComponent({ ...@@ -357,9 +347,9 @@ export default defineComponent({
addBanner, addBanner,
confirmDeleteBanner, confirmDeleteBanner,
deleteBanner, deleteBanner,
getDetailBanner, getDetailBanner,
nameBanner, nameBanner,
image, image,
numIndex, numIndex,
...@@ -369,7 +359,6 @@ export default defineComponent({ ...@@ -369,7 +359,6 @@ export default defineComponent({
configImg, configImg,
avatarUploaded, avatarUploaded,
bannerId, bannerId,
}; };
}, },
}); });
......
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