{"version":3,"file":"ship-FRJvzLQv.js","sources":["../../../scripts/components/products/details/ship-features.vue","../../../scripts/components/products/details/ship-page.vue","../../../scripts/entry-points/ship.ts"],"sourcesContent":["<template>\r\n <div class=\"product-features -narrow mt-2\">\r\n <ul>\r\n <li v-for=\"feature in shipFeatures\" :key=\"feature\">\r\n <i :class=\"shipFeatureIconMap.get(`ship-${feature}`) || 'icon-check-ut'\"></i>\r\n {{ feature }}\r\n </li>\r\n </ul>\r\n </div>\r\n</template>\r\n\r\n\r\n<script setup lang=\"ts\">\r\n import { PropType } from \"vue\";\r\n\r\n defineProps({\r\n shipFeatures: {\r\n type: Array as PropType<string[]>,\r\n default: undefined\r\n }\r\n });\r\n\r\n const shipFeatureIconMap = new Map([\r\n [\"ship-24-hour Room Service\" , \"icon-room-service\" ],\r\n [\"ship-All-Inclusive\" , \"icon-all-inclusive\"],\r\n [\"ship-Beauty Salon\" , \"icon-salon\" ],\r\n [\"ship-Broadway-style Entertainment\", \"icon-disco\" ],\r\n [\"ship-Butler Service\" , \"icon-butler\" ],\r\n [\"ship-Casino\" , \"icon-casino\" ],\r\n [\"ship-Child Care/Babysitting\" , \"icon-babysitting\" ],\r\n [\"ship-Children's Play room\" , \"icon-children2\" ],\r\n [\"ship-Children's Pool\" , \"icon-pool\" ],\r\n [\"ship-Complimentary Wi-Fi Access\" , \"icon-connection\" ],\r\n [\"ship-Cooking Classes\" , \"icon-cooking\" ],\r\n [\"ship-Elevators\" , \"icon-elevator\" ],\r\n [\"ship-Fitness Center\" , \"icon-fitness\" ],\r\n [\"ship-Fitness Classes\" , \"icon-fitness\" ],\r\n [\"ship-Formal Nights\" , \"icon-new-dress\" ],\r\n [\"ship-Hot Tub\" , \"icon-jacuzzi1\" ],\r\n [\"ship-Kosher Meals\" , \"icon-kosher-food\" ],\r\n [\"ship-Laundry/Dry Cleaning\" , \"icon-laundry\" ],\r\n [\"ship-Library\" , \"icon-library\" ],\r\n [\"ship-Movie Theatre\" , \"icon-popcorn\" ],\r\n [\"ship-Onboard Weddings\" , \"icon-wedding\" ],\r\n [\"ship-Self Service Laundromat\" , \"icon-laundry\" ],\r\n [\"ship-Showroom\" , \"icon-theater\" ],\r\n [\"ship-Single Occupancy Cabins\" , \"icon-user\" ],\r\n [\"ship-Spa\" , \"icon-spa\" ],\r\n [\"ship-Specialty Restaurants\" , \"icon-restaurant\" ],\r\n [\"ship-Supervised Youth Program\" , \"icon-children2\" ],\r\n [\"ship-Swimming Pool\" , \"icon-pool\" ],\r\n [\"ship-Water Sports Platform\" , \"icon-water-sports\" ],\r\n [\"ship-Wheelchair Accessible Cabins\", \"icon-wheelchair\" ]\r\n ]);\r\n</script>\r\n","<template>\r\n <div v-if=\"isReady\" ref=\"ship-page\" class=\"product-detail ship-page\">\r\n <div class=\"extra-wide top-splash mb-4\">\r\n <button class=\"wl-heartable -save-this -top-right d-none d-lg-block\" data-wl-type=\"cruise\" :data-wl-id=\"heartableUrl\" :data-wl-title=\"ship.shipName\"></button>\r\n <div class=\"-logo text-center\">\r\n <img v-if=\"logoUrl\" :src=\"logoUrl\" alt=\"Logo\">\r\n <h3 class=\"mt-1 mb-0\" v-html=\"ship.shipName\"></h3>\r\n </div>\r\n <div class=\"position-relative\">\r\n <button class=\"wl-heartable -top-right d-lg-none\" data-wl-type=\"cruise\" :data-wl-id=\"heartableUrl\" :data-wl-title=\"ship.shipName\" aria-label=\"Save to Wanderlist\"></button>\r\n </div>\r\n <img v-if=\"ship.featuredImageUrl\" :src=\"ship.featuredImageUrl\" width=\"100%\" class=\"top-image\" :alt=\"ship.featuredImageCaption\" :title=\"ship.featuredImageCaption\">\r\n </div>\r\n <div class=\"container mb-6\">\r\n <div class=\"product-detail-overview\">\r\n <div class=\"-info\">\r\n <h1 v-html=\"ship.shipName\"></h1>\r\n <a :href=\"brandUrl\"><b v-html=\"ship.supplierName\"></b></a>\r\n\r\n <div v-if=\"ship.passengerCount\" class=\"mt-2\">Passenger Capacity: <b v-html=\"ship.passengerCount\"></b></div>\r\n <div v-if=\"ship.crewCount\" class=\"mt-1\">Crew: <b v-html=\"ship.crewCount\"></b></div>\r\n\r\n <div v-if=\"ship.description\" class=\"mt-2\" v-html=\"ship.description\"></div>\r\n <ship-features-component v-if=\"ship.shipFeatures.length\" :ship-features=\"ship.shipFeatures\"></ship-features-component>\r\n <a v-if=\"!isNetworkUser() && !isEmbeddedMode()\" id=\"advisor-catalog-link\" class=\"mt-2 btn btn-primary-emphasis btn-sm d-block\" :href=\"advisorCatalogLink\" v-html=\"findAnAdvisorLabel\"></a>\r\n </div>\r\n <div class=\"-gallery mt-5 mt-md-0\">\r\n <image-gallery-component v-if=\"ship.galleryImages && ship.galleryImages.length\"\r\n :gallery-data=\"ship.galleryImages\"\r\n :product-id=\"ship.id.toString()\"\r\n :product-name=\"ship.shipName\"\r\n :product-type=\"ProductType.SHIPS\"></image-gallery-component>\r\n <button class=\"wl-heartable -save-this mt-3\" data-wl-type=\"cruise\" :data-wl-id=\"heartableUrl\" :data-wl-title=\"ship.shipName\" aria-label=\"Save to Wanderlist\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div id=\"detail-tabs\"></div>\r\n <div v-if=\"showTabBlock\" class=\"container d-none d-md-block\">\r\n <ul class=\"tab-nav-container\">\r\n <li v-if=\"productCardCollection.productCards.length\" id=\"tab-products\"><button @click=\"showTab('products')\">Sailings</button></li>\r\n <li v-if=\"showShipInfo\" id=\"tab-ship-info\"><button @click=\"showTab('ship-info')\">Ship Info</button></li>\r\n <li v-if=\"ship.deckPlansUrl\" id=\"tab-deck-plans\" class=\"d-none d-md-block\"><button @click=\"showTab('deck-plans')\">Deck Plans</button></li>\r\n <li v-if=\"ship.stateroomsUrl\" id=\"tab-staterooms\" class=\"d-none d-md-block\"><button @click=\"showTab('staterooms')\">Staterooms</button></li>\r\n <li v-if=\"ship.publicAreasUrl\" id=\"tab-public-areas\" class=\"d-none d-md-block\"><button @click=\"showTab('public-areas')\">Public Areas</button></li>\r\n <li v-if=\"ship.reviewsCount > 0\" id=\"tab-reviews\"><button @click=\"showTab('reviews')\">Reviews & Recommendations</button></li>\r\n </ul>\r\n </div>\r\n <div v-if=\"showTabBlock\" class=\"slab -tab-slab\">\r\n <div class=\"container\">\r\n <ul class=\"tab-content\">\r\n <li v-if=\"productCardCollection.productCards.length\" id=\"tc-products\">\r\n <button class=\"tab-nav\" @click=\"showTab('products')\">Sailings</button>\r\n <div class=\"-container\">\r\n <h4 class=\"tab-title\">Sailings</h4>\r\n <product-cards-component v-if=\"productCardCollection.productCards.length\" :content=\"productCardCollection\" class=\"slab py-0\"></product-cards-component>\r\n </div>\r\n </li>\r\n <li v-if=\"showShipInfo\" id=\"tc-ship-info\">\r\n <button class=\"tab-nav\" @click=\"showTab('ship-info')\">Ship Info</button>\r\n <div class=\"-container\">\r\n <h4 class=\"tab-title\">Ship Info</h4>\r\n <div class=\"ship-info\">\r\n <div v-if=\"ship.yearLaunched\">Inaugural Sailing: <b v-html=\"ship.yearLaunched\"></b></div>\r\n <div v-if=\"ship.yearRefurbished\">Renovated: <b v-html=\"ship.yearRefurbished\"></b></div>\r\n <div v-if=\"ship.tonnage\">Tonnage: <b v-html=\"ship.tonnage\"></b></div>\r\n <div v-if=\"ship.deckCount\">Public Decks: <b v-html=\"ship.deckCount\"></b></div>\r\n </div>\r\n <div v-if=\"ship.whatIsIncluded\" class=\"mt-2\">\r\n <b>Included</b><br />\r\n <div v-html=\"ship.whatIsIncluded\"></div>\r\n </div>\r\n <div v-if=\"ship.whatIsNotIncluded\" class=\"mt-2\">\r\n <b>Not Included</b><br />\r\n <div v-html=\"ship.whatIsNotIncluded\"></div>\r\n </div>\r\n </div>\r\n </li>\r\n <li v-if=\"ship.deckPlansUrl\" id=\"tc-deck-plans\" class=\"d-none d-md-block\">\r\n <button class=\"tab-nav\" @click=\"showTab('deck-plans')\">Deck Plans</button>\r\n <div class=\"-container\">\r\n <div class=\"alsek-wrapper\">\r\n <iframe :src=\"ship.deckPlansUrl\" width=\"100%\" frameborder=\"0\" title=\"Deck Plans\"></iframe>\r\n </div>\r\n </div>\r\n </li>\r\n <li v-if=\"ship.stateroomsUrl\" id=\"tc-staterooms\" class=\"d-none d-md-block\">\r\n <button class=\"tab-nav\" @click=\"showTab('staterooms')\">Staterooms</button>\r\n <div class=\"-container\">\r\n <div class=\"alsek-wrapper\">\r\n <iframe :src=\"ship.stateroomsUrl\" width=\"100%\" frameborder=\"0\" title=\"Staterooms\"></iframe>\r\n </div>\r\n </div>\r\n </li>\r\n <li v-if=\"ship.publicAreasUrl\" id=\"tc-public-areas\" class=\"d-none d-md-block\">\r\n <button class=\"tab-nav\" @click=\"showTab('public-areas')\">Public Areas</button>\r\n <div class=\"-container\">\r\n <div class=\"alsek-wrapper\">\r\n <iframe :src=\"ship.publicAreasUrl\" width=\"100%\" frameborder=\"0\" title=\"Public Areas\"></iframe>\r\n </div>\r\n </div>\r\n </li>\r\n <li v-if=\"ship.reviewsCount > 0\" id=\"tc-reviews\">\r\n <button class=\"tab-nav\" @click=\"showTab('reviews')\">Reviews & Recommendations</button>\r\n <div class=\"-container\">\r\n <h4 class=\"tab-title\">Reviews & Recommendations</h4>\r\n <product-reviews-component :company-id=\"ship.id\" :product-type=\"ProductType.SHIPS\" :reviews-data=\"reviewsData\"></product-reviews-component>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n <LogoSplash v-else />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import ProductReviewsComponent from \"components/products/details/product-reviews.vue\";\r\n import ShipFeaturesComponent from \"components/products/details/ship-features.vue\";\r\n import ProductCardsComponent from \"components/products/product-cards.vue\";\r\n import ImageGalleryComponent from \"components/shared/image-gallery.vue\";\r\n import LogoSplash from \"components/shared/logo-splash.vue\";\r\n import { DotCMSBrandPageResponse } from \"interfaces/responses/dotcms-responses\";\r\n import { ShipDetailsResponse } from \"interfaces/responses/product-detail-responses\";\r\n import { ProductCards, ProductCardSearchResult } from \"interfaces/card\";\r\n import { ProductQuery } from \"interfaces/cms\";\r\n import { ShipDetail } from \"interfaces/cruise\";\r\n import { ProductType } from \"interfaces/enums\";\r\n import { GalleryItem } from \"interfaces/image\";\r\n import { getCmsContent } from \"services/api/cms\";\r\n import { getShipDetails, getSupplierDetails } from \"services/api/products\";\r\n import { isNetworkUser } from \"services/auth/user-info\";\r\n import { baseImageUrl } from \"services/cms/cms\";\r\n import { sanitizeUserGeneratedContent } from \"services/helpers/html\";\r\n import { hydrateImageGallery } from \"services/helpers/images\";\r\n import { toastError } from \"services/helpers/toasts\";\r\n import { isEmbeddedMode } from \"services/layout/environment\";\r\n import { getProductCards, getViewAllLabel } from \"services/product-cards\";\r\n import { enableHearts } from \"services/wanderlist\";\r\n import { cobrandLink, getPlural, isCobranded, slugify } from \"virtuoso-shared-web-ui\";\r\n import { nextTick, ref, useTemplateRef } from \"vue\";\r\n\r\n const props = defineProps({\r\n shipId: {\r\n type: Number,\r\n default: undefined\r\n }\r\n });\r\n\r\n const advisorCatalogLink = cobrandLink(\"/travel/advisors\");\r\n const brandUrl = ref(\"\");\r\n const findAnAdvisorLabel = (isCobranded()) ? \"Contact Travel Advisor\" : \"Find a Travel Advisor\";\r\n const heartableUrl = ref(\"\");\r\n const isReady = ref(false);\r\n const logoUrl = ref(\"\");\r\n const productCardCollection = ref<ProductCards>({} as ProductCards);\r\n const reviewsData = ref({});\r\n const ship = ref<ShipDetail>({} as ShipDetail);\r\n const shipPageRef = useTemplateRef(\"ship-page\");\r\n const showShipInfo = ref(false);\r\n const showTabBlock = ref(false);\r\n\r\n function defaultFirstTabName(): string {\r\n // Which bottom tab should be selected by default, after the product query returns\r\n if (productCardCollection.value.productCards.length) {\r\n return \"products\"; \r\n }\r\n if (showShipInfo.value) {\r\n return \"ship-info\";\r\n }\r\n if (ship.value.deckPlansUrl) {\r\n return \"deck-plans\";\r\n }\r\n if (ship.value.stateroomsUrl) {\r\n return \"staterooms\";\r\n }\r\n if (ship.value.publicAreasUrl) {\r\n return \"public-areas\";\r\n }\r\n if (ship.value.reviewsCount > 0) {\r\n return \"reviews\";\r\n }\r\n return \"\";\r\n }\r\n function loadShip(): void {\r\n getShipDetails(props.shipId).then((resultShip: ShipDetailsResponse) => {\r\n if (resultShip && resultShip.shipName && resultShip.supplierName) {\r\n const thisShip: ShipDetail = {\r\n crewCount: resultShip.crewCount || null,\r\n deckCount: resultShip.deckCount || null,\r\n deckPlansUrl: resultShip.deckPlanUrl || \"\",\r\n description: resultShip.shipDescription || \"\",\r\n featuredImageCaption: \"\", // Populated below\r\n featuredImageUrl: \"\", // Populated below\r\n galleryImages: [], // Populated below\r\n id: resultShip.masterEntityId,\r\n passengerCount: resultShip.passengerCount || null,\r\n publicAreasUrl: resultShip.publicAreaUrl || \"\",\r\n reviewsCount: resultShip.totalActiveReviews || 0,\r\n reviewsPercent: resultShip.totalRecommendedPercent || 0,\r\n shipFeatures: resultShip.shipFeatures || [],\r\n shipName: resultShip.shipName,\r\n stateroomsUrl: resultShip.stateRoomUrl || \"\",\r\n supplierId: resultShip.supplierMasterEntityId,\r\n supplierName: resultShip.supplierName,\r\n tonnage: resultShip.tonnage || null,\r\n whatIsIncluded: \"\",\r\n whatIsNotIncluded: \"\",\r\n yearLaunched: resultShip.yearLaunched || null,\r\n yearRefurbished: resultShip.yearRefurbished || null\r\n };\r\n\r\n // Logo lookup from dotCMS, fallback to the supplier API\r\n getCmsContent<DotCMSBrandPageResponse[]>({\r\n contentTypes: [\"BrandPage\"],\r\n depth: 1,\r\n limit: 1,\r\n queryClauses: [\r\n `+(BrandPage.supplierId:${thisShip.supplierId})`,\r\n `+(BrandPage.supplierType:cruise)`\r\n ]\r\n }).then((cmsJSON) => { // There isn't necessarily a dotCMS page for every supplier\r\n if (cmsJSON?.length) {\r\n logoUrl.value = (cmsJSON[0].logo) ? baseImageUrl + cmsJSON[0].logo : \"\";\r\n }\r\n }, () => {\r\n // Reject is fine, fall through to the next then()\r\n }).then(() => {\r\n if (logoUrl.value === \"\") {\r\n getSupplierDetails(thisShip.supplierId).then((supplierJSON) => {\r\n if (supplierJSON && supplierJSON.name) {\r\n logoUrl.value = supplierJSON.logoImageUrl;\r\n }\r\n }, () => {\r\n // Well, I guess they don't get a logo. Shouldn't happen.\r\n });\r\n }\r\n });\r\n\r\n\r\n // Images -- first image is the featured image\r\n let galleryImages: GalleryItem[] = [];\r\n if (resultShip.imageLibraryItems && resultShip.imageLibraryItems.length) {\r\n galleryImages = hydrateImageGallery(resultShip.imageLibraryItems);\r\n thisShip.featuredImageUrl = galleryImages[0].image;\r\n thisShip.featuredImageCaption = galleryImages[0].description;\r\n }\r\n thisShip.galleryImages = galleryImages;\r\n\r\n\r\n // What's (Not) Included\r\n if (resultShip.whatIsIncludedItems) {\r\n if (resultShip.whatIsIncludedItems?.length > 1) {\r\n let theItems = \"\";\r\n resultShip.whatIsIncludedItems.forEach((item: string) => {\r\n theItems += `<li>${item}</li>`;\r\n });\r\n thisShip.whatIsIncluded = `<ul>${theItems}</ul>`;\r\n } else {\r\n thisShip.whatIsIncluded = sanitizeUserGeneratedContent(resultShip.whatIsIncludedItems[0]);\r\n }\r\n }\r\n\r\n if (resultShip.whatIsNotIncludedItems) {\r\n if (resultShip.whatIsNotIncludedItems?.length > 1) {\r\n let theItems = \"\";\r\n resultShip.whatIsNotIncludedItems.forEach((item: string) => {\r\n theItems += `<li>${item}</li>`;\r\n });\r\n thisShip.whatIsNotIncluded = `<ul>${theItems}</ul>`;\r\n } else {\r\n thisShip.whatIsNotIncluded = sanitizeUserGeneratedContent(resultShip.whatIsNotIncludedItems[0]);\r\n }\r\n }\r\n\r\n\r\n // Sailings\r\n const sailingCards: ProductCards = {\r\n productCards: [],\r\n productType: ProductType.CRUISES,\r\n viewAllLink: cobrandLink(`/travel/luxury-cruises/search#cruiseLines=${encodeURIComponent(resultShip.supplierName)}&ships=${encodeURIComponent(resultShip.shipName)}`),\r\n viewAllText: \"See More Sailings\"\r\n };\r\n\r\n const productQuery: ProductQuery = {\r\n rowsLimit: 6,\r\n selectedFacets: [\r\n {\r\n category: \"all_cruise_ships\",\r\n name: resultShip.shipName,\r\n selected: true\r\n }\r\n ]\r\n };\r\n\r\n getProductCards(ProductType.CRUISES, productQuery).then((prods: ProductCardSearchResult) => {\r\n sailingCards.productCards = prods.productCards;\r\n sailingCards.viewAllText = getViewAllLabel(ProductType.SHIPS, prods.totalResults, productQuery.rowsLimit);\r\n productCardCollection.value = sailingCards;\r\n showFirstTab(); // We delay opening the first tab until we know if we have sailings or not\r\n });\r\n\r\n\r\n ship.value = thisShip;\r\n heartableUrl.value = `https://www.virtuoso.com/travel/luxury-cruises/ships/${props.shipId}/${slugify(thisShip.shipName)}`;\r\n brandUrl.value = cobrandLink(`/travel/luxury-cruises/cruise-lines/${thisShip.supplierId}/${slugify(thisShip.supplierName)}`);\r\n showShipInfo.value = !!(thisShip.deckCount || thisShip.tonnage || thisShip.yearLaunched || thisShip.yearRefurbished);\r\n\r\n if (thisShip.reviewsCount > 0) {\r\n // passed to reviews component\r\n reviewsData.value = {\r\n percent: `<b>${thisShip.reviewsPercent}% Recommended</b>`,\r\n count: `<b>${thisShip.reviewsCount} Review${getPlural(thisShip.reviewsCount)}</b>`\r\n };\r\n }\r\n\r\n isReady.value = true;\r\n\r\n nextTick(() => {\r\n enableHearts(shipPageRef.value);\r\n });\r\n\r\n } else {\r\n redirectOnError();\r\n }\r\n }, () => redirectOnError());\r\n }\r\n\r\n function redirectOnError(): void {\r\n toastError(\"Error retrieving data\");\r\n setTimeout(() => { location.href = cobrandLink(`/travel/luxury-cruises`); }, 3000);\r\n }\r\n\r\n function showFirstTab(): void {\r\n const firstTabName = defaultFirstTabName();\r\n if (firstTabName) {\r\n showTabBlock.value = true;\r\n nextTick(() => {\r\n showTab(firstTabName, true);\r\n });\r\n }\r\n }\r\n\r\n function showTab(tabName: string, preventJump = false): void {\r\n document.querySelector(\".tab-nav-container .-active\")?.classList.remove(\"-active\");\r\n document.querySelector(\".tab-content .-active\")?.classList.remove(\"-active\");\r\n document.getElementById(`tab-${tabName}`).classList.add(\"-active\");\r\n document.getElementById(`tc-${tabName}`).classList.add(\"-active\");\r\n\r\n if (!preventJump) {\r\n document.getElementById(`tc-${tabName}`)?.scrollIntoView();\r\n }\r\n }\r\n\r\n loadShip();\r\n</script>\r\n","import ShipPageComponent from \"components/products/details/ship-page.vue\";\r\nimport { cobrandLink } from \"virtuoso-shared-web-ui\";\r\nimport { createApp } from \"vue\";\r\nimport { mountApp } from \"vue-app\";\r\n\r\n\r\nif (window.VIRTUOSO.shipId) {\r\n const app = createApp(ShipPageComponent,\r\n {\r\n shipId: window.VIRTUOSO.shipId\r\n });\r\n mountApp(app, \"page-app\");\r\n\r\n} else {\r\n console.error(\"Ship ID not provided\");\r\n location.href = cobrandLink(`/travel/luxury-cruises/`);\r\n}\r\n"],"names":["shipFeatureIconMap","props","__props","advisorCatalogLink","cobrandLink","brandUrl","ref","findAnAdvisorLabel","isCobranded","heartableUrl","isReady","logoUrl","productCardCollection","reviewsData","ship","shipPageRef","useTemplateRef","showShipInfo","showTabBlock","defaultFirstTabName","loadShip","getShipDetails","resultShip","thisShip","getCmsContent","cmsJSON","baseImageUrl","getSupplierDetails","supplierJSON","galleryImages","hydrateImageGallery","_a","theItems","item","sanitizeUserGeneratedContent","_b","sailingCards","ProductType","productQuery","getProductCards","prods","getViewAllLabel","showFirstTab","slugify","getPlural","nextTick","enableHearts","redirectOnError","toastError","firstTabName","showTab","tabName","preventJump","_c","app","createApp","ShipPageComponent","mountApp"],"mappings":"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"}