{"version":3,"sources":["webpack:///./src/project/basket/basket.service.ts","webpack:///./src/core/modals/AbstractModalService.ts"],"names":["lineItemIdEqual","lineItemId","bidId","quoteId","lineItem","lineItemWidEqual","wid","BasketService","basketState","observable","basket","loaded","productQueue","jobQueue","debouncedSendToServer","this","sendToServer","isSendingToServer","hasPendingProductUpdates","updateLineItemPrices","updateDeliveryPrice","isLoggedIn","getBasket","on","quantity","queueForServer","reference","isDuplicated","delta","existing","getLineItem","setQuantity","lineItems","getLineItemsByWid","length","addProduct","updateLineItemIntern","reduce","a","b","quotes","executeAsyncInSerial","clear","find","makeTemporaryLocalAdd","request","addMultipleItemsToBasket","update","updateDefault","committedLineItems","filter","l","isTemporaryLineItemId","commitedQuotes","map","x","shippingMethodLocked","addQuote","Error","splice","findIndex","removeQuote","q","normalLineItemsCnt","previousValue","quoteLineItemsCnt","previousOuterValue","quote","partialLineItem","makeTemporaryLocalUpdate","existingIx","push","toSend","i","product","addOrUpdateLineItems","func","deferred","job","doExecuteAsyncInSerial","promise","nextJob","shift","finally","resolve","setTimeout","existingProduct","fakeLineItem","Math","random","toString","unitPrice","total","existingProductIndex","getLineItemIndex","updatedExisting","set","get","error","baseOptions","disableBodyScroll","contentAutoScroll","contentMaxHeight","showCloseButton","disableUserClose","placement","singleton","usePanelWrapper","wide","closeOnRouteChange","closeOnBreakpointChange","closeButtonPosition","AbstractModalService","component","componentAttrs","modalListeners","options","modalOptions","getOptions","hideModals","setActiveModal","id","state"],"mappings":"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","file":"js/chunk-02fbf03b.1deee4cb.js","sourcesContent":["import Vue from 'vue';\r\nimport makeStoreDebugAccessible from '@/core/store/storeDebug';\r\nimport {\r\n AddProductsToBasketRequest,\r\n BasketQuoteViewObject,\r\n BasketViewModel,\r\n LineItem,\r\n LineItemViewObject\r\n} from '@/types/apiServerContract';\r\nimport Api from '@/project/http/Api.service';\r\nimport { PartialUpdateBasketRequest } from '@/project/http/controllers/basketController';\r\nimport { debounce } from 'lodash';\r\nimport authService, { LOGGED_IN, TOKEN_DATA_CHANGED_MARKET } from '@/core/auth/auth.service';\r\nimport bus from '@/core/bus';\r\nimport Deferred from '@/core/async/Deferred';\r\nimport loggingService from '@/core/logging.service';\r\n\r\ntype JobFunc = () => Promise;\r\n\r\ninterface JobData {\r\n job: JobFunc,\r\n deferred: Deferred\r\n}\r\n\r\ninterface PartialLineItem {\r\n lineItemId: string;\r\n bidId?: number | null;\r\n quantity?: number;\r\n reference?: string;\r\n quoteId?: string;\r\n}\r\n\r\nfunction lineItemIdEqual(lineItemId: string, bidId: number | undefined | null, quoteId?: string | undefined): (lineItem: LineItemViewObject | LineItem) => boolean {\r\n return (lineItem) => {\r\n // Dont simplify this. bideId can be null or undefined or have value.\r\n return lineItemId === lineItem.lineItemId &&\r\n ((bidId === lineItem.bidId || (!bidId && !lineItem.bidId)) &&\r\n ((quoteId === lineItem.quoteId) || (!quoteId && !lineItem.quoteId)));\r\n };\r\n}\r\nfunction lineItemWidEqual(wid: string, bidId: number | undefined | null, quoteId?: string | undefined): (lineItem: LineItemViewObject | LineItem) => boolean {\r\n return (lineItem) => {\r\n // Dont simplify this. bideId can be null or undefined or have value.\r\n return wid === lineItem.wid &&\r\n ((bidId === lineItem.bidId || (!bidId && !lineItem.bidId)) &&\r\n ((quoteId === lineItem.quoteId) || (!quoteId && !lineItem.quoteId)));\r\n };\r\n}\r\n\r\nclass BasketService {\r\n basketState: {\r\n basket: BasketViewModel | null,\r\n loaded: boolean\r\n } = Vue.observable({ basket: null, loaded: false });\r\n\r\n productQueue: LineItem[] = [];\r\n jobQueue: JobData[] = [];\r\n debouncedSendToServer = debounce(this.sendToServer, 500);\r\n isSendingToServer = false;\r\n hasPendingProductUpdates = false;\r\n updateLineItemPrices = false;\r\n updateDeliveryPrice = false;\r\n\r\n constructor() {\r\n makeStoreDebugAccessible('basket-service', this.basketState);\r\n if (authService.isLoggedIn()) {\r\n this.getBasket();\r\n }\r\n\r\n bus.on(LOGGED_IN, () => this.getBasket());\r\n bus.on(TOKEN_DATA_CHANGED_MARKET, () => this.getBasket());\r\n }\r\n\r\n public addProduct(wid: string, bidId: number | undefined | null, quoteId: string | undefined, quantity: number, updateLineItemPrices: boolean, updateDeliveryPrice: boolean): void {\r\n this.updateLineItemPrices = updateLineItemPrices;\r\n this.updateDeliveryPrice = updateDeliveryPrice;\r\n this.queueForServer({\r\n quantity,\r\n wid,\r\n reference: '',\r\n lineItemId: '',\r\n bidId: bidId,\r\n quoteId: '',\r\n isDuplicated: false\r\n });\r\n }\r\n\r\n public deltaUpdateQuantity(lineItemId: string, bidId: number | undefined | null, quoteId: string | undefined, delta: number, updateLineItemPrices: boolean, updateDeliveryPrice: boolean): void {\r\n this.updateLineItemPrices = updateLineItemPrices;\r\n this.updateDeliveryPrice = updateDeliveryPrice;\r\n const existing = this.getLineItem(lineItemId, bidId, quoteId);\r\n if (existing) {\r\n this.setQuantity(existing.lineItemId, bidId, quoteId, existing.quantity + delta, updateLineItemPrices, updateDeliveryPrice);\r\n }\r\n }\r\n\r\n public deltaUpdateQuantityByWid(wid: string, bidId: number | undefined | null, quoteId: string | undefined, delta: number, updateLineItemPrices: boolean, updateDeliveryPrice: boolean): void {\r\n this.updateLineItemPrices = updateLineItemPrices;\r\n this.updateDeliveryPrice = updateDeliveryPrice;\r\n const lineItems = this.getLineItemsByWid(wid, bidId, quoteId);\r\n if (lineItems.length === 0) {\r\n this.addProduct(wid, bidId, quoteId, delta, updateLineItemPrices, updateDeliveryPrice);\r\n } else if (lineItems.length === 1) {\r\n this.setQuantity(lineItems[0].lineItemId, bidId, quoteId, lineItems[0].quantity + delta, updateLineItemPrices, updateDeliveryPrice);\r\n } else {\r\n // Can't update quantity based on wid if multiple lineItems exist\r\n }\r\n }\r\n\r\n public setQuantity(lineItemId: string, bidId: number | undefined | null, quoteId: string | undefined, quantity: number, updateLineItemPrices: boolean, updateDeliveryPrice: boolean): void {\r\n this.updateLineItemPrices = updateLineItemPrices;\r\n this.updateDeliveryPrice = updateDeliveryPrice;\r\n this.updateLineItemIntern({\r\n lineItemId,\r\n bidId,\r\n quoteId,\r\n quantity\r\n });\r\n }\r\n\r\n public setQuantityByWid(wid: string, bidId: number | undefined | null, quoteId: string | undefined, quantity: number, updateLineItemPrices: boolean, updateDeliveryPrice: boolean): void {\r\n this.updateLineItemPrices = updateLineItemPrices;\r\n this.updateDeliveryPrice = updateDeliveryPrice;\r\n\r\n const lineItems = this.getLineItemsByWid(wid, bidId, quoteId);\r\n\r\n if (lineItems.length === 1) {\r\n this.updateLineItemIntern({\r\n lineItemId: lineItems[0].lineItemId,\r\n bidId,\r\n quoteId,\r\n quantity\r\n });\r\n }\r\n }\r\n\r\n public updateLineItemReference(lineItemId: string, bidId: number | undefined, quoteId: string | undefined, reference: string): void {\r\n this.updateLineItemIntern({\r\n lineItemId,\r\n bidId,\r\n quoteId,\r\n reference\r\n });\r\n }\r\n\r\n public isProductInBasket(wid: string, bidId: number | undefined, quoteId: string | undefined): boolean {\r\n // console.log('isProductInBasket', this.getLineItemsByWid(wid, bidId, quoteId), bidId, this.getLineItemsByWid(wid, bidId, quoteId).length > 0);\r\n return this.getLineItemsByWid(wid, bidId, quoteId).length > 0;\r\n }\r\n\r\n public isProductDuplicated(wid: string, bidId: number | undefined, quoteId: string | undefined): boolean {\r\n // console.log('isProductDuplicated', this.getLineItemsByWid(wid, bidId, quoteId), this.getLineItemsByWid(wid, bidId, quoteId).length > 1);\r\n return this.getLineItemsByWid(wid, bidId, quoteId).length > 1;\r\n }\r\n\r\n public getQuantity(lineItemId: string, bidId: number | undefined, quoteId: string | undefined): number {\r\n return this.getLineItem(lineItemId, bidId, quoteId)?.quantity || 0;\r\n }\r\n\r\n public getQuantityByWid(wid: string, bidId: number | undefined, quoteId: string | undefined): number {\r\n const lineItems = this.getLineItemsByWid(wid, bidId, quoteId);\r\n if (lineItems.length === 0) return 0;\r\n\r\n return lineItems.reduce((a, b) => a + b.quantity, 0);\r\n }\r\n\r\n public get lineItems(): LineItemViewObject[] {\r\n return this.basketState?.basket?.lineItems ?? [];\r\n }\r\n\r\n public async clearBasket(): Promise {\r\n if (this.basketState.basket?.quotes) {\r\n this.basketState.basket.quotes = [];\r\n }\r\n\r\n if (this.basketState.basket?.lineItems) {\r\n // Temporary local change before updated basket comes back\r\n this.basketState.basket.lineItems = [];\r\n this.productQueue = [];\r\n }\r\n\r\n return this.executeAsyncInSerial(async() => {\r\n this.basketState.basket = await Api.basket.clear();\r\n });\r\n }\r\n\r\n public async removeLineItem(lineItemId: string): Promise {\r\n const existing = this.basketState.basket?.lineItems.find(lineItem => lineItem.lineItemId === lineItemId);\r\n if (!existing) return;\r\n this.updateLineItemPrices = true;\r\n this.updateDeliveryPrice = true;\r\n this.updateLineItemIntern({\r\n lineItemId: existing.lineItemId,\r\n bidId: existing.bidId,\r\n quantity: 0\r\n });\r\n }\r\n\r\n public async duplicateLineItem(lineItemId: string): Promise {\r\n const existing = this.basketState.basket?.lineItems.find(lineItem => lineItem.lineItemId === lineItemId);\r\n if (!existing) return;\r\n this.updateLineItemPrices = true;\r\n this.updateDeliveryPrice = true;\r\n this.makeTemporaryLocalAdd(existing);\r\n this.queueForServer({\r\n wid: existing.wid,\r\n quantity: 1,\r\n reference: '',\r\n lineItemId: '',\r\n bidId: existing.bidId,\r\n quoteId: '',\r\n isDuplicated: true\r\n });\r\n }\r\n\r\n public get basket(): BasketViewModel | null {\r\n return this.basketState.basket;\r\n }\r\n\r\n public async addMultipleItemsToBasket(request: AddProductsToBasketRequest): Promise {\r\n return this.executeAsyncInSerial(async() => {\r\n this.basketState.basket = await Api.basket.addMultipleItemsToBasket(request);\r\n });\r\n }\r\n\r\n public async updateBasket(update: PartialUpdateBasketRequest): Promise {\r\n return this.executeAsyncInSerial(async() => {\r\n this.basketState.basket = await Api.basket.update(update);\r\n });\r\n }\r\n\r\n public async recalcBasket(): Promise {\r\n return this.executeAsyncInSerial(async() => {\r\n this.basketState.basket = await Api.basket.updateDefault();\r\n });\r\n }\r\n\r\n public forceGetBasket() {\r\n this.getBasket();\r\n }\r\n\r\n public get basketWithCommittedLineItems(): BasketViewModel | null {\r\n const basket = this.basket;\r\n if (!basket) return basket;\r\n\r\n const committedLineItems = basket.lineItems.filter(l => !this.isTemporaryLineItemId(l.lineItemId));\r\n\r\n const commitedQuotes = basket.quotes.map(x => ({\r\n ...x,\r\n lineItems: x.lineItems.filter(l => !this.isTemporaryLineItemId(l.lineItemId))\r\n } as BasketQuoteViewObject));\r\n\r\n return {\r\n ...basket,\r\n lineItems: committedLineItems,\r\n quotes: commitedQuotes\r\n };\r\n }\r\n\r\n public get hasPendingServerUpdates(): boolean {\r\n return this.hasPendingProductUpdates;\r\n }\r\n\r\n public async addQuote(quoteId: string, shippingMethodLocked: boolean): Promise {\r\n this.basketState.basket = await Api.basket.addQuote({ quoteId: quoteId, shippingMethodLocked: shippingMethodLocked });\r\n this.basketState.basket!.shippingMethodLocked = shippingMethodLocked;\r\n }\r\n\r\n public removeQuote(quoteId: string): Promise {\r\n if (!this.basketState.basket) {\r\n throw new Error('Basketstate is undefined');\r\n }\r\n\r\n this.basketState.basket.quotes.splice(this.basketState.basket.quotes.findIndex(x => x.quoteId === quoteId), 1);\r\n\r\n return this.executeAsyncInSerial(async() => {\r\n this.basketState.basket = await Api.basket.removeQuote(quoteId);\r\n });\r\n }\r\n\r\n public isLineItemDuplicated(wid: string, bidId: number | undefined | null, quoteId: string | undefined) {\r\n return this.getLineItemsByWid(wid, bidId, quoteId).length > 1;\r\n }\r\n\r\n public quoteInBasket(quoteId: string): boolean {\r\n return !!(this.basketState.basket?.quotes?.find(q => q.quoteId === quoteId));\r\n }\r\n\r\n public noOfBasketItems(): number {\r\n const normalLineItemsCnt = this.basketState.basket?.lineItems?.reduce((previousValue, lineItem: LineItemViewObject) => {\r\n return previousValue + lineItem.quantity;\r\n }, 0) ?? 0;\r\n const quoteLineItemsCnt = this.basketState.basket?.quotes?.reduce((previousOuterValue, quote: BasketQuoteViewObject) => {\r\n return previousOuterValue + quote.lineItems.reduce((previousValue, lineItem: LineItemViewObject) => {\r\n return previousValue + lineItem.quantity;\r\n }, 0) ?? 0;\r\n }, 0) ?? 0;\r\n return normalLineItemsCnt + quoteLineItemsCnt;\r\n }\r\n\r\n public get isBasketLoaded() {\r\n return this.basketState.loaded;\r\n }\r\n\r\n private isTemporaryLineItemId(lineItemId: string | undefined): boolean {\r\n return !lineItemId;\r\n }\r\n\r\n private updateLineItemIntern(partialLineItem: PartialLineItem): void {\r\n const existing = this.getLineItem(partialLineItem.lineItemId, partialLineItem.bidId, partialLineItem.quoteId);\r\n if (!existing) {\r\n throw new Error('Tried to update for non-existing line-item. ID: ' + partialLineItem.lineItemId);\r\n }\r\n this.makeTemporaryLocalUpdate(partialLineItem.lineItemId, partialLineItem.bidId, partialLineItem.quoteId, partialLineItem.quantity);\r\n\r\n const lineItem = {\r\n ...existing,\r\n ...partialLineItem\r\n };\r\n\r\n this.queueForServer({\r\n lineItemId: lineItem.lineItemId,\r\n wid: lineItem.wid,\r\n quantity: lineItem.quantity,\r\n reference: lineItem.reference,\r\n bidId: lineItem.bidId,\r\n quoteId: lineItem.quoteId,\r\n isDuplicated: false\r\n });\r\n }\r\n\r\n private queueForServer(lineItem: LineItem) {\r\n const existingIx = this.productQueue.findIndex(lineItem.lineItemId ? lineItemIdEqual(lineItem.lineItemId, lineItem.bidId, lineItem.quoteId) : lineItemWidEqual(lineItem.wid, lineItem.bidId, lineItem.quoteId));\r\n if (existingIx !== -1) {\r\n this.productQueue[existingIx] = lineItem;\r\n } else {\r\n this.productQueue.push(lineItem);\r\n }\r\n this.hasPendingProductUpdates = true;\r\n if (lineItem.lineItemId) {\r\n // If product and lineItemId is known to basket, debounce changes.\r\n this.debouncedSendToServer();\r\n } else {\r\n // If product is not in basket, fire XHR now. This avoids timing issue with lineItemId being slow to update https://dev.azure.com/eet-project/eet-drift/_workitems/edit/3546\r\n this.sendToServer();\r\n }\r\n }\r\n\r\n private sendToServer() {\r\n this.executeAsyncInSerial(async() => {\r\n if (this.productQueue.length === 0) return;\r\n\r\n const toSend: LineItem[] = [];\r\n\r\n for (let i = 0; i < this.productQueue.length; i++) {\r\n const product = this.productQueue[i];\r\n toSend.push({\r\n lineItemId: product.lineItemId,\r\n wid: product.wid,\r\n quantity: product.quantity,\r\n reference: product.reference,\r\n bidId: product.bidId,\r\n quoteId: product.quoteId,\r\n isDuplicated: product.isDuplicated\r\n });\r\n }\r\n\r\n this.productQueue = [];\r\n\r\n const basket = await Api.basket.addOrUpdateLineItems({\r\n lineItems: toSend,\r\n updateLineItemPrices: this.updateLineItemPrices,\r\n updateDeliveryPrice: this.updateDeliveryPrice\r\n });\r\n\r\n this.updateDeliveryPrice = false;\r\n this.hasPendingProductUpdates = false;\r\n this.basketState.basket = basket;\r\n });\r\n }\r\n\r\n private executeAsyncInSerial(func: JobFunc): Promise {\r\n const deferred = new Deferred();\r\n this.jobQueue.push({\r\n deferred,\r\n job: func\r\n });\r\n this.doExecuteAsyncInSerial();\r\n return deferred.promise;\r\n }\r\n\r\n private doExecuteAsyncInSerial() {\r\n if (this.isSendingToServer || this.jobQueue.length === 0) return;\r\n\r\n this.isSendingToServer = true;\r\n const nextJob = this.jobQueue.shift();\r\n nextJob!.job()\r\n .finally(() => {\r\n nextJob!.deferred.resolve();\r\n this.isSendingToServer = false;\r\n if (this.jobQueue.length > 0) {\r\n setTimeout(() => this.doExecuteAsyncInSerial());\r\n }\r\n });\r\n }\r\n\r\n private makeTemporaryLocalAdd(existingProduct: LineItemViewObject) {\r\n if (!this.basketState.basket) return; // Don't have a basket yet\r\n\r\n // Add fake line-item until basket comes back\r\n const fakeLineItem: LineItemViewObject = {\r\n ...existingProduct,\r\n lineItemId: Math.random().toString(),\r\n quantity: 1,\r\n reference: '',\r\n unitPrice: {},\r\n total: {}\r\n } as LineItemViewObject;\r\n this.basketState.basket.lineItems.push(fakeLineItem);\r\n }\r\n\r\n private makeTemporaryLocalUpdate(lineItemId: string, bidId: number | undefined | null, quoteId: string | undefined, quantity?: number) {\r\n // Temporary local change before updated basket comes back\r\n if (quantity == null) return; // Could be reference update without quantity\r\n if (!this.basketState.basket) return; // Don't have a basket yet\r\n\r\n const existingProductIndex = this.getLineItemIndex(lineItemId, bidId, quoteId);\r\n if (existingProductIndex > -1) {\r\n if (quantity === 0) {\r\n // Remove product if quantity is 0\r\n this.basketState.basket.lineItems.splice(existingProductIndex, 1);\r\n } else {\r\n // Update existing product locally\r\n const updatedExisting = { ...this.basketState.basket.lineItems[existingProductIndex], quantity };\r\n Vue.set(this.basketState.basket.lineItems, existingProductIndex, updatedExisting);\r\n }\r\n }\r\n }\r\n\r\n private getLineItemIndex(lineItemId: string, bidId: number | undefined | null, quoteId: string | undefined): number {\r\n return this.basketState?.basket?.lineItems.findIndex(lineItemIdEqual(lineItemId, bidId, quoteId)) ?? -1;\r\n }\r\n\r\n private getLineItemsByWid(wid: string, bidId: number | undefined | null, quoteId: string | undefined): LineItemViewObject[] {\r\n return this.basket?.lineItems?.filter(lineItemWidEqual(wid, bidId, quoteId)) || [];\r\n }\r\n\r\n private getLineItem(lineItemId: string, bidId: number | undefined | null, quoteId: string | undefined): LineItemViewObject | undefined {\r\n let lineItem: LineItemViewObject | undefined;\r\n\r\n if (quoteId) {\r\n lineItem = this.basketState?.basket?.quotes.find(x => x.quoteId === quoteId)?.lineItems.find(lineItemIdEqual(lineItemId, bidId, quoteId));\r\n } else {\r\n lineItem = this.basketState?.basket?.lineItems.find(lineItemIdEqual(lineItemId, bidId));\r\n }\r\n\r\n return lineItem;\r\n }\r\n\r\n private async getBasket() {\r\n try {\r\n this.basketState.basket = await Api.basket.get();\r\n } catch (e) {\r\n loggingService.error(e);\r\n } finally {\r\n this.basketState.loaded = true;\r\n }\r\n }\r\n}\r\n\r\nexport default new BasketService();\r\n","import Deferred from '@/core/async/Deferred';\r\nimport UUID from '@/core/uuid.service';\r\nimport { ComponentType, ModalOptions, ModalState } from './ModalState';\r\n\r\nconst baseOptions: ModalOptions = {\r\n disableBodyScroll: true,\r\n contentAutoScroll: true,\r\n contentMaxHeight: true,\r\n showCloseButton: true,\r\n disableUserClose: false,\r\n placement: 'center',\r\n singleton: true,\r\n usePanelWrapper: true,\r\n wide: false,\r\n closeOnRouteChange: true,\r\n closeOnBreakpointChange: true,\r\n closeButtonPosition: null\r\n};\r\n\r\nexport abstract class AbstractModalService {\r\n public abstract show(...aggs: any[]);\r\n\r\n protected async showModal({ component, componentAttrs, modalListeners, options }:\r\n { component: ComponentType; componentAttrs: any; modalListeners?: any; options?: Partial }): Promise {\r\n const deferred = new Deferred();\r\n\r\n const modalOptions = this.getOptions(options);\r\n\r\n if (modalOptions?.singleton) {\r\n await ModalState.hideModals();\r\n }\r\n\r\n ModalState.setActiveModal({\r\n id: UUID(),\r\n component: component,\r\n componentAttrs: componentAttrs,\r\n modalListeners: modalListeners,\r\n deferred: deferred,\r\n state: 'entering',\r\n ...modalOptions\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n private getOptions(options?: Partial) : ModalOptions {\r\n options = {\r\n ...baseOptions,\r\n ...options\r\n };\r\n return options as ModalOptions;\r\n }\r\n}\r\n"],"sourceRoot":""}