diff --git a/app/repos/productDescriptionRepo/productDescriptionRepo.go b/app/repos/productDescriptionRepo/productDescriptionRepo.go index 1b0faf8..4e42175 100644 --- a/app/repos/productDescriptionRepo/productDescriptionRepo.go +++ b/app/repos/productDescriptionRepo/productDescriptionRepo.go @@ -52,10 +52,10 @@ func (r *ProductDescriptionRepo) GetProductDescription(productID uint, productid // If it doesn't exist, returns an error. func (r *ProductDescriptionRepo) CreateIfDoesNotExist(productID uint, productid_lang uint) error { - record := model.ProductDescription{ - ProductID: productID, - ShopID: constdata.SHOP_ID, - LangID: productid_lang, + record := dbmodel.PsProductLang{ + IDProduct: int32(productID), + IDShop: int32(constdata.SHOP_ID), + IDLang: int32(productid_lang), } err := db.Get(). diff --git a/bo/src/components/admin/ProductDetailView.vue b/bo/src/components/admin/ProductDetailView.vue index f1dcb22..9ce994b 100644 --- a/bo/src/components/admin/ProductDetailView.vue +++ b/bo/src/components/admin/ProductDetailView.vue @@ -45,7 +45,7 @@ }" color="primary" class="text-white bg-(--accent-blue-light) dark:bg-(--accent-blue-dark) px-12!"> Cancel - Save diff --git a/bo/src/components/inner/CountryCurrencySwitch.vue b/bo/src/components/inner/CountryCurrencySwitch.vue index cb15e33..f51746c 100644 --- a/bo/src/components/inner/CountryCurrencySwitch.vue +++ b/bo/src/components/inner/CountryCurrencySwitch.vue @@ -1,34 +1,34 @@ - - diff --git a/bo/src/stores/product.ts b/bo/src/stores/product.ts index f1d6828..ebd028a 100644 --- a/bo/src/stores/product.ts +++ b/bo/src/stores/product.ts @@ -45,6 +45,7 @@ export const useProductStore = defineStore('product', () => { } } + const translat = ref() const settingStore = useSettingsStore() async function translateProductDescription(productID: number, toLangId: number, model: string = 'Google') { loading.value = true @@ -53,6 +54,7 @@ export const useProductStore = defineStore('product', () => { try { const response = await useFetchJson(`/api/v1/restricted/product-translation/translate-product-description?productID=${productID}&productFromLangID=${settingStore.shopDefaultLanguage}&productToLangID=${toLangId}&model=${model}`) productDescription.value = response.items + saveProductDescription(productID, toLangId) return response.items } catch (e: any) { error.value = e?.message || 'Failed to translate product description' @@ -62,16 +64,46 @@ export const useProductStore = defineStore('product', () => { } } + function fixHtml(html: string) { + return html + // 1. fix img + .replace(/]*?)>/g, '') - function stripHtml(html: string) { - const div = document.createElement('div') - div.innerHTML = html - return div.textContent || div.innerText || '' + // 2. escape text only + .replace(/>([^<]+) { + const escaped = text + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/'/g, ''') + + return `>${escaped}<` + }) } - async function saveProductDescription(productID?: number, langId?: number) { + function fixAll(obj: any): any { + if (typeof obj === 'string') { + return fixHtml(obj) + } + + if (Array.isArray(obj)) { + return obj.map(fixAll) + } + + if (typeof obj === 'object' && obj !== null) { + const result: any = {} + for (const [key, value] of Object.entries(obj)) { + result[key] = fixAll(value) + } + return result + } + + return obj + } + + async function saveProductDescription(productID?: number, langId?: number | null) { const id = productID || 1 const lang = langId || 1 + try { const data = await useFetchJson( `/api/v1/restricted/product-translation/save-product-description?productID=${id}&productLangID=${lang}`, @@ -81,14 +113,14 @@ export const useProductStore = defineStore('product', () => { 'Content-Type': 'application/json' }, body: JSON.stringify({ - name: stripHtml(productDescription.value?.name || ''), - description: stripHtml(productDescription.value?.description || ''), - description_short: stripHtml(productDescription.value?.description_short || ''), - meta_title: stripHtml(productDescription.value?.meta_title || ''), - meta_description: stripHtml(productDescription.value?.meta_description || ''), - available_now: stripHtml(productDescription.value?.available_now || ''), - available_later: stripHtml(productDescription.value?.available_later || ''), - usage: stripHtml(productDescription.value?.usage || ''), + name: productDescription.value?.name || '', + description: productDescription.value?.description || '', + description_short: productDescription.value?.description_short || '', + meta_title: productDescription.value?.meta_title || '', + meta_description: productDescription.value?.meta_description || '', + available_now: productDescription.value?.available_now || '', + available_later: productDescription.value?.available_later || '', + usage: productDescription.value?.usage || '', }) } ) @@ -102,6 +134,7 @@ export const useProductStore = defineStore('product', () => { productDescription, loading, error, + translat, translateProductDescription, getProductDescription, saveProductDescription