Merge pull request 'Catalog view refactor' (!145) from wbuezas/hedera-web-mindshore:feature/catalog-view into beta
gitea/hedera-web/pipeline/head There was a failure building this commit Details

Reviewed-on: #145
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
This commit is contained in:
Javier Segarra 2025-04-22 09:57:49 +00:00
commit 9c0ec3e29d
3 changed files with 40 additions and 90 deletions

View File

@ -53,6 +53,12 @@ const search = async () => {
return; return;
} }
if (props.searchFn) {
const data = await props.searchFn(searchTerm.value);
emit('onSearch', data);
return;
}
if (props.url) { if (props.url) {
const params = { const params = {
filter: props.filter, filter: props.filter,

View File

@ -37,7 +37,7 @@ const { t } = useI18n();
> >
<div class="column" style="margin-bottom: auto"> <div class="column" style="margin-bottom: auto">
<div class="text-subtitle2 ellipsis-2-lines"> <div class="text-subtitle2 ellipsis-2-lines">
{{ item.name }} {{ item.item }}
</div> </div>
<div <div
class="row justify-between text-uppercase text-subtitle1 text-grey-7" class="row justify-between text-uppercase text-subtitle1 text-grey-7"
@ -76,7 +76,7 @@ const { t } = useI18n();
</div> </div>
<div class="row justify-between items-cente q-gutter-x-xs"> <div class="row justify-between items-cente q-gutter-x-xs">
<QBadge <QBadge
:label="`x${item?.prices[0]?.grouping}`" :label="`x${item.grouping}`"
color="grey-4" color="grey-4"
class="col-2 justify-end text-body2" class="col-2 justify-end text-body2"
> >

View File

@ -13,7 +13,7 @@ import { useRoute, useRouter } from 'vue-router';
import VnImg from 'src/components/ui/VnImg.vue'; import VnImg from 'src/components/ui/VnImg.vue';
import VnSelect from 'src/components/common/VnSelect.vue'; import VnSelect from 'src/components/common/VnSelect.vue';
import CatalogCard from 'src/pages/Ecomerce/CatalogCard.vue'; import CatalogCard from 'src/pages/Ecomerce/CatalogCard.vue';
import VnSearchBar from 'src/components/ui/VnSearchBar.vue'; import VnSearchBar from 'src/components/ui/NewVnSearchBar.vue';
import { useAppStore } from 'stores/app'; import { useAppStore } from 'stores/app';
import { useUserStore } from 'stores/user'; import { useUserStore } from 'stores/user';
@ -21,7 +21,6 @@ import { storeToRefs } from 'pinia';
import { formatDateTitle, currency } from 'src/lib/filters.js'; import { formatDateTitle, currency } from 'src/lib/filters.js';
import useNotify from 'src/composables/useNotify.js'; import useNotify from 'src/composables/useNotify.js';
import debounce from 'src/utils/debouncer.js'; import debounce from 'src/utils/debouncer.js';
import { fetch } from 'src/composables/serviceUtils';
const jApi = inject('jApi'); const jApi = inject('jApi');
const api = inject('api'); const api = inject('api');
@ -58,99 +57,49 @@ const producer = ref(null);
const origin = ref(null); const origin = ref(null);
const subcategory = ref(null); const subcategory = ref(null);
// Order by options // Order by options
const orderBy = ref({
field: 'relevancy DESC, name', const orderBy = ref('i.relevancy DESC, longName');
way: 'ASC',
isTag: false
});
const orderByOptions = ref([ const orderByOptions = ref([
{ {
label: t('relevancy'), label: t('relevancy'),
value: { value: 'i.relevancy DESC, longName'
field: 'relevancy DESC, name',
way: 'ASC',
isTag: false
}
}, },
{ {
label: t('name'), label: t('name'),
value: { value: 'longName ASC'
field: 'name',
way: 'ASC',
isTag: false
}
}, },
{ {
label: t('lowerSize'), label: t('lowerSize'),
value: { value: 'size ASC'
field: 'i.size',
way: 'ASC',
isTag: false
}
}, },
{ {
label: t('higherSize'), label: t('higherSize'),
value: { value: 'size DESC'
field: 'i.size',
way: 'DESC',
isTag: false
}
}, },
{ {
label: t('lowerPrice'), label: t('lowerPrice'),
value: { value: 'price ASC'
field: 'price',
way: 'ASC',
isTag: false
}
}, },
{ {
label: t('higherPrice'), label: t('higherPrice'),
value: { value: 'price DESC'
field: 'price',
way: 'DESC',
isTag: false
}
}, },
{ {
label: t('available'), label: t('available'),
value: { value: 'available'
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'), label: t('producer'),
value: { value: 'producer ASC'
field: 'producerFk',
way: 'ASC',
isTag: false
}
}, },
{ {
label: t('origin'), label: t('origin'),
value: { value: 'origin ASC'
field: 'originFk',
way: 'ASC',
isTag: false
}
}, },
{ {
label: t('category'), label: t('category'),
value: { value: 'category ASC'
field: 'categoryFk',
way: 'ASC',
isTag: false
}
} }
]); ]);
@ -241,11 +190,7 @@ const selectedOrderBy = computed({
if (value) { if (value) {
orderBy.value = value; orderBy.value = value;
} else { } else {
orderBy.value = { orderBy.value = 'i.relevancy DESC, longName';
field: 'relevancy DESC, name',
way: 'ASC',
isTag: false
};
} }
debouncedGetItems(); debouncedGetItems();
} }
@ -323,44 +268,42 @@ const getFilters = async () => {
await Promise.allSettled(promises); await Promise.allSettled(promises);
}; };
const getItemExprBuilder = (param, value) => { const getItems = async searchValue => {
if (param === 'orderFk' || param === 'orderBy') return;
else return { [param]: value };
};
const getItems = async () => {
try { try {
if (!basketOrderId.value || !isSomeFilterSelected.value) return; if (
!basketOrderId.value ||
!isSomeFilterSelected.value ||
loading.value
)
return;
loading.value = true; loading.value = true;
const params = { const params = {
orderFk: basketOrderId.value, orderFk: basketOrderId.value,
orderBy: JSON.stringify({ orderBy: selectedOrderBy.value,
field: selectedOrderBy.value.field, search: searchValue,
way: selectedOrderBy.value.way,
isTag: selectedOrderBy.value.isTag
}),
typeFk: selectedType.value,
categoryFk: selectedCategory.value, categoryFk: selectedCategory.value,
typeFk: selectedType.value,
inkFk: selectedColor.value, inkFk: selectedColor.value,
producerFk: selectedProducer.value, producerFk: selectedProducer.value,
originFk: selectedOrigin.value originFk: selectedOrigin.value
}; };
const { data } = await fetch({
url: 'Orders/catalogFilter', const { data } = await api.get('Items/catalog', {
params, params
exprBuilder: getItemExprBuilder
}); });
items.value = data; items.value = data;
await onItemsFetched(); await onItemsFetched();
loading.value = false; loading.value = false;
return data;
} catch (error) { } catch (error) {
console.error('Error getting items:', error); console.error('Error getting items:', error);
} }
}; };
const debouncedGetItems = debounce(getItems, 400); const debouncedGetItems = searchValue => debounce(getItems(searchValue), 400);
const debouncedGetFilters = debounce(getFilters, 400); const debouncedGetFilters = debounce(getFilters, 400);
const getOrder = async () => { const getOrder = async () => {
@ -749,6 +692,7 @@ onBeforeUnmount(() => appStore.resetCustomTitle());
<Teleport v-if="isHeaderMounted" to="#actions"> <Teleport v-if="isHeaderMounted" to="#actions">
<div class="row"> <div class="row">
<VnSearchBar <VnSearchBar
:search-fn="debouncedGetItems"
@on-search-error=" @on-search-error="
() => { () => {
items = []; items = [];