{"version":3,"mappings":"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","names":["XDEFAULT_LANG","RobotsIndexEnum","index_follow","index_nofollow","noindex_follow","noindex_nofollow","defaultMetadata","title","images","description","keywords","pageType","META_TAG_ROBOTS_ENABLED","InjectionToken","TITLE_SUFFIX","SITE_NAME","MetadataService","constructor","metaTagService","titleService","hostUrl","metaTagRobotsEnabled","langCode","router","document","rendererFactory","languagesService","breadcrumbsService","routesService","cloudinaryService","platform","analyticsService","breadcrumbs","alternateLangs","signal","renderer","createRenderer","id","encapsulation","ViewEncapsulation","None","styles","data","siteUrl","bcsSubscription","breadcrumbs$","subscribe","b","appendMetadata","metadata","canonicalUrl","index","entity","carousel","pageMetadata","__spreadValues","setTitle","currentLang","getCurrentLangCode","currentUrl","url","tags","generateMetaDefinitions","getAbsoluteUrl","path","lang","push","name","content","isBrowser","trackPageView","tag","updateTag","addTags","appendCanonicalURL","currentAbsoluteUrl","appendStructuredData","indexOf","hrefLangs","querySelectorAll","forEach","link","head","removeChild","generateHrefLangs","set","hrefLang","appendHrefLang","length","xDefault","find","al","getLanguages","map","l","code","metas","property","newsTitle","image","getSocialImageUrl","publishDate","authorUrl","selector","removeTag","company","generateExpWebSiteSD","generateExpWebPageSD","generateBreadcrumbSD","entityData","__typename","generateOrganizationSD","generateNewsSD","generateProductSD","generatePortalEventSD","generateCarouselSD","renderJsonLd","sameAs","logo","inLanguage","contentUrl","width","height","caption","slogan","$localize","obj","isPartOf","breadcrumb","primaryImageOfPage","items","i","entries","listItem","position","label","item","itemListElement","companyUrl","getCompanyUrl","fullName","webSite","socials","s","getSmallPictureUrl","address","generateAddressSD","addresses","generateAuthorSD","user","profile","picture","getUserUrl","streetAddress","street","addressLocality","city","postalCode","addressRegion","regionCode","addressCountry","countryCode","news","author","publisher","mainEntityOfPage","headline","datePublished","dateModified","updatedAt","reduce","accumulator","currentValue","product","shortDescription","brand","aggregateRating","ratingValue","rating","toString","ratingCount","category","categories","portalEvent","eventData","__spreadProps","summary","startDate","endDate","eventStatus","eventAttendanceMode","eventType","location","locationName","organizer","performer","offerUrl","offers","price","offerPrice","priceCurrency","Date","availability","Object","assign","script","getElementById","createElement","setAttribute","appendChild","scriptText","JSON","stringify","setProperty","e","console","error","absoluteUrl","querySelector","pathLocale","imageUrl","getImageUrl","ResizeModeEnum","fill","scale","appendRSSLink","isGeneralNews","ngOnDestroy","unsubscribe","d","ɵfac","r","ɵɵinject","Meta","Title","HOST_URL","LOCALE_ID","Router","DOCUMENT","RendererFactory2","LanguagesService","BreadcrumbsService","RoutesService","CloudinaryService","Platform","AnalyticsService","ɵprov","L","token","factory","_MetadataService","H","a","D","De","c"],"ignoreList":[],"sources":["src/app/shared/services/meta-data-service/meta-data.commons.ts","src/app/shared/tokens/meta-tag-robots.enabled.ts","src/app/shared/services/meta-data-service/meta-data.service.ts"],"sourcesContent":["import { ICompany } from '@collections/companies/interfaces/company.interface';\r\nimport { AppPageType } from '../google-tag-manager/analytics/data-layer-custom-dimensions';\r\n\r\nexport const XDEFAULT_LANG = 'en';\r\n\r\nexport interface PageMetadata {\r\n title: string;\r\n images: string[];\r\n description: string;\r\n keywords: string[];\r\n pageType: AppPageType;\r\n authorId?: string;\r\n authorUrl?: string;\r\n publishDate?: string;\r\n categories?: string[];\r\n company?: ICompany;\r\n url?: string;\r\n newsTitle?:string;\r\n}\r\n\r\n\r\nexport enum RobotsIndexEnum {\r\n 'index_follow' = 'index, follow',\r\n 'index_nofollow' = 'index, nofollow',\r\n 'noindex_follow' = 'noindex, follow',\r\n 'noindex_nofollow' = 'noindex, nofollow'\r\n}\r\n\r\nexport const defaultMetadata: PageMetadata = {\r\n title: 'default title',\r\n images: [],\r\n description: 'App description',\r\n keywords: [],\r\n pageType: 'website',\r\n};\r\n","import {InjectionToken} from '@angular/core';\r\n\r\nexport const META_TAG_ROBOTS_ENABLED = new InjectionToken('MetaTagRobotsEnabled');\r\n","import { Subscription } from 'rxjs';\r\nimport { ICompany } from '@collections/companies/interfaces/company.interface';\r\nimport { IUser } from '@collections/users/interfaces/user.interface';\r\nimport { IBreadcrumb } from '../breadcrumbs/breadcrumbs.service';\r\nimport { IProduct } from '@collections/products/interfaces/product.interface';\r\nimport { INews } from '@collections/news/interfaces/news.interface';\r\nimport { Inject, Injectable, RendererFactory2, ViewEncapsulation, Renderer2, LOCALE_ID, OnDestroy, Optional, signal } from '@angular/core';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { Meta, MetaDefinition, Title } from '@angular/platform-browser';\r\nimport { Router, NavigationEnd } from '@angular/router';\r\nimport { HOST_URL } from '@shared/tokens/host-url';\r\nimport { META_TAG_ROBOTS_ENABLED } from '@shared/tokens/meta-tag-robots.enabled';\r\nimport { ellipsis } from '@shared/utilities/text';\r\nimport { LanguagesService } from '@shared/services/languages/languages.service';\r\nimport { IPathLocale } from '@collections/common/interfaces/path-locale.interface';\r\nimport { defaultMetadata, PageMetadata, RobotsIndexEnum, XDEFAULT_LANG } from './meta-data.commons';\r\nimport { BreadcrumbsService } from '../breadcrumbs/breadcrumbs.service';\r\nimport { RoutesService } from '../routes/route.service';\r\nimport { IAddress } from '@collections/common/interfaces';\r\nimport { IPortalEvent } from '@collections/portal-events/interfaces/portal-events.interface';\r\nimport { CloudinaryService, ResizeModeEnum } from '@shared/services/cloudinary/cloudinary.service';\r\nimport { Platform } from '@angular/cdk/platform';\r\nimport { AnalyticsService } from '@shared/services/google-tag-manager/analytics/analytics.service';\r\n\r\nexport const TITLE_SUFFIX = ' | expometals';\r\nexport const SITE_NAME = 'expometals.net';\r\n@Injectable()\r\nexport class MetadataService implements OnDestroy {\r\n private renderer: Renderer2;\r\n private breadcrumbs: IBreadcrumb[] = [];\r\n private siteUrl: string;\r\n private bcsSubscription: Subscription;\r\n alternateLangs = signal([]);\r\n\r\n constructor(\r\n private metaTagService: Meta,\r\n private titleService: Title,\r\n @Inject(HOST_URL) private hostUrl: string,\r\n @Inject(META_TAG_ROBOTS_ENABLED) private metaTagRobotsEnabled: RobotsIndexEnum,\r\n @Inject(LOCALE_ID) private langCode: string,\r\n private router: Router,\r\n @Inject(DOCUMENT) private document: Document,\r\n private rendererFactory: RendererFactory2,\r\n private languagesService: LanguagesService,\r\n private breadcrumbsService: BreadcrumbsService,\r\n private routesService: RoutesService,\r\n private cloudinaryService: CloudinaryService,\r\n private platform: Platform,\r\n @Optional() private analyticsService: AnalyticsService\r\n ) {\r\n\r\n this.renderer = this.rendererFactory.createRenderer(this.document, {\r\n id: '-1',\r\n encapsulation: ViewEncapsulation.None,\r\n styles: [],\r\n data: {}\r\n });\r\n\r\n this.siteUrl = `${this.hostUrl}/${this.langCode}`;\r\n this.bcsSubscription = this.breadcrumbsService.breadcrumbs$.subscribe(b => this.breadcrumbs = b);\r\n }\r\n\r\n public appendMetadata(\r\n metadata: Partial,\r\n canonicalUrl?: IPathLocale,\r\n alternateLangs?: IPathLocale[] | 'auto',\r\n index: RobotsIndexEnum = RobotsIndexEnum.index_follow,\r\n entity?: any,\r\n carousel?: string[]\r\n ): void {\r\n const pageMetadata: PageMetadata = { ...defaultMetadata, ...metadata };\r\n this.titleService.setTitle(pageMetadata.title + TITLE_SUFFIX);\r\n\r\n const currentLang = this.languagesService.getCurrentLangCode();\r\n\r\n pageMetadata.description = pageMetadata.description ? pageMetadata.description : '';\r\n const currentUrl = this.router.url;\r\n const metaDefinitions: MetaDefinition[] = this.generateMetaDefinitions(pageMetadata, this.routesService.getAbsoluteUrl(currentUrl));\r\n\r\n const tags = metaDefinitions;\r\n\r\n if (!canonicalUrl || (canonicalUrl.path === currentUrl && canonicalUrl.lang === currentLang)) {\r\n canonicalUrl = { lang: currentLang, path: currentUrl };\r\n\r\n // se abilitato questo token, consente di impostare il meta robots. (di default impostato su noindex-nofollow)\r\n if(this.metaTagRobotsEnabled) {\r\n tags.push({ name: 'robots', content: index });\r\n }\r\n\r\n }\r\n\r\n if (this.platform.isBrowser) {\r\n this.analyticsService.trackPageView(pageMetadata);\r\n for (let tag of tags) {\r\n this.metaTagService.updateTag(tag);\r\n }\r\n } else {\r\n this.metaTagService.addTags(tags);\r\n } \r\n\r\n this.appendCanonicalURL(canonicalUrl);\r\n const currentAbsoluteUrl = this.routesService.getAbsoluteUrl(currentUrl, this.langCode);\r\n this.appendStructuredData(currentAbsoluteUrl, metadata, entity, carousel);\r\n\r\n // per le alternative lang utilizzo il setup che include tutte le url dei linguaggi disponibili,\r\n // (compreso il self-referencing url) e un x-default aggiuntivo con lo stesso url dell'inglese.\r\n // Non credo faccia differenza rispetto ad omettere l'hreflang per l'inglese, ma nel dubbio...\r\n\r\n // However it is also possible (and valid) to define a page for a specific locale/language AND also as the x-default hreflang -\r\n // in this case it would both serve as the correct page for the targeted location,\r\n // but also as the fallback when no other pages are suitable.\r\n // https://sitebulb.com/hints/international/hreflang-annotation-also-x-default/\r\n if (canonicalUrl.path === currentUrl) {\r\n // se url canonico punta ad un diverso url ometto gli hreflang\r\n // If you are using a canonical tag solution on your website,\r\n // make sure that URLs that have a canonical tag pointing to another URL do not receive hreflang annotations.\r\n // hreflang annotations are okay for URLs that point to themselves via canonical tag and for URLs that do not have canonical tags.\r\n // https://www.searchviu.com/en/hreflang-canonical/#:~:text=If%20you%20are%20using%20a,do%20not%20have%20canonical%20tags.\r\n\r\n if (currentUrl.indexOf('?') > 0) { // esclude hreflang for urls with parameteres\r\n return;\r\n }\r\n let hrefLangs: IPathLocale[] = [];\r\n if (this.platform.isBrowser) {\r\n this.document.querySelectorAll(`link[rel=\"alternate\"]`).forEach( link => {\r\n this.document.head.removeChild(link); \r\n }); \r\n }\r\n if (alternateLangs === 'auto') {\r\n hrefLangs = this.generateHrefLangs();\r\n } else {\r\n hrefLangs = alternateLangs || [];\r\n }\r\n this.alternateLangs.set(hrefLangs);\r\n for (const hrefLang of hrefLangs) {\r\n this.appendHrefLang(hrefLang);\r\n }\r\n\r\n if (hrefLangs.length > 0) {\r\n let xDefault: IPathLocale = hrefLangs.find(al => al.lang === XDEFAULT_LANG);\r\n if (xDefault) {\r\n this.appendHrefLang(xDefault, true);\r\n } else {\r\n // per quelli che non hanno l'inglese, andrebbe aggiunta una lingua di default\r\n // in mancanza, prendo la prima utile prediligendo l'italiano.\r\n xDefault = hrefLangs.find(al => al.lang === 'it') || hrefLangs[0];\r\n this.appendHrefLang(xDefault, true);\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n generateHrefLangs(): IPathLocale[] {\r\n return this.languagesService.getLanguages().map(l => {\r\n return { lang: l.code, path: this.router.url };\r\n });\r\n }\r\n\r\n private generateMetaDefinitions(metadata: PageMetadata, url: string): MetaDefinition[] {\r\n // mancano properties: fb:app_id, fb:admins, twitter:app:id:iphone, twitter:app:id:ipad\r\n const metas = [\r\n { name: 'title', content: metadata.title + TITLE_SUFFIX },\r\n { property: 'og:title', content: metadata.newsTitle ? metadata.newsTitle + TITLE_SUFFIX : metadata.title + TITLE_SUFFIX },\r\n { name: 'description', content: metadata.description },\r\n { property: 'og:description', content: metadata.description },\r\n { property: 'og:url', content: url },\r\n { property: 'og:type', content: metadata.pageType },\r\n { property: 'og:site_name', content: SITE_NAME },\r\n { property: 'twitter:site', content: '@Expometals' },\r\n { property: 'twitter:title', content: metadata.newsTitle ? metadata.newsTitle + TITLE_SUFFIX : metadata.title + TITLE_SUFFIX},\r\n { property: 'twitter:url', content: url },\r\n { property: 'twitter:domain', content: 'Expometals.net' },\r\n { property: 'twitter:creator', content: '@Expometals' },\r\n ];\r\n\r\n if (metadata.images) {\r\n for (const image of metadata.images) {\r\n metas.push({ property: 'twitter:card', content: 'summary_large_image' })\r\n metas.push({ property: 'twitter:image', content: this.getSocialImageUrl(image) });\r\n metas.push({ property: 'og:image', content: this.getSocialImageUrl(image) });\r\n metas.push({property: 'og:image:width', content: '1200'});\r\n metas.push({property: 'og:image:height', content: '630'});\r\n }\r\n }\r\n\r\n if (metadata.pageType === 'news') {\r\n metas.push(\r\n { property: 'article:publisher', content: 'https://www.facebook.com/expometals.net/' },\r\n { property: 'article:published_time', content: metadata.publishDate }\r\n );\r\n if (metadata.authorUrl) {\r\n metas.push({ property: 'article:author', content: metadata.authorUrl });\r\n }\r\n } else if (this.platform.isBrowser) { // avoid duplicates on browser side\r\n for (let selector of ['article:publisher', 'article:published_time', 'article:author']) {\r\n this.metaTagService.removeTag(`property=\"${selector}\"`); \r\n } \r\n }\r\n\r\n return metas;\r\n }\r\n\r\n // https://moz.com/blog/writing-structured-data-guide\r\n // TODO:\r\n // Verificare dati e elogo di Organization Expometals\r\n // il dato Author delle news deve contenere l'url al profilo /team/user-name se è un admin, o alla pagina del profilo se un cliente. Da valutare.\r\n // Impostare @type per gli Eventi portale\r\n // Valutare padiglioni / Categorie ecc.\r\n private appendStructuredData(currentAbsoluteUrl: string, {title, description, images, company}: Partial, entity?: any, carousel?: string[]): void {\r\n const siteUrl = this.siteUrl;\r\n const data = {\r\n '@context': 'http://schema.org',\r\n '@graph': []\r\n };\r\n\r\n if (!company) {\r\n data['@graph'].push(this.generateExpWebSiteSD(siteUrl));\r\n }\r\n\r\n data['@graph'].push(this.generateExpWebPageSD(siteUrl, currentAbsoluteUrl, title, description, images));\r\n\r\n if (this.breadcrumbs?.length > 0) {\r\n data['@graph'].push(this.generateBreadcrumbSD(currentAbsoluteUrl));\r\n }\r\n\r\n if (entity) {\r\n let entityData;\r\n switch (entity.__typename) {\r\n case 'Company':\r\n this.generateOrganizationSD(company, currentAbsoluteUrl);\r\n break;\r\n case 'News':\r\n entityData = this.generateNewsSD(entity, currentAbsoluteUrl, company);\r\n break;\r\n case 'Product':\r\n entityData = this.generateProductSD(entity, currentAbsoluteUrl, company);\r\n break;\r\n case 'PortalEvent':\r\n entityData = this.generatePortalEventSD(entity, currentAbsoluteUrl);\r\n break;\r\n }\r\n\r\n if (entityData) {\r\n data['@graph'].push(entityData);\r\n }\r\n\r\n if (carousel) {\r\n data['@graph'].push(this.generateCarouselSD(carousel, currentAbsoluteUrl));\r\n }\r\n }\r\n this.renderJsonLd(data);\r\n }\r\n\r\n private generateExpWebSiteSD(siteUrl: string): any {\r\n return {\r\n '@type': 'Organization',\r\n '@id': `${siteUrl}/#organization`,\r\n name: SITE_NAME,\r\n url: siteUrl,\r\n sameAs: [\r\n 'https://www.facebook.com/expometals.net',\r\n 'https://www.linkedin.com/company/expometals-net',\r\n 'https://twitter.com/expometals',\r\n 'https://www.youtube.com/channel/UCYhDx5mckKj-FUrhtgPEx6g'\r\n ],\r\n logo: {\r\n '@type': 'ImageObject',\r\n '@id': `${siteUrl}/#logo`,\r\n inLanguage: this.langCode,\r\n url: 'https://res.cloudinary.com/expometals/image/upload/v1649826786/assets/exp-logo.png',\r\n contentUrl: 'https://res.cloudinary.com/expometals/image/upload/v1649826786/assets/exp-logo.png',\r\n width: 500,\r\n height: 500,\r\n caption: SITE_NAME\r\n },\r\n image: {\r\n '@id': `${siteUrl}/#logo`,\r\n },\r\n // founder: {\r\n // '@type': 'Person',\r\n // name: 'Dell\\'Oro Davide',\r\n // url: 'http://localhost:4200/team/davide-delloro',\r\n // sameAs: 'https://www.linkedin.com/in/davide-dell-oro-a0757629/'\r\n // },\r\n // foundingDate: '2010-05-01',\r\n // numberOfEmployees: 5,\r\n slogan: $localize`The International Online Fair`,\r\n description: $localize`expometals.net is the international digital marketing platform for the metalworking field, namely wire, springs, fasteners, tube, sheet metal, and related industries. From raw material to finished products, ferrous and non-ferrous metals.`,\r\n // legalName: 'Dell\\'Oro di Dell\\'Oro Davide'\r\n };\r\n }\r\n\r\n private generateExpWebPageSD(siteUrl: string, currentAbsoluteUrl: string, title: string, description: string, images: string[]): any {\r\n const obj = {\r\n '@type': 'WebPage',\r\n '@id': `${currentAbsoluteUrl}/#webpage`,\r\n url: currentAbsoluteUrl,\r\n name: title,\r\n description: description,\r\n inLanguage: this.langCode,\r\n isPartOf: {\r\n '@id': `${siteUrl}/#website`,\r\n },\r\n breadcrumb: {\r\n '@id': `${currentAbsoluteUrl}/#breadcrumblist`,\r\n }\r\n };\r\n if(images.length > 0 && images[0]) {\r\n obj['image'] = {\r\n '@type': 'ImageObject',\r\n '@id': `${currentAbsoluteUrl}/#primaryimage`,\r\n url: this.getSocialImageUrl(images[0]),\r\n };\r\n obj['primaryImageOfPage'] = {\r\n '@id': `${currentAbsoluteUrl}/#primaryimage`,\r\n };\r\n }\r\n return obj;\r\n }\r\n private generateBreadcrumbSD(currentAbsoluteUrl: string): any {\r\n const items = [];\r\n for (const [i, breadcrumb] of this.breadcrumbs.entries()) {\r\n const listItem = {\r\n '@type': 'ListItem',\r\n 'position': i + 1,\r\n name: breadcrumb.label,\r\n };\r\n // Aggiungi l'url solo se non è l'ultimo elemento\r\n if (i < this.breadcrumbs.length - 1) {\r\n listItem['item'] = this.routesService.getAbsoluteUrl(breadcrumb.url, this.langCode);\r\n }\r\n items.push(listItem);\r\n }\r\n return {\r\n '@type': 'BreadcrumbList',\r\n '@id': `${currentAbsoluteUrl}/#breadcrumblist`,\r\n itemListElement: items\r\n };\r\n }\r\n\r\n private generateOrganizationSD(company: ICompany, currentAbsoluteUrl: string): any {\r\n const companyUrl = this.routesService.getCompanyUrl(company, null, true);\r\n return {\r\n '@type': 'Organization',\r\n name: company.fullName,\r\n url: companyUrl,\r\n sameAs: [\r\n company.webSite,\r\n ...(company.socials?.map(s => s.url) || [])\r\n ],\r\n logo: {\r\n '@type': 'ImageObject',\r\n '@id': `${companyUrl}/#logo`,\r\n inLanguage: this.langCode,\r\n url: this.getSmallPictureUrl(company.logo),\r\n width: 150,\r\n height: 150,\r\n caption: company.fullName\r\n },\r\n address: this.generateAddressSD(company.addresses[0]),\r\n image: {\r\n '@id': `${companyUrl}/#logo`,\r\n }\r\n };\r\n }\r\n\r\n private generateAuthorSD(user: IUser, currentAbsoluteUrl: string): any {\r\n return {\r\n '@type': 'Person',\r\n '@id': `${currentAbsoluteUrl}#author`,\r\n name: user.profile.fullName,\r\n image: this.getSmallPictureUrl(user.profile.picture),\r\n url: this.routesService.getUserUrl(user, true)\r\n };\r\n }\r\n\r\n private generateAddressSD(address: IAddress): any {\r\n return {\r\n '@type': 'PostalAddress',\r\n streetAddress: address.street,\r\n addressLocality: address.city,\r\n postalCode: address.postalCode,\r\n addressRegion: address.regionCode,\r\n addressCountry: address.countryCode\r\n };\r\n }\r\n\r\n generateNewsSD(news: INews, currentAbsoluteUrl: string, company?: ICompany): any {\r\n // const companyUrl = this.getAbsoluteUrl(this.routesService.getCompanyUrl(company));\r\n return {\r\n '@type': [\r\n 'Article',\r\n 'NewsArticle'\r\n ],\r\n isPartOf: {\r\n '@id': `${currentAbsoluteUrl}/#webpage`\r\n },\r\n author: this.generateAuthorSD(news.author, currentAbsoluteUrl),\r\n publisher: company ?\r\n this.generateOrganizationSD(company, currentAbsoluteUrl) :\r\n {\r\n '@id': `${this.siteUrl}#organization`\r\n },\r\n mainEntityOfPage: {\r\n '@id': `${currentAbsoluteUrl}/#webpage`\r\n },\r\n headline: news.title,\r\n image: {\r\n '@id': `${currentAbsoluteUrl}/#primaryimage`\r\n },\r\n datePublished: news.publishDate,\r\n dateModified: news.updatedAt ? news.updatedAt : news.publishDate,\r\n ...(news.tags && {keywords: news.tags && news.tags.length > 0 ? news.tags.reduce(\r\n (accumulator, currentValue) => accumulator ? accumulator + ', ' + currentValue.tag : currentValue.tag,\r\n '',\r\n ) : ''})/* ,\r\n ...(news.categories && {category: news.categories && news.categories.length > 0 ? news.categories[0].name : '' }) dato non presente nello schema di News Article di schema.org*/\r\n };\r\n }\r\n\r\n generateProductSD(product: IProduct, currentAbsoluteUrl: string, company?: ICompany): any {\r\n return {\r\n '@type': 'Product',\r\n // isPartOf: {\r\n // '@id': `${currentAbsoluteUrl}/#webpage`\r\n // },\r\n name: product.name,\r\n description: product.shortDescription,\r\n image: this.getSocialImageUrl(product.images[0]),\r\n brand: this.generateOrganizationSD(company, currentAbsoluteUrl),\r\n aggregateRating: {\r\n '@type': \"AggregateRating\",\r\n ratingValue: (product.rating ? product.rating: 3).toString(),\r\n ratingCount: (product.ratingCount ? product.ratingCount: 1).toString()\r\n },\r\n mainEntityOfPage: {\r\n '@id': `${currentAbsoluteUrl}/#webpage`\r\n },\r\n category: product.categories && product.categories.length > 0 ? product.categories[0].path : ''\r\n };\r\n }\r\n\r\n generatePortalEventSD(portalEvent: IPortalEvent, currentAbsoluteUrl: string): any {\r\n const eventData: any = {\r\n '@type': 'Event',\r\n/* isPartOf: {\r\n '@id': `${currentAbsoluteUrl}/#webpage`\r\n }, */\r\n name: portalEvent.title,\r\n description: portalEvent.summary,\r\n startDate: portalEvent.startDate,\r\n endDate: portalEvent.endDate,\r\n eventStatus: \"https://schema.org/EventScheduled\",\r\n eventAttendanceMode: portalEvent.eventType == \"webinar\" ? \"https://schema.org/OnlineEventAttendanceMode\" : \"https://schema.org/OfflineEventAttendanceMode\",\r\n ...(portalEvent.address && {\r\n location: {\r\n '@type': 'Place',\r\n address: this.generateAddressSD(portalEvent.address),\r\n }\r\n }),\r\n mainEntityOfPage: {\r\n '@id': `${currentAbsoluteUrl}/#webpage`\r\n },\r\n image: {\r\n '@id': `${currentAbsoluteUrl}/#primaryimage`\r\n },\r\n };\r\n\r\n if (portalEvent.locationName) {\r\n eventData.location.name = portalEvent.locationName\r\n }\r\n\r\n if (portalEvent.organizer) {\r\n eventData.organizer = {\r\n '@type': 'Organization',\r\n name: portalEvent.organizer\r\n };\r\n }\r\n\r\n if (portalEvent.performer) {\r\n eventData.performer = {\r\n '@type': 'Person',\r\n name: portalEvent.performer\r\n };\r\n }\r\n\r\n if (portalEvent.offerUrl) {\r\n eventData.offers = {\r\n '@type': 'Offer',\r\n url: portalEvent.offerUrl,\r\n price: portalEvent.offerPrice,\r\n priceCurrency: 'EUR'\r\n };\r\n if(new Date() < new Date(portalEvent.startDate)){\r\n eventData.offers.availability = \"https://schema.org/InStock\"\r\n }\r\n else{\r\n eventData.offers.availability = \"https://schema.org/SoldOut\"\r\n }\r\n }\r\n\r\n return eventData;\r\n }\r\n\r\n generateCarouselSD(items: string[], currentAbsoluteUrl: string): any {\r\n return {\r\n '@type': 'ItemList',\r\n itemListElement: [\r\n ...items.map((url, index) => Object.assign({}, {\r\n '@type': 'ListItem',\r\n position: (index + 1),\r\n url: `${this.siteUrl}${url}`\r\n }))\r\n ],\r\n isPartOf: {\r\n '@id': `${currentAbsoluteUrl}/#webpage`\r\n },\r\n mainEntityOfPage: {\r\n '@id': `${currentAbsoluteUrl}/#webpage`\r\n },\r\n };\r\n }\r\n\r\n private renderJsonLd(data: any): void {\r\n try {\r\n let script = null;\r\n if (this.platform.isBrowser) {\r\n script = this.document.getElementById('structuredDataScript');\r\n }\r\n \r\n if (!script) {\r\n script = this.renderer.createElement('script');\r\n this.renderer.setAttribute(script, 'id', 'structuredDataScript');\r\n this.renderer.setAttribute(script, 'type', 'application/ld+json');\r\n this.renderer.appendChild(this.document.head, script);\r\n }\r\n\r\n // console.log(data);\r\n const scriptText: string = JSON.stringify(data);\r\n this.renderer.setProperty(script, 'innerHTML', scriptText);\r\n \r\n } catch (e) {\r\n console.error('Error on rendering JsonLD data : ', e);\r\n }\r\n }\r\n\r\n private appendCanonicalURL(url: IPathLocale): void {\r\n try {\r\n const absoluteUrl = this.routesService.getAbsoluteUrl(url.path, url.lang);\r\n let link = null;\r\n if (this.platform.isBrowser) {\r\n link = this.document.querySelector('link[rel=\"canonical\"]');\r\n }\r\n if (!link) {\r\n link = this.renderer.createElement('link');\r\n this.renderer.setAttribute(link, 'rel', 'canonical');\r\n this.renderer.appendChild(this.document.head, link);\r\n }\r\n\r\n this.renderer.setAttribute(link, 'href', absoluteUrl);\r\n\r\n } catch (e) {\r\n console.error('Error within linkService : ', e);\r\n }\r\n }\r\n\r\n private appendHrefLang(pathLocale: IPathLocale, xDefault: boolean = false): void {\r\n try {\r\n if (!pathLocale.path) {\r\n return;\r\n }\r\n const absoluteUrl = this.routesService.getAbsoluteUrl(pathLocale.path, pathLocale.lang);\r\n const link = this.renderer.createElement('link');\r\n this.renderer.setAttribute(link, 'rel', 'alternate');\r\n this.renderer.setAttribute(link, 'hreflang', xDefault ? 'x-default' : pathLocale.lang);\r\n this.renderer.setAttribute(link, 'href', absoluteUrl);\r\n this.renderer.appendChild(this.document.head, link);\r\n } catch (e) {\r\n console.error('Error within linkService : ', e);\r\n }\r\n }\r\n\r\n private getSocialImageUrl(imageUrl: string): string {\r\n return this.cloudinaryService.getImageUrl(imageUrl,1200, 630, ResizeModeEnum.fill, false);\r\n }\r\n\r\n private getSmallPictureUrl(image: string): string {\r\n return this.cloudinaryService.getImageUrl(image, 150, 150, ResizeModeEnum.scale, false);\r\n }\r\n\r\n appendRSSLink(isGeneralNews:boolean, lang: string): void {\r\n try{\r\n const link = this.renderer.createElement('link');\r\n this.renderer.setAttribute(link, 'rel', 'alternate')\r\n this.renderer.setAttribute(link, 'type', 'application/rss+xml')\r\n if(isGeneralNews){\r\n this.renderer.setAttribute(link, 'title', $localize`Expometals.net Market News`)\r\n this.renderer.setAttribute(link, 'href', `${this.hostUrl}/rss/${lang}/news`)\r\n }\r\n else{\r\n this.renderer.setAttribute(link, 'title', $localize`Expometals.net Company News`)\r\n this.renderer.setAttribute(link, 'href', `${this.hostUrl}/rss/${lang}/exhibitors-news`)\r\n }\r\n this.renderer.appendChild(this.document.head, link);\r\n }\r\n catch (e) {\r\n console.error('Error within rss linkService : ', e);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.bcsSubscription.unsubscribe();\r\n }\r\n}\r\n"]}