From 47a5abf1e359bd7d9c566ed291f01593e1b20a12 Mon Sep 17 00:00:00 2001 From: wbuezas Date: Tue, 1 Apr 2025 16:43:06 +0200 Subject: [PATCH 01/12] WIP --- src/pages/Ecomerce/CatalogView.vue | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/pages/Ecomerce/CatalogView.vue b/src/pages/Ecomerce/CatalogView.vue index 92a63858..a5fe7c11 100644 --- a/src/pages/Ecomerce/CatalogView.vue +++ b/src/pages/Ecomerce/CatalogView.vue @@ -328,6 +328,7 @@ import useNotify from 'src/composables/useNotify.js'; import debounce from 'src/utils/debouncer.js'; const jApi = inject('jApi'); +const api = inject('api'); const { t } = useI18n(); const appStore = useAppStore(); const userStore = useUserStore(); @@ -621,14 +622,29 @@ const debouncedGetFilters = debounce(getFilters, 400); const getOrder = async () => { try { if (!basketOrderId.value) return; - const [data] = await jApi.query( - `SELECT o.id, o.sent, ad.nickname, o.addressFk, o.agencyModeFk - FROM myOrder o - LEFT JOIN myAddress ad ON ad.id = o.addressFk - WHERE o.id = #orderId`, - { orderId: basketOrderId.value } - ); + order.value = data; + const filter = { + include: [ + { + relation: 'address', + scope: { + fields: ['nickname', 'city', 'street'] + } + } + ], + where: { + id: basketOrderId.value + }, + fields: ['id', 'sent', 'addressFk', 'agencyModeFk', 'nickname'] + }; + + const { data } = await api.get('Orders', { + params: { + filter: JSON.stringify(filter), + orderFk: basketOrderId.value + } + }); } catch (error) { console.error('Error getting order:', error); } From 509a7870a93c023d968e10756e5303cb17715505 Mon Sep 17 00:00:00 2001 From: wbuezas Date: Wed, 2 Apr 2025 15:20:25 +0200 Subject: [PATCH 02/12] WIP --- src/pages/Ecomerce/CatalogCard.vue | 4 +- src/pages/Ecomerce/CatalogView.vue | 150 ++++++++++++++++------------- 2 files changed, 85 insertions(+), 69 deletions(-) diff --git a/src/pages/Ecomerce/CatalogCard.vue b/src/pages/Ecomerce/CatalogCard.vue index 9c93495b..0e795c2f 100644 --- a/src/pages/Ecomerce/CatalogCard.vue +++ b/src/pages/Ecomerce/CatalogCard.vue @@ -37,7 +37,7 @@ const { t } = useI18n(); >
- {{ item.item }} + {{ item.name }}
diff --git a/src/pages/Ecomerce/CatalogView.vue b/src/pages/Ecomerce/CatalogView.vue index a5fe7c11..07a1d12b 100644 --- a/src/pages/Ecomerce/CatalogView.vue +++ b/src/pages/Ecomerce/CatalogView.vue @@ -92,7 +92,7 @@ @click="selectedCategory = cat.id" data-cy="catalogCategoryButton" > - + {{ cat.name }}
@@ -577,38 +577,26 @@ const getItems = async () => { if (!basketOrderId.value || !isSomeFilterSelected.value) return; loading.value = true; - const res = await jApi.execQuery( - `DROP TEMPORARY TABLE IF EXISTS tmp.item; - CREATE TEMPORARY TABLE tmp.item - (INDEX (itemFk)) - ENGINE = MEMORY - SELECT i.id itemFk - FROM vn.item i - JOIN vn.itemType t ON t.id = i.typeFk - WHERE (${queryFilter.value}); - CALL myOrder_calcCatalogFull(#orderId); - SELECT i.id, i.longName item, i.subName, - i.tag5, i.value5, i.tag6, i.value6, - i.tag7, i.value7, i.tag8, i.value8, - i.relevancy, i.size, i.category, b.minQuantity, - k.name ink, p.name producer, o.name origin, - b.available, b.price, b.grouping, - i.image, im.updated - FROM tmp.ticketCalculateItem b - JOIN vn.item i ON i.id = b.itemFk - LEFT JOIN vn.ink k ON k.id = i.inkFk - LEFT JOIN vn.producer p ON p.id = i.producerFk - LEFT JOIN vn.origin o ON o.id = i.originFk - LEFT JOIN image im ON im.collectionFk = 'catalog' - AND im.name = i.image - WHERE b.available > 0 - ORDER BY ${selectedOrderBy.value} - LIMIT 5000; - DROP TEMPORARY TABLE tmp.item; - CALL vn.ticketCalculatePurge();`, - { orderId: basketOrderId.value } - ); - items.value = res.results[3].data; + const { data } = await api.get('Orders/catalogFilter', { + params: { + orderFk: basketOrderId.value, + orderBy: JSON.stringify({ + field: 'relevancy DESC, name', + way: 'ASC', + isTag: false + }), + filter: { + where: { + and: [ + { typeFk: selectedType.value }, + { categoryFk: selectedCategory.value } + ] + } + } + } + }); + + items.value = data; await onItemsFetched(); loading.value = false; } catch (error) { @@ -623,7 +611,6 @@ const getOrder = async () => { try { if (!basketOrderId.value) return; - order.value = data; const filter = { include: [ { @@ -645,6 +632,8 @@ const getOrder = async () => { orderFk: basketOrderId.value } }); + + order.value = data; } catch (error) { console.error('Error getting order:', error); } @@ -652,13 +641,25 @@ const getOrder = async () => { const getCategories = async () => { try { - categories.value = await jApi.query( - `SELECT c.id, l.name, c.color, c.code - FROM vn.itemCategory c - JOIN vn.itemCategoryL10n l ON l.id = c.id - WHERE c.display - ORDER BY display` - ); + const { data } = await api.get('itemCategories', { + params: { + filter: JSON.stringify({ + order: 'display ASC', + include: { + relation: 'itemTypes', + scope: { + fields: ['code', 'name'] + } + } + }) + } + }); + categories.value = data.map(category => { + return { + ...category, + icon: category.icon.split('-')[1] + }; + }); } catch (error) { console.error('Error getting categories:', error); } @@ -667,23 +668,15 @@ const getCategories = async () => { const getItemFamilies = async () => { try { if (!selectedCategory.value || !basketOrderId.value) return; - const res = await jApi.execQuery( - `CALL myOrder_getAvailable(#orderId); - SELECT DISTINCT t.id, l.name - FROM vn.item i - JOIN vn.itemType t ON t.id = i.typeFk - JOIN tmp.itemAvailable a ON a.id = i.id - JOIN vn.itemTypeL10n l ON l.id = t.id - WHERE t.order >= 0 - AND t.categoryFk = #category - ORDER BY t.order, l.name ASC; - DROP TEMPORARY TABLE tmp.itemAvailable`, + + const { data } = await api.get( + `Orders/${basketOrderId.value}/getItemTypeAvailable`, { - category: selectedCategory.value, - orderId: basketOrderId.value + params: { itemCategoryId: selectedCategory.value } } ); - itemFamilies.value = res.results[1].data; + + itemFamilies.value = data; } catch (error) { console.error('Error getting available items:', error); } @@ -706,7 +699,19 @@ const getItemColors = async () => { orderId: basketOrderId.value } ); + + // const { data } = await api.get('Inks', { + // params: { + // filter: JSON.stringify({ + // where: { + // 't.categoryFk': selectedCategory.value + // } + // }) + // } + // }); + // console.log('ink data: ', data); itemColors.value = res.results[1].data; + // console.log('itemColors: ', itemColors.value); } catch (error) { console.error('Error getting available items:', error); } @@ -815,19 +820,30 @@ const onCategoryChange = () => { const getItemTags = async itemFk => { try { - const tags = await jApi.query( - `SELECT l.name, it.value - FROM vn.itemTag it - JOIN vn.tag t ON t.id = it.tagFk - JOIN vn.tagL10n l ON l.id = t.id - WHERE it.itemFk = #itemFk - AND priority >= 0 - ORDER BY it.priority`, - { - itemFk + const { data } = await api.get('ItemTags', { + params: { + filter: JSON.stringify({ + where: { + itemFk + }, + include: [ + { + relation: 'tag', + scope: { + fields: ['name'] + } + } + ] + }) } - ); - return tags; + }); + + return data.map(tag => { + return { + name: tag?.tag?.name, + value: tag.value + }; + }); } catch (error) { console.error('Error getting available items:', error); } From a1b54d50b5ef464acd4cace7d1f98818ad86ef65 Mon Sep 17 00:00:00 2001 From: wbuezas Date: Wed, 2 Apr 2025 15:37:12 +0200 Subject: [PATCH 03/12] Fix order by --- src/pages/Ecomerce/CatalogView.vue | 87 ++++++++++++++++++++++++------ 1 file changed, 71 insertions(+), 16 deletions(-) diff --git a/src/pages/Ecomerce/CatalogView.vue b/src/pages/Ecomerce/CatalogView.vue index 07a1d12b..3e8e959d 100644 --- a/src/pages/Ecomerce/CatalogView.vue +++ b/src/pages/Ecomerce/CatalogView.vue @@ -362,48 +362,99 @@ const producer = ref(null); const origin = ref(null); const subcategory = ref(null); // Order by options -const orderBy = ref('i.relevancy DESC, longName'); +const orderBy = ref({ + field: 'relevancy DESC, name', + way: 'ASC', + isTag: false +}); const orderByOptions = ref([ { label: t('relevancy'), - value: 'i.relevancy DESC, longName' + value: { + field: 'relevancy DESC, name', + way: 'ASC', + isTag: false + } }, { label: t('name'), - value: 'longName ASC' + value: { + field: 'name', + way: 'ASC', + isTag: false + } }, { label: t('lowerSize'), - value: 'size ASC' + value: { + field: 'i.size', + way: 'ASC', + isTag: false + } }, { label: t('higherSize'), - value: 'size DESC' + value: { + field: 'i.size', + way: 'DESC', + isTag: false + } }, { label: t('lowerPrice'), - value: 'price ASC' + value: { + field: 'price', + way: 'ASC', + isTag: false + } }, { label: t('higherPrice'), - value: 'price DESC' + value: { + field: 'price', + way: 'DESC', + isTag: false + } }, { label: t('available'), - value: 'available' + value: { + field: 'available', + way: 'ASC', + isTag: false + } + }, + { + label: t('color'), + value: { + field: 'i.inkFk', + way: 'ASC', + isTag: false + } }, - { label: t('color'), value: 'ink ASC' }, { label: t('producer'), - value: 'producer ASC' + value: { + field: 'producerFk', + way: 'ASC', + isTag: false + } }, { label: t('origin'), - value: 'origin ASC' + value: { + field: 'originFk', + way: 'ASC', + isTag: false + } }, { label: t('category'), - value: 'category ASC' + value: { + field: 'categoryFk', + way: 'ASC', + isTag: false + } } ]); @@ -494,7 +545,11 @@ const selectedOrderBy = computed({ if (value) { orderBy.value = value; } else { - orderBy.value = 'i.relevancy DESC, longName'; + orderBy.value = { + field: 'relevancy DESC, name', + way: 'ASC', + isTag: false + }; } debouncedGetItems(); } @@ -581,9 +636,9 @@ const getItems = async () => { params: { orderFk: basketOrderId.value, orderBy: JSON.stringify({ - field: 'relevancy DESC, name', - way: 'ASC', - isTag: false + field: selectedOrderBy.value.field, + way: selectedOrderBy.value.way, + isTag: selectedOrderBy.value.isTag }), filter: { where: { From f23e7c134fdb222a47ba4ce3e134a9ee7ed149f6 Mon Sep 17 00:00:00 2001 From: wbuezas Date: Thu, 3 Apr 2025 11:27:53 +0200 Subject: [PATCH 04/12] Migrate the rest of jApi calls in address list --- src/pages/Account/AddressList.vue | 29 +++++++++++++---------------- src/stores/user.js | 5 ++++- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/pages/Account/AddressList.vue b/src/pages/Account/AddressList.vue index 9939c926..50bb7de9 100644 --- a/src/pages/Account/AddressList.vue +++ b/src/pages/Account/AddressList.vue @@ -14,7 +14,6 @@ import { storeToRefs } from 'pinia'; import { useUserStore } from 'stores/user'; const router = useRouter(); -const jApi = inject('jApi'); const api = inject('api'); const { notify } = useNotify(); const { t } = useI18n(); @@ -26,32 +25,30 @@ const fetchAddressesRef = ref(null); const addresses = ref([]); const defaultAddress = ref(null); -const clientId = ref(null); const goToAddressDetails = (id = 0) => router.push({ name: 'addressDetails', params: { id } }); const getDefaultAddress = async () => { try { - const [address] = await jApi.query( - 'SELECT id, defaultAddressFk FROM myClient c' - ); - defaultAddress.value = address.defaultAddressFk; - clientId.value = address.id; + const filter = { fields: ['defaultAddressFk'] }; + const { data } = await api.get(`Clients/${userStore?.userId}`, { + params: { filter: JSON.stringify(filter) } + }); + defaultAddress.value = data.defaultAddressFk; } catch (error) { console.error('Error getting default address:', error); } }; -const changeDefaultAddress = async () => { - if (!clientId.value) return; - await jApi.execQuery( - `UPDATE myClient - SET defaultAddressFk = #defaultAddress - WHERE id = #id;`, +const changeDefaultAddress = async address => { + if (!userStore?.userId) return; + + await api.patch( + `/Clients/${userStore?.user?.id}/updateAddress/${address.id}`, { - defaultAddress: defaultAddress.value, - id: clientId.value + ...address, + defaultAddressFk: defaultAddress.value } ); notify(t('defaultAddressModified'), 'positive'); @@ -129,7 +126,7 @@ onMounted(async () => { v-model="defaultAddress" :val="address.id" class="q-mr-sm" - @update:model-value="changeDefaultAddress" + @update:model-value="changeDefaultAddress(address)" />