{"version":3,"file":"src_app_modules_menu_menu_module_ts.85d8eca94290f767.js","mappings":"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","names":["DisplayOccasionType","Collection","Delivery","Dinein","Takeaway","MenuComponent","_MenuComponent","AndroWebCoreComponent","constructor","router","_datePipe","_seoService","_menuService","_siteService","_toastService","_basketService","_activatedRoute","_checkoutService","_navigatorService","_menuHelperService","_menuDealHelperService","_structuredDataService","_menuVariantHelperService","super","this","isLoading","navigationSectionType","NavigationSectionType","orderOccasion","OrderOccasion","_scrollDelay","showWebSectionImages","tenant","SuppressProductImages","ngOnInit","handleRouteParams","updatePageSEO","trackCurrentSite","getCurrentBasketBySiteId","trackCurrentMenu","trackCurrentBasket","trackNotifications","ngAfterViewInit","queryParams","pipe","filter","params","openBasket","takeUntil","destroy$","subscribe","basketModalContent","ngOnDestroy","_seoSet","restore","highlightCategoryName","visibleElement","getCategoryInView","name","nativeElement","id","highlightedCategoryName","scrollSectionButtonInToView","toggleSearchBar","showSearchBarExpanded","setSearchFieldFocus","searchText","navigateToDisplayGroup","$event","menuSection","preventDefault","customerName","clean","navigate","getSectionUrl","scrollToWebSection","updateSeoTitleAndDescription","currentSite","occasion","navigateToAndromeda","window","open","openWantedTimeModal","modal","openDialog","width","template","openBasketModal","options","height","isTablet","panelClass","position","right","top","isShortDevice","wantedTime","getWantedTimeOrLeadTime","basket","upselling","getBasketUpsellOptions","Upselling","menuValue","length","data","Occasion","save","event","addProductToBasket","item","itemPrice","prompt","ProductUpsellModalComponent","afterClosed","menuUpdates","menu$","menu","noMenu","sections","getMenuSections","buildStructuredData","getProductSections","map","x","mapSectionToMenuSectionView","section","cleanName","Name","description","Description","Id","menuItems","mapToMenuItemView","imageBase","getMenuImageVisualAsset","isMobile","href","sectionName","generateRoutePath","_location","Menu","getProductsForSectionAndOccasion","Products","product","mapProductToMenuItemView","getDealsForSectionAndOccasion","Deals","RequiresUnlock","deal","mapDealToMenuItemView","i","available","sort","a","b","localeCompare","sequence","priceSummary","getPriceAndSummaryForVariants","Variants","outOfStock","every","variant","OutOfStock","Sequence","nutritionSummary","getNutritionSummary","areVariantsAvailableForOccasion","summary","price","type","defaultVariantSummary","getVariantOptionsPathText","getDefaultVariant","productOptionsById","variants","getMinPriceForDeal","availableForOccasion","Availability","Values","getPricePrefixForDeal","toFixed","groupName","element","document","getElementById","setTimeout","scrollIntoView","behavior","block","inline","trackBasketCount","total","Items","forEach","Product","Quantity","currentBasketCount","passedElements","_categoryElements","midWayOfScreen","body","clientHeight","getBoundingClientRect","push","pop","snapshot","paramMap","get","changeTakeAwayToCollection","capitalizedOccasion","charAt","toUpperCase","slice","trackTrace","SeverityLevel","Warning","generateHomePath","decodeURI","location","pathname","siteId","getSiteIdByLocation","jsonStructuredData","buildMenuStructuredData","jsonScript","createElement","setAttribute","textContent","head","appendChild","useDefault","updateTitle","address","_a","Address","locationDetails","Town","Postcode","updateDescription","replaceSEOStrings","changeCollectionToTakeAway","_b","menuPageSEO","PageSeos","find","seo","PageName","toLowerCase","Title","updateText","includes","replace","join","currentSite$","site","toLocaleLowerCase","setCurrentSiteBySiteId","_this","clearOldBasket","clearOldAndCreateNewBasket","_ref","error","trackException","goHome","next","_asyncToGenerator","Error","IsModifiable","OrderId","deleteOrderById","catch","_x","apply","arguments","currentBasket$","isNewBasket","getAvailableOrderDates","basketWantedTime","getWantedTime","basketTotal","Charges","ChargeType","ChargeTypes","Total","Price","Amount","activeNotifications$","notifications","url","showToast","ToastTypes","scrollTo","offsetTop","parent","catBar","offsetHeight","_searchElement","focus","searchFocusDelay","WantedTimeUtc","_date","Date","replaceZuluTime","transform","isToday","date","today","getDate","getMonth","_this2","dates","getTimeSlotsForBasket","isStoreOpen","Dates","AllowAsap","nextDate","setDate","lastValueFrom","getBasketsAvailableTimes","flatMap","Time","ViewChildren","args","ViewChild","HostListener","__decorate","Component","animations","trigger","transition","style","fontSize","animate","selector","__metadata","Router","DatePipe","SEOService","MenuService","SiteService","ToastsService","BasketService","ActivatedRoute","CheckoutService","NavigatorService","MenuHelperService","MenuDealHelperService","StructuredDataService","MenuVariantHelperService","ProductsDialogEntryComponent","_ProductsDialogEntryComponent","_router","toTitleCase","_group","productView","imageSource","isInDeal","allergens","getAllergenSummary","Allergens","onSave","updateProductSeoTitleAndDescription","openProductDialog","close","_dialogRef","response","HttpStatusCodeHandler","isSuccessResponse","config","ariaModal","_productModal","productId","productName","routePath","displayGroup","resetSEO","products_dialog_entry_component_metadata","DealsDialogEntryComponent","_DealsDialogEntryComponent","routeOccasion","group","openDealsModal","dealsPageSEO","title","result","deals_dialog_entry_component_metadata","routes","children","component","path","resolve","siteResolver","SiteResolver","MenuRoutingModule","NgModule","exports","RouterModule","imports","forChild","MenuCardComponent","_MenuCardComponent","_analyticsService","showImages","ngOnChanges","changes","_notification","trackNotification","getRoutePath","goToItemPage","menuItem","_isStoreOpen","openDisallowedModal","trackClickMenuItem","navigateByUrl","openUpsellModal","goToProductPage","goToDealPage","getDealRoutePath","addItemToBasket","stopPropagation","isProductSimple","payload","Modifiers","Item","Prices","_occasion","_customerGroupName","_disallowedModal","autoFocus","disableClose","subscriptions$","activeNotification","unsubscribe","getProductRoutePath","dealId","getLocationBySiteId","_siteId","split","upsellOptions","Ids","mapToProductUpsellOption","upsellPrompt","Prompt","upsellDialogRef","_upsellModal","maxHeight","originalPrice","_wantedTime","Math","round","Number","EPSILON","trackClickProduct","Input","menu_card_component_metadata","AnalyticsService","FilterMenuItemsPipe","searchTerm","trim","lowerSearchTerm","menuItemHasSearchTerm","some","Pipe","standalone","DealUpsellModalComponent","_DealUpsellModalComponent","_onSelectDeal","EventEmitter","_onSelectMenuItem","selectDeal","emit","dialogRef","selectMenuItem","required","Output","deal_upsell_modal_component_metadata","MenuModule","declarations","CommonModule","SharedComponentsModule","WantedTimePickerComponent","___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___","__webpack_require__","___CSS_LOADER_EXPORT___","___CSS_LOADER_API_IMPORT___","module","toString"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/models/display-occasion-type.ts","./src/app/modules/menu/menu.component.ts","./src/app/modules/menu/components/products-dialog-entry/products-dialog-entry.component.ts","./src/app/modules/menu/components/deals-dialog-entry/deals-dialog-entry.component.ts","./src/app/modules/menu/menu-routing.module.ts","./src/app/modules/menu/components/menu-card/menu-card.component.ts","./src/app/modules/menu/pipes/menu-sections-filter.ts","./src/app/modules/menu/components/deal-upsell-modal/deal-upsell-modal.component.ts","./src/app/modules/menu/menu.module.ts","./src/app/modules/menu/components/deal-upsell-modal/deal-upsell-modal.component.css","./src/app/modules/menu/components/menu-card/menu-card.component.scss","./src/app/modules/menu/menu.component.scss"],"sourcesContent":["export enum DisplayOccasionType {\r\n Collection = 'Collection',\r\n Delivery = 'Delivery',\r\n Dinein = 'DineIn',\r\n Takeaway = 'Takeaway'\r\n}\r\n","import { ActivatedRoute, Params, Router } from '@angular/router';\r\nimport { AfterViewInit, Component, ElementRef, HostListener, OnDestroy, OnInit, QueryList, TemplateRef, ViewChild, ViewChildren } from '@angular/core';\r\nimport { ToastsService } from '@app/shared/services/toasts.service';\r\nimport { AndroWebCoreComponent } from '@app/core/AndroWebCoreComponent';\r\nimport { Basket } from '@app/models/basket';\r\nimport { BasketService } from '@app/api/basket.service';\r\nimport { CheckoutService } from '@app/api/checkout.service';\r\nimport { DisplayOccasionType } from '@app/models/display-occasion-type';\r\nimport { MenuService } from '@app/api/menu.service';\r\nimport { NavigationSectionType } from '@app/models/navigation/navigation-section-type';\r\nimport { NavigatorService } from '@app/core/navigator.service';\r\nimport { OrderOccasion } from '@app/models/order-occasion';\r\nimport { PageSEO } from '@app/models/page-seo';\r\nimport { SEOService } from '@app/shared/services/seo.service';\r\nimport { SeverityLevel } from '@microsoft/applicationinsights-web';\r\nimport { Site } from '@app/models/site';\r\nimport { SiteService } from '@app/api/site.service';\r\nimport { DatePipe } from '@angular/common';\r\nimport { BasketItem } from '@app/models/basket/basket-item';\r\nimport { ChargeTypes } from '@app/models/charge-types';\r\nimport { MatDialogConfig } from '@angular/material/dialog';\r\nimport { Charge } from '@app/models/Charge';\r\nimport { IDictionary } from '@app/models/IDictionary';\r\nimport { Observable, lastValueFrom, takeUntil } from 'rxjs';\r\nimport { filter } from 'rxjs/operators';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\nimport { INotification } from '@app/models/INotification';\r\nimport { ToastTypes } from '@app/models/ToastTypes.enum';\r\nimport { IDaysTimeSlots } from '@app/models/wanted-time-picker/IDaysTimeSlots';\r\nimport { BasketAvailableTime } from '@app/models/basket-available-time';\r\nimport { Address } from '@app/models/Address';\r\nimport { MenuItemView } from '@app/models/menu/menu-item-view';\r\nimport { MenuSectionView } from '@app/models/menu/menu-section-view';\r\nimport { MenuHelperService } from '@app/shared/services/menu-helper/menu-helper.service';\r\nimport { Deal } from '@app/models/menu/deal';\r\nimport { Product } from '@app/models/menu/product';\r\nimport { MenuSection } from '@app/models/menu/menu-section';\r\nimport { Menu } from '@app/models/menu/menu';\r\nimport { MenuDealHelperService } from '@app/shared/services/menu-deal-helper/menu-deal-helper.service';\r\nimport { MenuVariantHelperService } from '@app/shared/services/menu-variant-helper/menu-variant-helper.service';\r\nimport { StructuredDataService } from '@app/shared/services/structured-data/structured-data.service';\r\nimport { getWantedTimeOrLeadTime } from '@app/shared/utils/date-utils';\r\nimport { ProductAddEvent } from '@app/models/product/product-add-event';\r\nimport { ProductUpsellModalComponent } from './components/product-upsell-modal/product-upsell-modal.component';\r\nimport { ProductUpsellModalData } from '@app/models/product/product-upsell-modal-data';\r\n\r\n@Component({\r\n animations: [\r\n trigger('valueAnimation', [\r\n transition(':increment', [\r\n style({ fontSize: '22px' }),\r\n animate('0.5s ease', style('*'))\r\n ]\r\n ),\r\n transition(':decrement', [\r\n style({ fontSize: '22px' }),\r\n animate('0.5s ease', style('*'))\r\n ]\r\n )\r\n ])\r\n ],\r\n selector: 'app-menu',\r\n styleUrls: ['./menu.component.scss'],\r\n templateUrl: './menu.component.html'\r\n})\r\nexport class MenuComponent extends AndroWebCoreComponent implements OnInit, OnDestroy, AfterViewInit {\r\n @ViewChildren('categoryElement') private _categoryElements: QueryList;\r\n @ViewChild('search') private _searchElement: ElementRef;\r\n @ViewChild('basketModalContent') private basketModalContent: TemplateRef;\r\n\r\n public siteId: string;\r\n public searchText: string;\r\n public occasion: OrderOccasion;\r\n public highlightedCategoryName: string;\r\n public noMenu: boolean;\r\n public showSearchBarExpanded: boolean;\r\n public isLoading: boolean = true;\r\n public isStoreOpen: boolean;\r\n public navigationSectionType: typeof NavigationSectionType = NavigationSectionType;\r\n public basketWantedTime: string;\r\n public basket: Basket;\r\n public basketTotal: number;\r\n public notifications: IDictionary>;\r\n public currentBasketCount: number;\r\n public currentSite: Site;\r\n public orderOccasion: typeof OrderOccasion = OrderOccasion;\r\n public sections: MenuSectionView[];\r\n public showWebSectionImages: boolean;\r\n\r\n private _location: string;\r\n private _seoSet: boolean;\r\n private _scrollDelay: number = 200;\r\n\r\n constructor(\r\n public router: Router,\r\n private _datePipe: DatePipe,\r\n private _seoService: SEOService,\r\n private _menuService: MenuService,\r\n private _siteService: SiteService,\r\n private _toastService: ToastsService,\r\n private _basketService: BasketService,\r\n private _activatedRoute: ActivatedRoute,\r\n private _checkoutService: CheckoutService,\r\n private _navigatorService: NavigatorService,\r\n private _menuHelperService: MenuHelperService,\r\n private _menuDealHelperService: MenuDealHelperService,\r\n private _structuredDataService: StructuredDataService,\r\n private _menuVariantHelperService: MenuVariantHelperService\r\n ) {\r\n super();\r\n this.showWebSectionImages = this.tenant.SuppressProductImages;\r\n }\r\n\r\n ngOnInit() {\r\n this.handleRouteParams();\r\n this.updatePageSEO(false);\r\n this.trackCurrentSite();\r\n this.getCurrentBasketBySiteId();\r\n this.trackCurrentMenu();\r\n this.trackCurrentBasket();\r\n this.trackNotifications();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this._activatedRoute.queryParams\r\n .pipe(\r\n filter((params: Params) => params.openBasket),\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe(() => {\r\n this.openBasket(this.basketModalContent);\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n super.ngOnDestroy();\r\n\r\n if (this._seoSet) {\r\n this._seoService.restore();\r\n }\r\n }\r\n\r\n /**\r\n * updates which category (web section) is highlighted whilst the user scrolls\r\n * @param $event\r\n */\r\n @HostListener('window:scroll')\r\n public highlightCategoryName(): void {\r\n const visibleElement: ElementRef = this.getCategoryInView();\r\n const name: string = visibleElement ? visibleElement.nativeElement.id : '';\r\n\r\n if (this.highlightedCategoryName !== name) {\r\n this.highlightedCategoryName = name;\r\n this.scrollSectionButtonInToView(name);\r\n }\r\n }\r\n\r\n /**\r\n * sets showSearchBarExpanded to true\r\n */\r\n public toggleSearchBar(): void {\r\n this.showSearchBarExpanded = !this.showSearchBarExpanded;\r\n\r\n if (this.showSearchBarExpanded) {\r\n this.setSearchFieldFocus();\r\n } else {\r\n this.searchText = '';\r\n }\r\n }\r\n\r\n /**\r\n * navigates to the displayGroup with the matching name\r\n * @param $event\r\n * @param menuSection\r\n */\r\n public navigateToDisplayGroup($event: MouseEvent, menuSection: MenuSectionView): void {\r\n $event.preventDefault();\r\n const customerName: string = this._navigatorService.clean(menuSection.name);\r\n this.router.navigate([this.getSectionUrl(customerName)]);\r\n this.highlightedCategoryName = customerName;\r\n this.scrollSectionButtonInToView(customerName);\r\n this.scrollToWebSection(customerName);\r\n this._seoService.updateSeoTitleAndDescription(this.currentSite, this.occasion, menuSection);\r\n }\r\n\r\n /**\r\n * opens `https://andromedapos.com/` in a new tab\r\n */\r\n public navigateToAndromeda(): void {\r\n window.open('https://andromedapos.com/');\r\n }\r\n\r\n /**\r\n * opens the order wanted time modal\r\n */\r\n public openWantedTimeModal(modal: TemplateRef): void {\r\n this.openDialog(modal, 'order-wanted-time-modal', { width: '' });\r\n }\r\n\r\n /**\r\n * opens a mat dialog with the basket template inside\r\n */\r\n public openBasket(template: TemplateRef): void {\r\n const openBasketModal = () => {\r\n const options: MatDialogConfig = {\r\n height: this.isTablet ? '100%' : '90%',\r\n panelClass: 'basket-modal-window',\r\n position: {\r\n right: this.isTablet ? '0px' : '35px',\r\n top: this.isTablet ? '0' : (this.isShortDevice ? '45px' : '75px')\r\n },\r\n width: this.isTablet ? '100%' : '580px'\r\n };\r\n\r\n this.openDialog(template, 'basket-modal', options);\r\n };\r\n\r\n const wantedTime: Date = getWantedTimeOrLeadTime(this.occasion, this.currentSite, this.basket);\r\n const upselling = this._menuVariantHelperService.getBasketUpsellOptions(this.basket.Upselling, this._menuService.menuValue, this.occasion, wantedTime);\r\n\r\n if (upselling?.options.length > 0) {\r\n const options: Partial> = {\r\n data: {\r\n options: upselling.options,\r\n occasion: this.basket.Occasion,\r\n save: (event: ProductAddEvent, name: string) => this._basketService.addProductToBasket(event.item, name, 'basket-upsell', event.itemPrice),\r\n prompt: upselling.prompt\r\n }\r\n };\r\n\r\n this.openDialog(ProductUpsellModalComponent, 'upsell-modal', options)\r\n .afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => openBasketModal());\r\n return;\r\n }\r\n\r\n openBasketModal();\r\n }\r\n\r\n /**\r\n * tracks the current menu.\r\n */\r\n private trackCurrentMenu(): void {\r\n let menuUpdates: number = 0;\r\n\r\n this._menuService.menu$\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((menu: Menu) => {\r\n this.noMenu = !menu;\r\n\r\n menuUpdates++;\r\n\r\n if (this.noMenu) {\r\n if (menuUpdates > 1) {\r\n this.isLoading = false;\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.sections = this.getMenuSections(menu);\r\n this.buildStructuredData(menu);\r\n this.updatePageSEO(true);\r\n this.isLoading = false;\r\n });\r\n }\r\n\r\n /**\r\n * returns the menu sections for the given menu\r\n * @param menu\r\n */\r\n private getMenuSections(menu: Menu): MenuSectionView[] {\r\n return this._menuHelperService.getProductSections(menu, this.occasion).map((x: MenuSection) => this.mapSectionToMenuSectionView(x, menu));\r\n }\r\n\r\n /**\r\n * maps a MenuSection to a MenuSectionView\r\n * @param section\r\n * @param menu\r\n */\r\n private mapSectionToMenuSectionView(section: MenuSection, menu: Menu): MenuSectionView {\r\n const cleanName: string = this._navigatorService.clean(section.Name);\r\n\r\n return {\r\n name: section.Name,\r\n cleanName,\r\n description: section.Description,\r\n id: section.Id,\r\n menuItems: this.mapToMenuItemView(section, menu),\r\n imageBase: this.getMenuImageVisualAsset({ data: section, height: this.isMobile ? 99 : 185 }),\r\n href: this.getSectionUrl(cleanName)\r\n };\r\n }\r\n\r\n /**\r\n * returns the url for the given section\r\n * @param sectionName - needs to be a clean name {@link NavigatorService.clean}\r\n */\r\n private getSectionUrl(sectionName: string): string {\r\n return this._navigatorService.generateRoutePath(this._location, this.occasion, NavigationSectionType.Menu, sectionName);\r\n }\r\n\r\n /**\r\n * maps the products and deals to a MenuItemView\r\n */\r\n private mapToMenuItemView(section: MenuSection, menu: Menu): MenuItemView[] {\r\n const wantedTime: Date = getWantedTimeOrLeadTime(this.occasion, this.currentSite, this.basket);\r\n\r\n const products: MenuItemView[] = this._menuHelperService.getProductsForSectionAndOccasion(section, OrderOccasion[this.occasion], menu.Products)\r\n .map((product: Product) => this.mapProductToMenuItemView(product, wantedTime));\r\n\r\n const deals: MenuItemView[] = this._menuHelperService.getDealsForSectionAndOccasion(section, OrderOccasion[this.occasion], menu.Deals)\r\n .filter((x: Deal) => !x.RequiresUnlock)\r\n .map((deal: Deal) => this.mapDealToMenuItemView(deal, wantedTime));\r\n\r\n return [...products, ...deals]\r\n .filter((i: MenuItemView) => i.available)\r\n .sort((a: MenuItemView, b: MenuItemView) => a.name.localeCompare(b.name))\r\n .sort((a: MenuItemView, b: MenuItemView) => (a.sequence ?? 0) - (b.sequence ?? 0));\r\n }\r\n\r\n /**\r\n * maps a product to a MenuItemView\r\n * @param product\r\n * @param wantedTime\r\n */\r\n private mapProductToMenuItemView(product: Product, wantedTime: Date): MenuItemView {\r\n const priceSummary = this._menuVariantHelperService.getPriceAndSummaryForVariants(product.Variants, OrderOccasion[this.occasion]);\r\n\r\n return {\r\n id: product.Id,\r\n outOfStock: product.Variants.every((variant) => variant.OutOfStock),\r\n imageBase: this.getMenuImageVisualAsset({ data: product, height: this.isMobile ? 99 : 185 }),\r\n sequence: product.Sequence,\r\n name: product.Name,\r\n description: product.Description,\r\n nutritionSummary: this._menuVariantHelperService.getNutritionSummary(product.Variants, false),\r\n available: this._menuVariantHelperService.areVariantsAvailableForOccasion(product.Variants, OrderOccasion[this.occasion], wantedTime),\r\n priceSummary: priceSummary.summary,\r\n price: priceSummary.price,\r\n type: 'product',\r\n defaultVariantSummary: this._menuHelperService.getVariantOptionsPathText(\r\n this._menuVariantHelperService.getDefaultVariant(product.Variants),\r\n this._menuService.productOptionsById\r\n ),\r\n variants: product.Variants,\r\n upselling: product.Upselling\r\n };\r\n }\r\n\r\n /**\r\n * maps a deal to a MenuItemView\r\n */\r\n private mapDealToMenuItemView(deal: Deal, wantedTime: Date): MenuItemView {\r\n const price = this._menuDealHelperService.getMinPriceForDeal(deal, OrderOccasion[this.occasion]);\r\n return {\r\n id: deal.Id,\r\n outOfStock: deal.OutOfStock,\r\n imageBase: this.getMenuImageVisualAsset({ data: deal, height: this.isMobile ? 99 : 185 }),\r\n sequence: deal.Sequence,\r\n name: deal.Name,\r\n description: deal.Description,\r\n available: this._menuHelperService.availableForOccasion(deal.Availability?.Values, OrderOccasion[this.occasion], wantedTime),\r\n priceSummary: this._menuDealHelperService.getPricePrefixForDeal(deal) + price.toFixed(2),\r\n price,\r\n type: 'deal'\r\n };\r\n }\r\n\r\n /**\r\n * scroll into view of the given group\r\n * @param groupName\r\n */\r\n private scrollSectionButtonInToView(groupName: string): void {\r\n const element: HTMLElement = document.getElementById(`li-${groupName}`);\r\n\r\n if (element) {\r\n setTimeout(() => {\r\n element.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'start' });\r\n }, 100);\r\n }\r\n }\r\n\r\n /**\r\n * tracks the basket total.\r\n * @param basket\r\n */\r\n private trackBasketCount(basket: Basket): void {\r\n if (basket) {\r\n let total: number = basket.Deals?.length ?? 0;\r\n basket.Items?.forEach((item: BasketItem) => total += item.Product.Quantity);\r\n\r\n if (this.currentBasketCount !== total) {\r\n this.currentBasketCount = total;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * returns the category (web-section) that is in the top 50% of the users view.\r\n */\r\n private getCategoryInView(): ElementRef {\r\n const passedElements: ElementRef[] = [];\r\n\r\n this._categoryElements.forEach((element: ElementRef) => {\r\n const midWayOfScreen: number = document.body.clientHeight / 2;\r\n\r\n if (element.nativeElement.getBoundingClientRect().top < midWayOfScreen) {\r\n passedElements.push(element);\r\n }\r\n });\r\n\r\n return passedElements.pop();\r\n }\r\n\r\n /**\r\n * Pulls out the siteId, groupFilter and returnUrl from the parameters in the current url if any are present\r\n */\r\n private handleRouteParams(): void {\r\n if (this._activatedRoute.snapshot.paramMap.get('occasion')) {\r\n const occasion = this._navigatorService.changeTakeAwayToCollection(this._activatedRoute.snapshot.paramMap.get('occasion'));\r\n const capitalizedOccasion = occasion.charAt(0).toUpperCase() + occasion.slice(1);\r\n this.occasion = DisplayOccasionType[capitalizedOccasion];\r\n\r\n // if we don't know the occasion type, redirect home so the user can select\r\n if (!this.occasion) {\r\n this.trackTrace('Unknown occasion type, user redirected to home', SeverityLevel.Warning);\r\n this.router.navigate([this._navigatorService.generateHomePath()]);\r\n }\r\n }\r\n\r\n if (!this._activatedRoute.snapshot.paramMap.get('displayGroup')) {\r\n this.router.navigate([`${decodeURI(location.pathname)}/all`]);\r\n }\r\n\r\n if (this._activatedRoute.snapshot.paramMap.get('location')) {\r\n this._location = this._activatedRoute.snapshot.paramMap.get('location');\r\n this.siteId = this._navigatorService.getSiteIdByLocation(this._location);\r\n }\r\n\r\n if (!this.siteId || this.siteId === '') {\r\n this.router.navigate([this._navigatorService.generateHomePath()]);\r\n }\r\n }\r\n\r\n /**\r\n * builds the structured data for the menu\r\n */\r\n private buildStructuredData(menu: Menu): void {\r\n const jsonStructuredData: string = this._structuredDataService.buildMenuStructuredData(menu, this.occasion);\r\n\r\n if (jsonStructuredData) {\r\n const jsonScript: HTMLScriptElement = document.createElement('script');\r\n jsonScript.setAttribute('type', 'application/ld+json');\r\n jsonScript.textContent = jsonStructuredData;\r\n document.head.appendChild(jsonScript);\r\n }\r\n }\r\n\r\n /**\r\n * updates the websites title and meta description\r\n * @param useDefault\r\n */\r\n private updatePageSEO(useDefault: boolean): void {\r\n if (useDefault) {\r\n this._seoSet = true;\r\n if (this.currentSite && this.occasion) {\r\n this._seoService.updateSeoTitleAndDescription(this.currentSite, this.occasion);\r\n } else {\r\n this._seoService.updateTitle('{{TenantWebsiteName}} - menu');\r\n }\r\n\r\n const address: Address = this.currentSite?.Address;\r\n const locationDetails: string = address\r\n ? `${address.Town ? `in ${address.Town} ` : ''} ${(address.Town || !address.Postcode) ? address.Postcode : `in ${address.Postcode}`}`\r\n : '';\r\n\r\n this._seoService.updateDescription(this.replaceSEOStrings(`See our ${ this._navigatorService.changeCollectionToTakeAway(this.occasion) } menu in ${locationDetails}.\r\n Choose from our wide range of {{allMenuCategories}} from ${this.currentSite?.Name}.`));\r\n } else {\r\n const menuPageSEO = this.tenant.PageSeos.find((seo: PageSEO) => seo.PageName.toLowerCase() === 'menu');\r\n\r\n if (menuPageSEO) {\r\n this._seoSet = true;\r\n this._seoService.updateTitle(this.replaceSEOStrings(menuPageSEO.Title));\r\n this._seoService.updateDescription(this.replaceSEOStrings(menuPageSEO.Description));\r\n } else {\r\n this.updatePageSEO(true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * replaces well defined hardcoded strings with matching details for the current site/menu\r\n * @param updateText\r\n */\r\n private replaceSEOStrings(updateText: string): string {\r\n if (updateText.includes('{{allMenuCategories}}') && this.sections?.length > 0) {\r\n return updateText.replace('{{allMenuCategories}}', this.sections.map((x: MenuSectionView) => x.name).join(', '));\r\n }\r\n\r\n return updateText;\r\n }\r\n\r\n /**\r\n * tracks the current site.\r\n */\r\n private trackCurrentSite(): void {\r\n this._siteService.currentSite$\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((site: Site) => {\r\n this.currentSite = site;\r\n });\r\n\r\n if (!this.currentSite || this.currentSite.Id.toLocaleLowerCase() !== this.siteId.toLocaleLowerCase()) {\r\n this._siteService.setCurrentSiteBySiteId(this.siteId);\r\n }\r\n }\r\n\r\n /**\r\n * gets the current basket\r\n * @param retried\r\n */\r\n private getCurrentBasketBySiteId(): void {\r\n const clearOldBasket = () => this._basketService.clearOldAndCreateNewBasket(this.siteId);\r\n\r\n this._basketService.getCurrentBasketBySiteId(this.siteId, OrderOccasion[this.occasion])\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n error: (error) => {\r\n this.trackException(error, true);\r\n this.goHome();\r\n },\r\n next: async (basket: Basket) => {\r\n if (!basket) {\r\n this.trackTrace('getCurrentBasketBySiteId returned null on menu page', SeverityLevel.Error);\r\n this.goHome();\r\n return;\r\n }\r\n\r\n if (basket.IsModifiable) {\r\n return;\r\n }\r\n\r\n if (!basket.OrderId) {\r\n await clearOldBasket();\r\n return;\r\n }\r\n\r\n this.basket = null;\r\n await this._checkoutService.deleteOrderById(basket.OrderId).catch(async () => await clearOldBasket());\r\n this.getCurrentBasketBySiteId();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * tracks the current basket\r\n */\r\n private trackCurrentBasket(): void {\r\n this._basketService.currentBasket$\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((basket: Basket) => {\r\n const isNewBasket: boolean = !this.basket || !basket || this.basket.Id !== basket.Id;\r\n\r\n this.basket = basket;\r\n\r\n if (!basket) {\r\n return;\r\n }\r\n\r\n if (isNewBasket) {\r\n this.getAvailableOrderDates();\r\n }\r\n\r\n this.trackBasketCount(basket);\r\n this.basketWantedTime = this.getWantedTime();\r\n this.basketTotal = this.basket.Charges?.find((x: Charge) => x.ChargeType === ChargeTypes.Total)?.Price.Amount ?? 0;\r\n\r\n if (this._menuService.menuValue) {\r\n this.sections = this.getMenuSections(this._menuService.menuValue);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * tracks the active notifications\r\n */\r\n private trackNotifications(): void {\r\n this._toastService.activeNotifications$\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((x: IDictionary>) => {\r\n this.notifications = x;\r\n });\r\n }\r\n\r\n /**\r\n * returns the user to the home page.\r\n */\r\n private goHome(): void {\r\n if (!this.router.url.includes('/menu')) {\r\n return;\r\n }\r\n\r\n this._toastService.showToast(ToastTypes.error, 'Something\\'s gone wrong');\r\n this.router.navigate([this._navigatorService.generateHomePath()]);\r\n }\r\n\r\n /**\r\n * scrolls to the given web section (`groupName`)\r\n */\r\n private scrollToWebSection(groupName: string): void {\r\n const element: HTMLElement = document.getElementById(groupName);\r\n\r\n if (!element) {\r\n return;\r\n }\r\n\r\n if (this.isMobile) {\r\n setTimeout(() => window.scrollTo({ behavior: 'smooth', top: element.offsetTop }), this._scrollDelay);\r\n return;\r\n }\r\n\r\n const parent: HTMLElement = document.getElementById('menu-content');\r\n const catBar: HTMLElement = document.getElementById('categories-bar');\r\n parent.scrollTo({ behavior: 'smooth', top: element.offsetTop - catBar.offsetHeight });\r\n }\r\n\r\n /**\r\n * sets a focus to a search filed\r\n */\r\n private setSearchFieldFocus(): void {\r\n const searchFocusDelay: number = 10;\r\n setTimeout(() => this._searchElement.nativeElement.focus(), searchFocusDelay);\r\n }\r\n\r\n /**\r\n * returns the baskets wanted time formatted as HH:mm or 'ASAP'.\r\n */\r\n private getWantedTime(): string {\r\n if (this.basket.WantedTimeUtc) {\r\n const _date = new Date(this.replaceZuluTime(this.basket.WantedTimeUtc));\r\n return this._datePipe.transform(_date, this.isToday(_date) ? 'HH:mm' : 'EEE dd/MM HH:mm');\r\n } else {\r\n return 'ASAP';\r\n }\r\n }\r\n\r\n private isToday(date: Date): boolean {\r\n const today = new Date();\r\n return date.getDate() === today.getDate() && date.getMonth() === today.getMonth();\r\n }\r\n\r\n /**\r\n * updates the `IsStoreOpen` property\r\n */\r\n private async getAvailableOrderDates(): Promise {\r\n const dates: IDaysTimeSlots = await this._basketService.getTimeSlotsForBasket(this.basket.Id, true);\r\n this.isStoreOpen = dates.Dates?.length > 0 || dates.AllowAsap;\r\n\r\n if (!this.isStoreOpen) {\r\n const nextDate = new Date();\r\n nextDate.setDate(nextDate.getDate() + 1);\r\n const times: BasketAvailableTime[] = await lastValueFrom(this._basketService.getBasketsAvailableTimes(this.basket.Id, nextDate, true));\r\n const hasTimes = times.flatMap((x: BasketAvailableTime) => x.Time).filter((x: string) => x < '06:00:00').length > 0;\r\n\r\n if (hasTimes) {\r\n this.isStoreOpen = true;\r\n }\r\n }\r\n }\r\n}\r\n","import { AfterViewInit, Component, OnDestroy, TemplateRef, ViewChild } from '@angular/core';\r\nimport { MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\r\nimport { ActivatedRoute, Params, Router } from '@angular/router';\r\nimport { HttpStatusCodeHandler } from '@app/core/http.status.codes';\r\nimport { NavigatorService } from '@app/core/navigator.service';\r\nimport { DisplayOccasionType } from '@app/models/display-occasion-type';\r\nimport { NavigationSectionType } from '@app/models/navigation/navigation-section-type';\r\nimport { OrderOccasion } from '@app/models/order-occasion';\r\nimport { BasketService } from '@app/api/basket.service';\r\nimport { MenuService } from '@app/api/menu.service';\r\nimport { takeUntil } from 'rxjs';\r\nimport { ProductAddEvent } from '@app/models/product/product-add-event';\r\nimport { ProductView } from '@app/models/product/product-view';\r\nimport { MenuHelperService } from '@app/shared/services/menu-helper/menu-helper.service';\r\nimport { SEOService } from '@app/shared/services/seo.service';\r\nimport { SiteService } from '@app/api/site.service';\r\nimport { AndroWebCoreComponent } from '@app/core/AndroWebCoreComponent';\r\nimport { Menu } from '@app/models/menu/menu';\r\nimport { Product } from '@app/models/menu/product';\r\n\r\n@Component({\r\n template: `\r\n \r\n \r\n \r\n `\r\n})\r\nexport class ProductsDialogEntryComponent extends AndroWebCoreComponent implements AfterViewInit, OnDestroy {\r\n @ViewChild('ProductModal') private _productModal: TemplateRef;\r\n\r\n public productView: ProductView;\r\n public orderOccasion: OrderOccasion;\r\n\r\n private _dialogRef: MatDialogRef;\r\n\r\n private _seoSet: boolean;\r\n private _group: string;\r\n\r\n constructor(\r\n private _router: Router,\r\n private _seoService: SEOService,\r\n private _menuService: MenuService,\r\n private _siteService: SiteService,\r\n private _basketService: BasketService,\r\n private _activatedRoute: ActivatedRoute,\r\n private _navigatorService: NavigatorService,\r\n private _menuHelperService: MenuHelperService\r\n ) {\r\n super();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this._menuService.menu$\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((menu: Menu) => {\r\n if (!menu) {\r\n return;\r\n }\r\n\r\n const id = this._activatedRoute.snapshot.paramMap.get('productId');\r\n const location = this._activatedRoute.snapshot.paramMap.get('location');\r\n const occasion: string = this._navigatorService.changeTakeAwayToCollection(this._activatedRoute.snapshot.paramMap.get('occasion'));\r\n this.orderOccasion = DisplayOccasionType[this._navigatorService.toTitleCase(occasion)];\r\n this._group = this._activatedRoute.snapshot.paramMap.get('displayGroup');\r\n\r\n const product = menu.Products.find((x: Product) => x.Id === id);\r\n\r\n if (!product) {\r\n return;\r\n }\r\n\r\n this.productView = {\r\n name: product.Name,\r\n description: product.Description,\r\n href: this._navigatorService.generateRoutePath(location, this.orderOccasion, NavigationSectionType.Menu, this._group),\r\n imageSource: this.getMenuImageVisualAsset({ data: product, height: 244 }),\r\n isInDeal: false,\r\n allergens: this._menuHelperService.getAllergenSummary(product.Allergens),\r\n variants: product.Variants,\r\n upselling: product.Upselling,\r\n save: (event: ProductAddEvent) => this.onSave(event)\r\n };\r\n\r\n this._seoService.updateProductSeoTitleAndDescription(\r\n this._siteService.currentSite,\r\n this.orderOccasion,\r\n this._group,\r\n this.productView\r\n );\r\n this._seoSet = true;\r\n\r\n this.openProductDialog();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n super.ngOnDestroy();\r\n if (this._seoSet) {\r\n this._seoService.restore();\r\n }\r\n }\r\n\r\n public close(): void {\r\n this._dialogRef.close();\r\n }\r\n\r\n /**\r\n * saves the product to the basket\r\n * @param event\r\n */\r\n private async onSave(event: ProductAddEvent): Promise {\r\n if (!event) {\r\n return;\r\n }\r\n\r\n const response = await this._basketService.addProductToBasket(event.item, this.productView.name, this._group, event.itemPrice);\r\n\r\n if (HttpStatusCodeHandler.isSuccessResponse(response)) {\r\n this.close();\r\n }\r\n }\r\n\r\n /**\r\n * opens the product component in a dialog.\r\n */\r\n private openProductDialog(): void {\r\n const config: MatDialogConfig = {\r\n height: this.isMobile ? '100%' : '',\r\n panelClass: ['custom-dialog-two-container', 'product-modal'],\r\n width: this.isMobile ? '100%' : '450px',\r\n ariaModal: false\r\n };\r\n\r\n this._dialogRef = this.openDialog(this._productModal, 'productsModal', config);\r\n\r\n this._dialogRef.afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n const params: Params = this._activatedRoute.snapshot.params;\r\n\r\n if (params && (params.productId || params.productName)) {\r\n const routePath: string = this._navigatorService.generateRoutePath(params.location, params.occasion, NavigationSectionType.Menu, params.displayGroup);\r\n this._router.navigate([routePath]);\r\n }\r\n\r\n this.resetSEO();\r\n });\r\n }\r\n\r\n /**\r\n * Restores the title and description\r\n */\r\n private resetSEO(): void {\r\n if (this._seoSet) {\r\n this._seoService.restore();\r\n }\r\n\r\n this._seoSet = false;\r\n }\r\n}\r\n","import { AfterViewInit, Component, OnDestroy, TemplateRef, ViewChild } from '@angular/core';\r\nimport { MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\r\nimport { ActivatedRoute, Params, Router } from '@angular/router';\r\nimport { AndroWebCoreComponent } from '@app/core/AndroWebCoreComponent';\r\nimport { NavigatorService } from '@app/core/navigator.service';\r\nimport { DisplayOccasionType } from '@app/models/display-occasion-type';\r\nimport { NavigationSectionType } from '@app/models/navigation/navigation-section-type';\r\nimport { OrderOccasion } from '@app/models/order-occasion';\r\nimport { PageSEO } from '@app/models/page-seo';\r\nimport { MenuService } from '@app/api/menu.service';\r\nimport { SEOService } from '@app/shared/services/seo.service';\r\nimport { takeUntil } from 'rxjs';\r\nimport { Deal } from '@app/models/menu/deal';\r\nimport { Menu } from '@app/models/menu/menu';\r\n\r\n@Component({\r\n template: `\r\n \r\n \r\n \r\n `\r\n})\r\nexport class DealsDialogEntryComponent extends AndroWebCoreComponent implements AfterViewInit, OnDestroy {\r\n @ViewChild('ProductModal') private _productModal: TemplateRef;\r\n\r\n public deal: Deal;\r\n public orderOccasion: OrderOccasion;\r\n public group: string;\r\n\r\n private _dialogRef: MatDialogRef;\r\n private _seoSet: boolean;\r\n\r\n constructor(\r\n private _router: Router,\r\n private _seoService: SEOService,\r\n private _menuService: MenuService,\r\n private _activatedRoute: ActivatedRoute,\r\n private _navigatorService: NavigatorService\r\n ) {\r\n super();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.updatePageSEO(true);\r\n\r\n this._menuService.menu$\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((menu: Menu) => {\r\n if (!menu) {\r\n return;\r\n }\r\n\r\n // const location = this._activatedRoute.snapshot.paramMap.get('location');\r\n const routeOccasion: string = this._navigatorService.changeTakeAwayToCollection(this._activatedRoute.snapshot.paramMap.get('occasion'));\r\n this.orderOccasion = DisplayOccasionType[this._navigatorService.toTitleCase(routeOccasion)];\r\n this.group = this._activatedRoute.snapshot.paramMap.get('displayGroup');\r\n this.deal = menu.Deals.find((x: Deal) => x.Id === this._activatedRoute.snapshot.paramMap.get('dealId'));\r\n this.updatePageSEO(false);\r\n this.openDealsModal();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n super.ngOnDestroy();\r\n if (this._seoSet) {\r\n this._seoService.restore();\r\n }\r\n }\r\n\r\n /**\r\n * closes the dialog.\r\n */\r\n public close(): void {\r\n this._dialogRef.close();\r\n }\r\n\r\n /**\r\n * Takes a string with a well defined placeholder ( '{{dealName}}' ) and replaces the placeholder with the deals name then returns the updated value\r\n * @param useDefault - determines whether the default meta title and description text should be used or not\r\n */\r\n private updatePageSEO(useDefault: boolean): void {\r\n if (!useDefault) {\r\n const dealsPageSEO = this.tenant.PageSeos.find((seo: PageSEO) => seo.PageName.toLowerCase() === 'deals');\r\n\r\n if (dealsPageSEO) {\r\n this._seoSet = true;\r\n this._seoService.updateTitle(this.replaceSEOStrings(dealsPageSEO.Title));\r\n this._seoService.updateDescription(this.replaceSEOStrings(dealsPageSEO.Description));\r\n return;\r\n }\r\n }\r\n\r\n const title: string = this.replaceSEOStrings('{{dealName}} - {{TenantWebsiteName}}');\r\n this._seoService.updateTitle(title);\r\n this._seoService.updateDescription('{{TenantWebsiteName}} fresh food prepared daily');\r\n this._seoSet = true;\r\n }\r\n\r\n /**\r\n * takes a string with a well defined placeholder ( '{{dealName}}' ) and replaces the placeholder with the deals name then returns the updated value\r\n * @param updateText - the text string with a well defined placeholder\r\n */\r\n private replaceSEOStrings(updateText: string): string {\r\n let result = '';\r\n\r\n if (this.deal?.Name && updateText.includes('{{dealName}}')) {\r\n result = result\r\n ? result.replace('{{dealName}}', this.deal.Name)\r\n : updateText.replace('{{dealName}}', this.deal.Name);\r\n }\r\n\r\n return result ?? updateText;\r\n }\r\n\r\n /**\r\n * opens the product component in a dialog.\r\n */\r\n private openDealsModal(): void {\r\n const config: MatDialogConfig = {\r\n height: this.isMobile ? '100%' : '',\r\n panelClass: ['custom-dialog-two-container', 'product-modal'],\r\n width: this.isMobile ? '100%' : '450px',\r\n ariaModal: false\r\n };\r\n\r\n this._dialogRef = this.openDialog(this._productModal, 'productsModal', config);\r\n\r\n this._dialogRef.afterClosed()\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(() => {\r\n const params: Params = this._activatedRoute.snapshot.params;\r\n\r\n if (params && (params.productId || params.productName)) {\r\n const routePath: string = this._navigatorService.generateRoutePath(params.location, params.occasion, NavigationSectionType.Menu, params.displayGroup);\r\n this._router.navigate([routePath]);\r\n }\r\n });\r\n }\r\n}\r\n","import { RouterModule, Routes } from '@angular/router';\r\n\r\nimport { MenuComponent } from '@app/modules/menu/menu.component';\r\nimport { NgModule } from '@angular/core';\r\nimport { SiteResolver } from '@app/core/site.service.resolver';\r\nimport { ProductsDialogEntryComponent } from '@app/modules/menu/components/products-dialog-entry/products-dialog-entry.component';\r\nimport { DealsDialogEntryComponent } from '@app/modules/menu/components/deals-dialog-entry/deals-dialog-entry.component';\r\n\r\nconst routes: Routes = [\r\n {\r\n children: [\r\n {\r\n component: ProductsDialogEntryComponent,\r\n path: ':productName/:productId'\r\n },\r\n {\r\n component: DealsDialogEntryComponent,\r\n path: 'offers/:productName/:dealId'\r\n }\r\n ],\r\n component: MenuComponent,\r\n path: ':displayGroup',\r\n resolve: {\r\n siteResolver: SiteResolver\r\n }\r\n },\r\n {\r\n component: MenuComponent,\r\n path: '',\r\n resolve: {\r\n siteResolver: SiteResolver\r\n }\r\n }\r\n];\r\n\r\n@NgModule({\r\n exports: [RouterModule],\r\n imports: [RouterModule.forChild(routes)]\r\n})\r\nexport class MenuRoutingModule { }\r\n","import { Component, Input, OnChanges, SimpleChanges, TemplateRef, ViewChild } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { AndroWebCoreComponent } from '@app/core/AndroWebCoreComponent';\r\nimport { NavigatorService } from '@app/core/navigator.service';\r\nimport { INotification } from '@app/models/INotification';\r\nimport { NavigationSectionType } from '@app/models/navigation/navigation-section-type';\r\nimport { AnalyticsService } from '@app/app-initialisers/analytics-service/analytics.service';\r\nimport { BasketService } from '@app/api/basket.service';\r\nimport { Observable } from 'rxjs';\r\nimport { BasketItemCreate } from '@app/models/basket/BasketItemCreate';\r\nimport { OrderOccasion } from '@app/models/order-occasion';\r\nimport { MenuItemView } from '@app/models/menu/menu-item-view';\r\nimport { MenuHelperService } from '@app/shared/services/menu-helper/menu-helper.service';\r\nimport { MenuService } from '@app/api/menu.service';\r\nimport { Deal } from '@app/models/menu/deal';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { MenuDealHelperService } from '@app/shared/services/menu-deal-helper/menu-deal-helper.service';\r\nimport { MenuVariantHelperService } from '@app/shared/services/menu-variant-helper/menu-variant-helper.service';\r\nimport { OccasionPrice } from '@app/models/menu/occasion-price';\r\nimport { ProductUpsellOption } from '@app/modules/menu/components/deal-upsell-modal/deal-upsell-modal.component';\r\n\r\n@Component({\r\n selector: 'app-menu-card',\r\n styleUrls: ['./menu-card.component.scss'],\r\n templateUrl: './menu-card.component.html'\r\n})\r\nexport class MenuCardComponent extends AndroWebCoreComponent implements OnChanges {\r\n @ViewChild('futureOrdersDisallowed') private _disallowedModal: TemplateRef;\r\n @ViewChild('upsellModal') private _upsellModal: TemplateRef;\r\n\r\n @Input() public menuItem: MenuItemView;\r\n\r\n @Input('occasion') private _occasion: OrderOccasion;\r\n @Input('siteId') private _siteId: string;\r\n @Input('isStoreOpen') private _isStoreOpen: boolean;\r\n @Input('customerGroupName') private _customerGroupName: string;\r\n @Input('notification') private _notification?: Observable;\r\n @Input('wantedTime') public _wantedTime: string;\r\n\r\n public showImages: boolean;\r\n public activeNotification: INotification;\r\n public routePath: string;\r\n public upsellPrompt: string;\r\n public upsellOptions: { name: string; deal: Deal; }[];\r\n public upsellDialogRef: MatDialogRef;\r\n\r\n constructor(\r\n private _router: Router,\r\n private _menuService: MenuService,\r\n private _basketService: BasketService,\r\n private _analyticsService: AnalyticsService,\r\n private _navigatorService: NavigatorService,\r\n private _menuHelperService: MenuHelperService,\r\n private _menuDealHelperService: MenuDealHelperService,\r\n private _menuVariantHelperService: MenuVariantHelperService\r\n ) {\r\n super();\r\n this.showImages = !this.tenant.SuppressProductImages;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes._notification) {\r\n this.trackNotification();\r\n }\r\n\r\n this.routePath = this.getRoutePath();\r\n }\r\n\r\n /**\r\n * adds the product to basket if the store is open. Opens the disallowed modal if not.\r\n * @param $event\r\n */\r\n public goToItemPage(): void {\r\n if (!this.menuItem.available || this.menuItem.outOfStock) {\r\n return;\r\n }\r\n\r\n if (!this._isStoreOpen) {\r\n this.openDisallowedModal();\r\n return;\r\n }\r\n\r\n if (this.menuItem.type === 'deal') {\r\n this.trackClickMenuItem();\r\n this._router.navigateByUrl(this.routePath);\r\n return;\r\n }\r\n\r\n if (this.menuItem.upselling) {\r\n this.openUpsellModal();\r\n return;\r\n }\r\n\r\n this.goToProductPage();\r\n }\r\n\r\n /**\r\n * navigates to the product page.\r\n */\r\n public goToProductPage(): void {\r\n this.trackClickMenuItem();\r\n this._router.navigateByUrl(this.routePath);\r\n }\r\n\r\n /**\r\n * navigates to the deal page.\r\n * @param path\r\n */\r\n public goToDealPage(deal: Deal): void {\r\n this.trackClickMenuItem();\r\n this._router.navigateByUrl(this.getDealRoutePath(deal.Id));\r\n }\r\n\r\n /**\r\n * adds the product to basket if the item is simple and addStraightToBasket is true or opens the product page.\r\n * @param addStraightToBasket\r\n */\r\n public async addItemToBasket($event?: MouseEvent): Promise {\r\n if ($event) {\r\n $event.preventDefault();\r\n $event.stopPropagation();\r\n }\r\n\r\n if (this.menuItem.type === 'deal' || !this._menuVariantHelperService.isProductSimple(this.menuItem.variants!)) {\r\n this.goToItemPage();\r\n return;\r\n }\r\n\r\n if (this.menuItem.upselling) {\r\n this.openUpsellModal();\r\n return;\r\n }\r\n\r\n const payload: BasketItemCreate = {\r\n Modifiers: [],\r\n Product: {\r\n Item: this.menuItem.variants[0].Id,\r\n Quantity: 1\r\n }\r\n };\r\n\r\n const price = this.menuItem.variants[0].Prices.find((x: OccasionPrice) => x.Occasion === this._occasion)?.Amount;\r\n await this._basketService.addProductToBasket(payload, this.menuItem.name, this._customerGroupName, price);\r\n }\r\n\r\n /**\r\n * opens the disallowed modal.\r\n */\r\n private openDisallowedModal(): void {\r\n this.openDialog(this._disallowedModal, 'future-orders-disallowed-modal', {\r\n autoFocus: false,\r\n disableClose: false,\r\n width: this.isMobile ? '100%' : ''\r\n });\r\n }\r\n\r\n /**\r\n * subscribes to {@link notification} and updates the {@link activeNotification} property.\r\n */\r\n private trackNotification(): void {\r\n if (this.subscriptions$['MenuDisplayGroupCard-ngOnChanges-notification']) {\r\n return;\r\n }\r\n\r\n this.subscriptions$['MenuDisplayGroupCard-ngOnChanges-notification']\r\n = this._notification?.subscribe((x: INotification) => {\r\n this.activeNotification = x;\r\n\r\n if (!this.activeNotification) {\r\n this.subscriptions$['MenuDisplayGroupCard-ngOnChanges-notification'].unsubscribe();\r\n this.subscriptions$['MenuDisplayGroupCard-ngOnChanges-notification'] = null;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * returns the url of the product.\r\n */\r\n private getRoutePath(): string {\r\n const routePath: string = this.menuItem.type === 'deal'\r\n ? this.getDealRoutePath(this.menuItem.id)\r\n : this.getProductRoutePath(this.menuItem.id);\r\n return routePath;\r\n }\r\n\r\n /**\r\n * returns the url of the deal.\r\n * @param dealId\r\n */\r\n private getDealRoutePath(dealId: string): string {\r\n const location: string = this._navigatorService.getLocationBySiteId(this._siteId);\r\n\r\n return this._navigatorService.generateRoutePath(\r\n location,\r\n this._occasion,\r\n NavigationSectionType.Menu,\r\n this._customerGroupName,\r\n this.menuItem.name,\r\n null,\r\n dealId\r\n );\r\n }\r\n\r\n /**\r\n * returns the url of the product.\r\n * @param productId\r\n */\r\n private getProductRoutePath(productId: string): string {\r\n const location: string = this._navigatorService.getLocationBySiteId(this._siteId);\r\n\r\n return this._navigatorService.generateRoutePath(\r\n location,\r\n this._occasion,\r\n NavigationSectionType.Menu,\r\n this._customerGroupName,\r\n this._navigatorService.clean(this.menuItem.name?.split(' ').join('-')),\r\n productId\r\n );\r\n }\r\n\r\n /**\r\n * opens the upsell modal.\r\n */\r\n private openUpsellModal(): void {\r\n this.upsellOptions = this.menuItem.upselling.Deals.Ids\r\n .map((id: string) => this.mapToProductUpsellOption(id, this.menuItem.price))\r\n .filter((x: ProductUpsellOption) => x);\r\n\r\n if (this.upsellOptions.length === 0) {\r\n this.goToProductPage();\r\n return;\r\n }\r\n\r\n this.upsellPrompt = this.menuItem.upselling.Deals.Prompt ?? 'Would you like to make it a meal?';\r\n\r\n this.upsellDialogRef = this.openDialog(this._upsellModal, 'upsell-modal', {\r\n autoFocus: false,\r\n disableClose: false,\r\n width: this.isMobile ? '100%' : '',\r\n maxHeight: '100%'\r\n });\r\n }\r\n\r\n /**\r\n * maps the deal id to a product upsell option.\r\n * @param dealId\r\n * @param originalPrice the original price of the product.\r\n */\r\n private mapToProductUpsellOption(dealId: string, originalPrice: number): ProductUpsellOption {\r\n const deal: Deal = this._menuService.menuValue.Deals.find((x) => x.Id === dealId);\r\n\r\n if (!deal || deal.OutOfStock || deal.RequiresUnlock) {\r\n return null;\r\n }\r\n\r\n const wantedTime = this._wantedTime ? new Date(this._wantedTime) : null;\r\n const isAvailable = this._menuHelperService.availableForOccasion(deal.Availability?.Values, OrderOccasion[this._occasion], wantedTime);\r\n\r\n if (!isAvailable) {\r\n return null;\r\n }\r\n\r\n const price = this._menuDealHelperService.getMinPriceForDeal(deal, this._occasion);\r\n const currency = '£';\r\n const total = Math.round((price - originalPrice + Number.EPSILON) * 100) / 100;\r\n\r\n return {\r\n name: total > 0 ? `${deal.Name} +${currency}${total.toFixed(2)}` : deal.Name,\r\n deal: deal\r\n };\r\n }\r\n\r\n private trackClickMenuItem(): void {\r\n this._analyticsService.trackClickProduct(\r\n this.menuItem.name,\r\n this.menuItem.id,\r\n this._customerGroupName,\r\n this.menuItem.price,\r\n 'GBP'\r\n );\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { MenuItemView } from '@app/models/menu/menu-item-view';\r\nimport { MenuSectionView } from '@app/models/menu/menu-section-view';\r\n\r\n@Pipe({\r\n name: 'filterMenuItems',\r\n standalone: true\r\n})\r\nexport class FilterMenuItemsPipe implements PipeTransform {\r\n transform(sections: MenuSectionView[], searchTerm: string): MenuSectionView[] {\r\n if (!sections || !searchTerm || !searchTerm.trim()) {\r\n return sections;\r\n }\r\n\r\n const lowerSearchTerm = searchTerm.toLowerCase();\r\n const menuItemHasSearchTerm = (item: MenuItemView) => item.name.toLowerCase().includes(lowerSearchTerm)\r\n || item.description?.toLowerCase().includes(lowerSearchTerm);\r\n\r\n return sections\r\n .filter((x: MenuSectionView) => x.menuItems.some(menuItemHasSearchTerm))\r\n .map((x: MenuSectionView) => ({\r\n ...x,\r\n menuItems: x.menuItems.filter(menuItemHasSearchTerm)\r\n }));\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { Deal } from '@app/models/menu/deal';\r\nimport { MenuItemView } from '@app/models/menu/menu-item-view';\r\n\r\nexport type ProductUpsellOption = {\r\n name: string;\r\n deal: Deal;\r\n};\r\n\r\n@Component({\r\n selector: 'app-deal-upsell-modal',\r\n templateUrl: './deal-upsell-modal.component.html',\r\n styleUrls: ['./deal-upsell-modal.component.css'],\r\n standalone: true\r\n})\r\nexport class DealUpsellModalComponent {\r\n @Input({ required: true }) public prompt: string = 'Would you like to make it a meal?';\r\n @Input({ required: true }) public options: ProductUpsellOption[];\r\n @Input({ required: true }) public menuItem: MenuItemView;\r\n @Input({ required: true }) public dialogRef: MatDialogRef;\r\n\r\n @Output('onSelectDeal') private _onSelectDeal = new EventEmitter();\r\n @Output('onSelectMenuItem') private _onSelectMenuItem = new EventEmitter();\r\n\r\n constructor() {}\r\n\r\n public selectDeal(deal: Deal): void {\r\n this._onSelectDeal.emit(deal);\r\n this.dialogRef.close();\r\n }\r\n\r\n public selectMenuItem(): void {\r\n this._onSelectMenuItem.emit();\r\n this.dialogRef.close();\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MenuComponent } from '@app/modules/menu/menu.component';\r\nimport { MenuRoutingModule } from '@app/modules/menu/menu-routing.module';\r\nimport { SharedComponentsModule } from '@app/shared/components/shared-components.module';\r\nimport { ProductsDialogEntryComponent } from '@app/modules/menu/components/products-dialog-entry/products-dialog-entry.component';\r\nimport { DealsDialogEntryComponent } from '@app/modules/menu/components/deals-dialog-entry/deals-dialog-entry.component';\r\nimport { MenuCardComponent } from '@app/modules/menu/components/menu-card/menu-card.component';\r\nimport { FilterMenuItemsPipe } from '@app/modules/menu/pipes/menu-sections-filter';\r\nimport { WantedTimePickerComponent } from '@app/shared/components/wanted-time/wanted-time-picker/wanted-time-picker.component';\r\nimport { DealUpsellModalComponent } from '@app/modules/menu/components/deal-upsell-modal/deal-upsell-modal.component';\r\n@NgModule({\r\n declarations: [\r\n MenuComponent,\r\n ProductsDialogEntryComponent,\r\n DealsDialogEntryComponent,\r\n MenuCardComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MenuRoutingModule,\r\n SharedComponentsModule,\r\n WantedTimePickerComponent,\r\n FilterMenuItemsPipe,\r\n DealUpsellModalComponent\r\n ]\r\n})\r\nexport class MenuModule {}\r\n","// Imports\nvar ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ = require(\"../../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\");\nvar ___CSS_LOADER_API_IMPORT___ = require(\"../../../../../../node_modules/css-loader/dist/runtime/api.js\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `section.deal-upsell-modal {\r\n padding: 20px;\r\n}\r\n\r\nsection.deal-upsell-modal ul {\r\n list-style: none;\r\n padding: 0;\r\n margin: 0;\r\n max-height: calc(100vh - 185px);\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n margin-top: -5px;\r\n}\r\n\r\n.upsell-option {\r\n font-size: 14px;\r\n border: thin solid rgba(0, 0, 0, 0.12);\r\n margin: 5px 0 10px;\r\n padding: 20px;\r\n width: 100%;\r\n text-align: center;\r\n cursor: pointer;\r\n border-radius: 8px;\r\n list-style: none;\r\n background-color: #ffe6cc;\r\n}\r\n`, \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___.toString();\n","// Imports\nvar ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ = require(\"../../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\");\nvar ___CSS_LOADER_API_IMPORT___ = require(\"../../../../../../node_modules/css-loader/dist/runtime/api.js\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:root {\n --footer-background-colour: #333333;\n --footer-link-colour: #fff;\n --nav-bar-background-colour: #fff;\n --product-content-padding: 0 10px;\n}\n\n.menu-card-content-container {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 6px;\n}\n.menu-card-content-description {\n font-size: 14px;\n margin-bottom: 0;\n}\n.menu-card-content-title {\n font-family: Tenant-Bold, Courier, Helvetica, sans-serif;\n font-size: 17px;\n margin: 3px 0;\n}\n.menu-card-image {\n min-height: 185px;\n min-width: 328px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 5px;\n}\n.menu-card-image img {\n max-width: 100%;\n}\n\n.menu-card-price {\n display: flex;\n font-family: Tenant-Bold, Courier, Helvetica, sans-serif;\n justify-content: space-between;\n padding: 5px 0;\n}\n\n.menu-card-price-amount .mat-icon {\n height: 20px;\n width: 20px;\n font-size: 20px;\n}\n\n.menu-card-price-amount:not(:disabled) {\n color: #fff;\n}\n\n.menu-card-add-button:not(:disabled) {\n background-color: #E3000E;\n}\n\n.menu-card-add-button {\n width: 100%;\n height: 36px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n overflow: hidden;\n}\n\n.menu-card-add-button.notify {\n background-color: #0D6EFD;\n}\n\n.menu-card-content {\n margin-bottom: 3px;\n}\n\n.flex-row.menu-card-add-button-inner {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.flex-row.menu-card-add-button-inner span {\n margin: 0 2px;\n}\n\n.no-pointer-events {\n pointer-events: none;\n}\n\n.category {\n align-items: center;\n display: flex;\n flex-direction: column;\n}\n.category-item {\n background-color: #fff;\n border: 1px solid #e8e8e8;\n border-radius: 6px;\n box-shadow: 0 0 25px 1px rgba(53, 53, 53, 0.25);\n margin: 0 15px 35px;\n max-width: 350px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n cursor: pointer;\n}\n\n.menu-card-imageless {\n width: 328px;\n}\n\n.category-item-unavaliable {\n opacity: 0.75;\n}\n\n.menu-card-content-nutrition {\n font-size: 12px;\n}\n\n@media screen and (max-width: 1023px) {\n .menu-card-image {\n min-height: 185px;\n min-width: 328px;\n }\n}\n@media screen and (max-width: 479px) {\n .menu-card-image {\n min-height: 95px;\n min-width: 170px;\n }\n .menu-card.category-item {\n margin: 0 10px 20px;\n }\n h3.menu-card-content-title {\n margin: 0;\n font-size: 14px !important;\n }\n p.menu-card-content-description {\n font-size: 10px;\n padding: 0 3px;\n }\n .menu-card.category-item {\n margin: 0 2px 5px;\n padding: 1px;\n overflow: hidden;\n width: 100%;\n }\n .menu-card-price {\n padding: 1px 0;\n }\n .menu-card-price-amount {\n font-size: 11px;\n }\n .menu-card-price-amount .mat-icon {\n height: 15px;\n width: 15px;\n margin-top: 0;\n font-size: 15px;\n }\n .menu-card-add-button {\n height: 30px;\n }\n .menu-card-imageless {\n width: unset;\n }\n .menu-card-imageless .menu-card-price {\n padding: 5px 0;\n }\n}\n@media screen and (max-width: 479px) and (max-width: 340px) {\n .menu-card.category-item {\n width: 300px;\n }\n .menu-card-image {\n min-width: unset;\n min-height: 156px;\n }\n}`, \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___.toString();\n","// Imports\nvar ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ = require(\"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\");\nvar ___CSS_LOADER_API_IMPORT___ = require(\"../../../../node_modules/css-loader/dist/runtime/api.js\");\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:root {\n --footer-background-colour: #333333;\n --footer-link-colour: #fff;\n --nav-bar-background-colour: #fff;\n --product-content-padding: 0 10px;\n}\n\n:host {\n overflow: auto;\n}\n\n.menu {\n align-items: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n height: 100%;\n}\n.menu-loading {\n align-items: center;\n display: flex;\n flex-direction: column;\n margin-top: -130px;\n}\n\n.app-display-group-card-component {\n display: flex;\n}\n\n.menu-content {\n height: 100%;\n overflow-y: auto;\n overflow-x: hidden;\n width: 100%;\n}\n.menu-content-products {\n display: flex;\n flex-direction: column;\n}\n.menu-content-products-announcement {\n max-width: 100%;\n padding: 15px;\n text-align: center;\n}\n.menu-content-products-allergens {\n color: #E3000E;\n max-width: 100%;\n padding: 15px;\n text-align: center;\n}\n.menu-content .category {\n align-items: center;\n display: flex;\n flex-direction: column;\n scroll-margin-top: 45px;\n}\n.menu-content .category-item {\n background-color: #fff;\n border: 1px solid #e8e8e8;\n border-radius: 6px;\n box-shadow: 0 0 25px 1px rgba(53, 53, 53, 0.25);\n margin: 0 15px 35px;\n max-width: 350px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n}\n.menu-content .category-item-list {\n display: flex;\n flex-direction: column;\n width: 1140px;\n}\n.menu-content .category-item-list-items {\n display: flex;\n flex-flow: row;\n flex-wrap: wrap;\n}\n.menu-content .category-name {\n font-family: Tenant-Bold, Courier, Helvetica, sans-serif;\n font-size: 20px;\n}\n\n.menu-header {\n background-color: #dbdfe6;\n width: 100%;\n}\n.menu-header-content {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: center;\n list-style-type: none;\n margin: 0;\n padding: 0;\n}\n.menu-header-content-item {\n padding: 10px 5px 0;\n display: flex;\n align-items: baseline;\n}\n.menu-header-content-item-link.search {\n padding: 12px;\n border-radius: 50%;\n margin-bottom: 0 !important;\n margin-top: 4px;\n}\n.menu-header-content-item-link.search-input {\n border: none;\n border-bottom-left-radius: 15px;\n border-top-left-radius: 15px;\n height: 36px;\n padding: 0 0 0 10px;\n transition: 0.3s ease-in-out;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.menu-header-content-item-link.search-input::-ms-clear {\n display: none;\n width: 0;\n height: 0;\n}\n\n.menu-header-content-item-link.icon {\n align-items: center;\n border: none;\n display: flex;\n height: 22px;\n justify-content: center;\n width: 22px;\n}\n.menu-header-content-item-link.icon.search {\n padding: 15px;\n border-radius: 50%;\n background-color: #443635;\n color: #fff;\n font-size: 20px;\n margin-top: 0;\n}\n.menu-header-content-item-link.icon.close {\n opacity: 0.5;\n font-size: 18px;\n}\n.menu-header-content-item-link.icon.close:hover {\n opacity: 0.8;\n}\n\n.menu-header-content-item:last-of-type {\n padding-bottom: 10px;\n}\n\n.input-group {\n display: none;\n transition: 0.7s ease-in-out;\n}\n.input-group-text {\n align-items: center;\n background-color: #fff;\n border: none;\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n cursor: pointer;\n display: flex;\n height: 36px;\n padding-left: 0;\n padding-right: 4px;\n}\n\n.input-group-append:last-of-type .input-group-text {\n border-bottom-right-radius: 16px;\n border-top-right-radius: 16px;\n}\n\n.expanded {\n align-items: center;\n border-radius: 12px !important;\n display: flex;\n flex-direction: row;\n margin-top: 0 !important;\n padding: 9px !important;\n}\n.expanded-input {\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n transition: 0.7s ease-in-out;\n}\n.expanded-icon {\n display: none !important;\n}\n\n.input-group.mb-3 {\n margin-bottom: 0 !important;\n}\n\ndiv#search-results-target {\n padding: 10px;\n}\n\n.sort {\n display: flex;\n justify-content: center;\n text-align: end;\n}\n.sort-header {\n width: 1140px;\n padding: 0 0.5%;\n}\n.sort-header-text {\n cursor: pointer;\n float: right;\n padding: 5px;\n text-align: end;\n width: 150px;\n}\n.sort-cards {\n background-color: #fff;\n box-shadow: 0 2px 8px 2px rgba(0, 0, 0, 0.175);\n border: thin solid rgba(0, 0, 0, 0.15);\n border-radius: 6px;\n cursor: pointer;\n margin: 0px 0 0 20px;\n padding: 10px 15px;\n}\n.sort-cards-ul {\n list-style-type: none;\n margin-bottom: 0;\n padding: 0;\n}\n.sort-cards-li {\n margin-bottom: 8px;\n}\n.sort-cards-li:last-of-type {\n margin-bottom: 0;\n}\n.sort-cards-li:hover {\n box-shadow: 0 2px 2px -2px #E3000E;\n}\n\n.menu-page-footer {\n height: 35px;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.menu-page-footer-branding {\n display: flex;\n align-items: center;\n overflow: hidden;\n color: #000045;\n padding-left: 4px;\n cursor: pointer;\n}\n.menu-page-footer-branding-img {\n max-height: 46px;\n margin-left: -13px;\n margin-bottom: 3px;\n}\n.menu-page-footer-branding-text {\n font-size: 12px;\n font-weight: 600;\n}\n.menu-page-footer-legal-links {\n height: 100%;\n display: flex;\n align-items: center;\n}\n.menu-page-footer-legal-links-item {\n margin-bottom: 0 !important;\n font-size: 13px;\n margin-top: -1px;\n cursor: pointer;\n color: #000045;\n padding: 0 3px;\n}\n.menu-page-footer-legal-links-item:hover {\n text-decoration: underline;\n}\n\n.category-item-list div {\n display: flex;\n}\n\n.websection-header-group {\n margin: 10px 16px;\n color: #fff;\n background-color: #424858;\n align-items: center;\n padding: 10px;\n}\n.websection-header-group div {\n display: flex;\n flex-direction: column;\n}\n.websection-header-group h1 {\n margin-bottom: 0;\n}\n.websection-header-group img {\n max-width: 125px;\n margin-right: 10px;\n}\n\n.order-wanted-details {\n height: 31px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.menu-header.sticky {\n top: 0;\n}\n\n.basket-footer.button-action-1.sticky {\n bottom: 0;\n z-index: 2;\n height: 45px;\n display: flex;\n align-items: center;\n padding: 5px;\n border-radius: 0;\n width: 100%;\n border-top: thin solid #fff;\n}\n.basket-footer.button-action-1.sticky span {\n flex: 1;\n text-transform: uppercase;\n text-align: center;\n}\n.basket-footer.button-action-1.sticky div {\n display: flex;\n margin: 0 10px;\n}\n.basket-footer.button-action-1.sticky samp {\n margin: 0 5px;\n}\n\n.order-wanted-details .wanted-time-change-button {\n margin-left: 5px;\n}\n\n.order-wanted-details .basket-delivery-time-icon {\n border-radius: 12px;\n}\n\n.order-wanted-details span:nth-child(2) {\n margin-left: 4px;\n}\n\n@media screen and (max-width: 1023px) {\n .menu-card-image {\n min-height: 185px;\n min-width: 328px;\n }\n .menu-header {\n min-height: 69px;\n overflow-x: auto;\n overflow-y: hidden;\n width: 100%;\n }\n .menu-header-content {\n white-space: nowrap;\n flex-wrap: nowrap;\n justify-content: unset;\n max-height: 100%;\n }\n .menu-header-content-item {\n margin: 10px 2px;\n padding: 0 3px;\n }\n}\n@media screen and (max-width: 479px) {\n .menu-header {\n height: 45px;\n min-height: 45px;\n }\n .menu-header-content-item {\n margin: 0 2px;\n }\n .menu-header-content-item .button-menu-cat {\n padding: 8px 30px;\n }\n .menu-header-content-item-link.search.button-menu-cat {\n padding: 6px;\n }\n .menu-header-content-item-link.search.button-menu-cat.disable-select.expanded {\n padding: 3px 5px !important;\n }\n .menu-card.category-item {\n margin: 0 10px 20px !important;\n }\n .menu-content {\n overflow-y: unset;\n padding-bottom: 45px;\n }\n .menu-content .category-item-list {\n justify-content: center;\n }\n .menu-content-products-allergens {\n padding-bottom: 0;\n text-align: center;\n }\n p:last-of-type {\n margin-bottom: 0;\n }\n .menu-page-footer {\n font-size: 12px;\n }\n .websection-header-group {\n margin: 5px 10px 2px;\n padding: 5px;\n }\n .websection-header-group img {\n width: 85px;\n margin-right: 5px;\n }\n .websection-header-group h2 {\n margin-bottom: 4px;\n font-size: 16px;\n }\n .websection-header-group span {\n font-size: 13px;\n }\n .app-display-group-card-component {\n width: 100%;\n max-width: calc(50% - 5px);\n box-sizing: border-box;\n }\n .category-item-list-items {\n justify-content: center;\n }\n}\n@media screen and (max-width: 479px) and (max-width: 340px) {\n .menu-card.category-item {\n width: 97%;\n }\n .menu-card-image {\n min-width: unset;\n min-height: 185px;\n }\n}\n@media screen and (max-width: 1140px) {\n .sort-header, .menu-content .category-item-list {\n width: 760px;\n }\n}\n@media screen and (max-width: 760px) {\n .menu-content .category-item-list {\n justify-content: center;\n width: 100%;\n }\n .sort {\n justify-content: flex-end;\n }\n .sort-cards {\n margin: 0;\n }\n .sort-header {\n padding-right: 2%;\n width: unset;\n }\n}`, \"\"]);\n// Exports\nmodule.exports = ___CSS_LOADER_EXPORT___.toString();\n"],"x_google_ignoreList":[]}