diff --git a/src/views/catalog-product-details.vue b/src/views/catalog-product-details.vue index 363b7ad5..cc4b4953 100644 --- a/src/views/catalog-product-details.vue +++ b/src/views/catalog-product-details.vue @@ -22,23 +22,12 @@
- - {{ $t("Colors") }} + + {{ feature }} - - {{ colorFeature }} - - - - - - - {{ $t("Sizes") }} - - - - {{ sizeFeature }} + + {{ option }} @@ -442,8 +431,6 @@ export default defineComponent({ return { variantId: '', productId: '', - selectedColor: '', - selectedSize: '', features: [] as any, currentVariant: {} as any, poAndAtpDetails: {} as any, @@ -455,7 +442,8 @@ export default defineComponent({ listingJobRunTime: 0, backorderCategoryId: '', preOrderCategoryId: '', - isCtgryAndBrkrngJobsLoaded: false + isCtgryAndBrkrngJobsLoaded: false, + selectedFeatures: {} as any } }, computed: { @@ -491,57 +479,123 @@ export default defineComponent({ async getVariantDetails() { await this.store.dispatch('product/setCurrentCatalogProduct', { productId: this.productId}) if (this.product.variants) { + this.getVariant() this.getFeatures() await this.updateVariant() } }, - applyFeature(feature: string, type: string) { - if (type === 'color') this.selectedColor = feature - else if (type === 'size') this.selectedSize = feature + applyFeature(option: string, feature: string) { + const selectedFeatures = this.selectedFeatures + selectedFeatures[feature] = option + + const variant = this.product.variants.find((variant: any) => { + let isVariantAvailable = true + Object.entries(this.selectedFeatures).map((currentFeature, currentFeatureIndex) => { + if(getFeature(variant.featureHierarchy, `1/${currentFeature[0]}`) != currentFeature[1]){ + isVariantAvailable = false + } + }) + return isVariantAvailable + }) + + + if(!variant) { + const index = Object.keys(selectedFeatures).indexOf(feature) + + const availableVariants = this.product.variants.filter((variant: any) => { + let isVariantAvailable = true + Object.entries(selectedFeatures).map((currentFeature, currentFeatureIndex) => { + if(currentFeatureIndex <= index && getFeature(variant.featureHierarchy, `1/${currentFeature[0]}`) != currentFeature[1]){ + isVariantAvailable = false + } + }) + return isVariantAvailable + }) + + availableVariants[0].featureHierarchy.map((featureItem: any) => { + if(featureItem.startsWith('1/')){ + const featureItemSplitted = featureItem.split("/") + selectedFeatures[featureItemSplitted[1]] = featureItemSplitted[2] + } + }) + this.currentVariant = availableVariants[0] + this.selectedFeatures = selectedFeatures + showToast(translate("Selected variant not available. Reseting to first variant.")) + } + + this.getFeatures() this.updateVariant(); }, + getVariant() { + let selectedVariant = this.product.variants.find((variant: any) => variant.productId === this.variantId) + let selectedFeatures = {} as any; + + if(!selectedVariant) { + selectedVariant = this.product.variants[0] + showToast(translate("Selected variant not available. Reseting to first variant.")) + this.$route.query.variantId !== selectedVariant.productId && (this.router.replace({path: this.$route.path, query: { variantId: selectedVariant.productId } })); + } + + selectedVariant.featureHierarchy.map((featureItem: any) => { + if(featureItem.startsWith('1/')){ + const featureItemSplitted = featureItem.split("/") + selectedFeatures[featureItemSplitted[1]] = featureItemSplitted[2] + } + }) + + selectedFeatures = Object.keys(selectedFeatures).sort().reduce((result:any, key) => { + result[key] = selectedFeatures[key]; + return result; + }, {}); + + this.selectedFeatures = selectedFeatures + this.currentVariant = selectedVariant + }, getFeatures() { - const features = {} as any + const selectedFeatures = this.selectedFeatures + const firstFeature = Object.keys(selectedFeatures)[0] + + const features = {} as any; + this.product.variants.map((variant: any) => { - const size = getFeature(variant.featureHierarchy, '1/SIZE/') - const color = getFeature(variant.featureHierarchy, '1/COLOR/') - if (!features[color]) features[color] = [size] - else if (!features[color].includes(size)) features[color].push(size) + const featureOption = getFeature(variant.featureHierarchy, `1/${firstFeature}`) + if(!features[firstFeature]){ + features[firstFeature] = [featureOption] + } else{ + if(!features[firstFeature].includes(featureOption)) features[firstFeature].push(featureOption) + } }) - Object.keys(features).forEach((color) => this.features[color] = sortSizes(features[color])) + Object.entries(selectedFeatures).map((feature, featureIndex) => { + const nextFeature = Object.entries(selectedFeatures).find((currentFeature, currentFeatureIndex) => currentFeatureIndex === featureIndex + 1) - let selectedVariant = this.product.variants.find((variant: any) => variant.productId === this.variantId) + if(nextFeature) { + const nextFeatureCategory = nextFeature[0] - if (!selectedVariant) { - // if the variant does not have color or size as features - selectedVariant = this.product.variants[0] - showToast(translate("Selected variant not available. Reseting to first variant.")) - } + const availableVariants = this.product.variants.filter((variant: any) => { + let isVariantAvailable = true + Object.entries(this.selectedFeatures).map((currentFeature, currentFeatureIndex) => { + if(currentFeatureIndex <= featureIndex && getFeature(variant.featureHierarchy, `1/${currentFeature[0]}`) != currentFeature[1]){ + isVariantAvailable = false + } + }) + return isVariantAvailable + }) + + const nextFeatureOptions = [] as any + availableVariants.map((variant: any) => { + if(!nextFeatureOptions.includes(getFeature(variant.featureHierarchy , `1/${nextFeatureCategory}`))){ + nextFeatureOptions.push(getFeature(variant.featureHierarchy , `1/${nextFeatureCategory}`)) + } + }) - if (selectedVariant) { - this.selectedColor = getFeature(selectedVariant.featureHierarchy, '1/COLOR/') - this.selectedSize = getFeature(selectedVariant.featureHierarchy, '1/SIZE/') - } + features[nextFeatureCategory] = nextFeatureCategory === 'SIZE' ? sortSizes(nextFeatureOptions) : nextFeatureOptions + } + }) + + this.features = features }, async updateVariant() { - let variant - if (this.selectedColor || this.selectedSize) { - variant = this.product.variants.find((variant: any) => { - const hasSize = !this.selectedSize || (this.selectedSize && getFeature(variant.featureHierarchy, '1/SIZE/') === this.selectedSize) - const hasColor = !this.selectedColor || (this.selectedColor && getFeature(variant.featureHierarchy, '1/COLOR/') === this.selectedColor) - return hasSize && hasColor - }) - - // if the selected size is not available for that color, default it to the first size available - if (!variant) { - this.selectedSize = this.features[this.selectedColor][0]; - variant = this.product.variants.find((variant: any) => getFeature(variant.featureHierarchy, '1/SIZE/') === this.selectedSize) - showToast(translate("Selected variant not available")) - } - } - // if the variant does not have color or size as features - this.currentVariant = variant || this.product.variants[0] this.variantId = this.currentVariant.variantId this.$route.query.variantId !== this.currentVariant.productId && (this.router.replace({path: this.$route.path, query: { variantId: this.currentVariant.productId } })); await this.getPoDetails() @@ -550,6 +604,56 @@ export default defineComponent({ await this.prepareShopListings() await this.preparePoSummary() }, + // getFeatures() { + // const features = {} as any + // this.product.variants.map((variant: any) => { + // const size = getFeature(variant.featureHierarchy, '1/SIZE/') + // const color = getFeature(variant.featureHierarchy, '1/COLOR/') + // if (!features[color]) features[color] = [size] + // else if (!features[color].includes(size)) features[color].push(size) + // }) + + // Object.keys(features).forEach((color) => this.features[color] = sortSizes(features[color])) + + // let selectedVariant = this.product.variants.find((variant: any) => variant.productId === this.variantId) + + // if (!selectedVariant) { + // // if the variant does not have color or size as features + // selectedVariant = this.product.variants[0] + // showToast(translate("Selected variant not available. Reseting to first variant.")) + // } + + // if (selectedVariant) { + // this.selectedColor = getFeature(selectedVariant.featureHierarchy, '1/COLOR/') + // this.selectedSize = getFeature(selectedVariant.featureHierarchy, '1/SIZE/') + // } + // }, + // async updateVariant() { + // let variant + // if (this.selectedColor || this.selectedSize) { + // variant = this.product.variants.find((variant: any) => { + // const hasSize = !this.selectedSize || (this.selectedSize && getFeature(variant.featureHierarchy, '1/SIZE/') === this.selectedSize) + // const hasColor = !this.selectedColor || (this.selectedColor && getFeature(variant.featureHierarchy, '1/COLOR/') === this.selectedColor) + // return hasSize && hasColor + // }) + + // // if the selected size is not available for that color, default it to the first size available + // if (!variant) { + // this.selectedSize = this.features[this.selectedColor][0]; + // variant = this.product.variants.find((variant: any) => getFeature(variant.featureHierarchy, '1/SIZE/') === this.selectedSize) + // showToast(translate("Selected variant not available")) + // } + // } + // // if the variant does not have color or size as features + // this.currentVariant = variant || this.product.variants[0] + // this.variantId = this.currentVariant.variantId + // this.$route.query.variantId !== this.currentVariant.productId && (this.router.replace({path: this.$route.path, query: { variantId: this.currentVariant.productId } })); + // await this.getPoDetails() + // await this.getAtpCalcDetails() + // await this.prepareInvConfig() + // await this.prepareShopListings() + // await this.preparePoSummary() + // }, async getCtgryAndBrkrngJobs() { const systemJobEnumIds = JSON.parse(process.env.VUE_APP_CTGRY_AND_BRKRNG_JOB) this.store.dispatch('job/fetchCtgryAndBrkrngJobs', { systemJobEnumIds }).then(() => {