diff --git a/app/components/catalog/CatalogConfigurator.vue b/app/components/catalog/CatalogConfigurator.vue index c186331..398c418 100644 --- a/app/components/catalog/CatalogConfigurator.vue +++ b/app/components/catalog/CatalogConfigurator.vue @@ -8,6 +8,10 @@ import { } from '~/composables/graphql/generated'; import { useClientCart } from '~/composables/useClientCart'; +const props = defineProps<{ + productTypeSlug: string; +}>(); + type ProductNode = ClientProductsQuery['clientProducts'][number]; type CatalogProductTypeSettingNode = CatalogProductTypeSettingsQuery['catalogProductTypeSettings'][number]; type ParamFieldKey = 'widthMm' | 'lengthM' | 'thicknessMicron' | 'sleeveBrand' | 'quantityPerBox' | 'colorTag' | 'labelTag'; @@ -35,7 +39,6 @@ type GroupState = { quantityPerBox: string | null; colorTag: string | null; labelTag: string | null; - isExpanded: boolean; }; const COLOR_TAGS = ['прозрачный', 'коричневый', 'белый', 'черный', 'желтый', 'зеленый', 'красный', 'синий', 'оранжевый', 'красно-белый']; @@ -75,7 +78,6 @@ const coverPresets = [ const productsQuery = useQuery(ClientProductsDocument); const catalogSettingsQuery = useQuery(CatalogProductTypeSettingsDocument); -const search = ref(''); const groupStates = reactive>({}); const { addProduct, getQuantity, incrementQuantity, decrementQuantity } = useClientCart(); @@ -169,27 +171,9 @@ function compareProducts(a: ParsedProduct, b: ParsedProduct) { const parsedProducts = computed(() => { const list = productsQuery.result.value?.clientProducts ?? []; - const query = search.value.trim().toLowerCase(); return list .map(hydrateProduct) - .filter((product) => { - if (!query) { - return true; - } - - return [ - product.name, - product.sku, - product.productTypeLabel, - String(product.widthMm ?? ''), - String(product.lengthM ?? ''), - String(product.thicknessMicron ?? ''), - normalizeText(product.sleeveBrand), - normalizeText(product.quantityPerBox), - ...product.normalizedTags, - ].some((part) => part.toLowerCase().includes(query)); - }) .sort(compareProducts); }); @@ -278,6 +262,8 @@ function visibleFields(group: ProductGroup) { }); } +const selectedGroup = computed(() => productGroups.value.find((group) => group.key === props.productTypeSlug) ?? null); + function requiredKeys(group: ProductGroup) { return visibleFields(group).map((field) => field.key); } @@ -293,7 +279,6 @@ function createGroupState(group: ProductGroup): GroupState { quantityPerBox: firstProduct?.quantityPerBoxOptions[0] ?? null, colorTag: firstProduct?.colorTags[0] ?? null, labelTag: firstProduct?.labelTags[0] ?? null, - isExpanded: false, }; } @@ -472,21 +457,6 @@ function articleLabel(group: ProductGroup) { return selectedProduct(group)?.sku ?? '—'; } -function variantCountLabel(count: number) { - const mod10 = count % 10; - const mod100 = count % 100; - - if (mod10 === 1 && mod100 !== 11) { - return `${count} вариант`; - } - - if (mod10 >= 2 && mod10 <= 4 && !(mod100 >= 12 && mod100 <= 14)) { - return `${count} варианта`; - } - - return `${count} вариантов`; -} - function formatLengthRange(setting: CatalogProductTypeSettingNode) { if (!setting.customLengthMinM || !setting.customLengthMaxM || !setting.customLengthStepM) { return null; @@ -558,10 +528,6 @@ function customizationDetails(group: ProductGroup) { return details; } -function toggleExpanded(group: ProductGroup) { - getGroupState(group).isExpanded = !getGroupState(group).isExpanded; -} - function incrementProduct(product: ProductNode) { if (getQuantity(product.id) === 0) { addProduct({ @@ -602,26 +568,21 @@ function decrementSelected(group: ProductGroup) { diff --git a/app/components/catalog/CatalogProductTypeList.vue b/app/components/catalog/CatalogProductTypeList.vue new file mode 100644 index 0000000..ab29a37 --- /dev/null +++ b/app/components/catalog/CatalogProductTypeList.vue @@ -0,0 +1,222 @@ + + + diff --git a/app/pages/index.vue b/app/pages/index.vue index 2fca92b..874df8b 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -1,7 +1,7 @@ diff --git a/app/pages/products.vue b/app/pages/products.vue index 2fca92b..874df8b 100644 --- a/app/pages/products.vue +++ b/app/pages/products.vue @@ -1,7 +1,7 @@ diff --git a/app/pages/products/[slug].vue b/app/pages/products/[slug].vue new file mode 100644 index 0000000..c1f42a0 --- /dev/null +++ b/app/pages/products/[slug].vue @@ -0,0 +1,11 @@ + + +