import { localized, msg } from "@lit/localize"; import { type TemplateResult, css, html, nothing, unsafeCSS } from "lit"; import { customElement, property } from "lit/decorators.js"; import { ifDefined } from "lit/directives/if-defined.js"; import { unsafeHTML } from "lit/directives/unsafe-html.js"; import { formatDate, offerKindHandler, offerKindActionHandler, TemsObjectHandler, } from "@helpers"; import type { TemplateResultOrSymbol } from "@src/tems.d.ts"; import ModalStyle from "@styles/modal/tems-modal.scss?inline"; import * as rdf from "@src/rdf"; import "~icons/ci/check"; import "~icons/material-symbols/close-rounded"; import "~icons/material-symbols/rss-feed-rounded"; import "~icons/mingcute/arrow-right-up-line"; export type TemsModalProps = rdf.ValidM18Object; @customElement("tems-modal") @localized() export class TemsModal extends TemsObjectHandler { static styles = css` ${unsafeCSS(ModalStyle)} `; @property({ attribute: false, type: Object }) object: TemsModalProps["object"] = { "@id": "" }; _renderBoolean(field: boolean): TemplateResultOrSymbol { if (field) { return html``; } return html``; } _renderDivision(type: string, label: string): TemplateResult { return html`
${unsafeHTML(String(label))}
`; } _renderBadge(type?: string, label?: string): TemplateResultOrSymbol { if (!label) return nothing; return html``; } _renderButton( iconLeft?: TemplateResult, size?: string, label?: string, type?: string, iconRight?: TemplateResult, disabled?: boolean ): TemplateResultOrSymbol { if (!label) return nothing; return html``; } _renderIframe(url: string): TemplateResult { return html``; } _renderKindBadgeComponent( object: rdf.DataOffer | undefined = undefined ): TemplateResultOrSymbol { const data_offer = object || this.object; if (!data_offer.offers || data_offer.offers.length === 0) return nothing; return html`
${data_offer.offers.map((offer: rdf.Offer) => this._renderBadge("information", offerKindHandler(offer.kind)) )}
`; } _renderCategoryBadgeComponent(): TemplateResultOrSymbol { const badgeType: string = this.isType(rdf.RDFTYPE_DATAOFFER) ? "default" : "information"; if (!this.object.categories || this.object.categories.length === 0) return nothing; return html`
${this.object.categories.map((category: rdf.NamedResource) => this._renderBadge(badgeType, category.name || "") )}
`; } _renderDescription(): TemplateResult { return this._renderDivision("body-m", this.object.description); } _renderTitleValueDivision( title: string, value: string | undefined ): TemplateResultOrSymbol { if (!value) return nothing; return html`${this._renderDivision("h4", title)} ${this._renderDivision("body-m", value)}`; } _renderLicences(): TemplateResult { return html`
${this.object.licences.length !== 0 ? html`${this._renderDivision("h4", msg("Licences"))} ${this.object.licences.map((licence: rdf.Licence) => { if (!licence.name) return nothing; return html` ${licence.url ? html`${licence.name || msg("See more")} ` : html`${licence.name}`} `; })}` : html`${this._renderDivision("h4", msg("Licences"))} -`}
`; } _renderBgImg(imgSrc: string, className: string) { if (!imgSrc) { return nothing; } return html`
`; } _renderImageSingle(): TemplateResultOrSymbol { if (!this.object.image && !this.object.images) { return nothing; } const images = []; if (this.object.image) { images.push(this.object.image); } if (this.object.images) { images.push(...this.object.images); } return html`
${images.map((image: rdf.Image) => { if (image.iframe && image.url) { return html`${this._renderIframe(image.url)}`; } return html`${ifDefined(image.name)}
`; })} `; } _renderImageArray(): TemplateResultOrSymbol { const iframe = this.object.images.filter( (image: rdf.Image) => image.iframe && image.url ); if (iframe.length > 0) { return html`${this._renderIframe(iframe[0].url)}`; } const filteredImages = this.object.images.filter( (image: rdf.Image) => !image.iframe && image.url ); const imgCount = filteredImages.length; switch (imgCount) { case 0: return nothing; case 1: return html`
`; case 2: return html`
${this._renderBgImg(filteredImages[0].url, "full-width")} ${this._renderBgImg(filteredImages[1].url, "full-width")}
`; case 3: return html`
${this._renderBgImg(filteredImages[0].url, "full-width")}
${this._renderBgImg(filteredImages[1].url, "")} ${this._renderBgImg(filteredImages[2].url, "")}
`; default: return html`
${this._renderBgImg(filteredImages[0].url, "full-width")}
${this._renderBgImg(filteredImages[1].url, "")} ${this._renderBgImg(filteredImages[2].url, "")}
${this._renderBgImg(filteredImages[3].url, "last-img")}
`; } } _renderAboutProvider(): TemplateResultOrSymbol { if (this.object.providers.length === 0) return nothing; return html`${this._renderDivision("h4", msg("Providers"))} ${this.object.providers.map( (provider: rdf.Provider) => html`
${provider.name}
${this._renderTitleValueDivision( msg("About the providers"), provider.description || msg("No description provided") )}` )}`; } _renderCompatibleServices(): TemplateResultOrSymbol { if (this.object.services.length === 0) return nothing; return html`${this._renderDivision( "h4", this.isType(rdf.RDFTYPE_PROVIDER) ? msg("Available Services") : msg("Compatible Services") )} ${this.object.services.map( (service: rdf.Service) => html`` )}`; } _renderCompatibleDataOffers(): TemplateResultOrSymbol { if (this.object.data_offers.length === 0) return nothing; return html`${this._renderDivision("h4", msg("Available Data Offers"))} ${this.object.data_offers.map( (data_offer: rdf.DataOffer) => html`` )}`; } // tags=${this._renderKindBadgeComponent(data_offer)} _renderOffers(): TemplateResult { return html`${this._renderDivision("h4", msg("Offers"))} ${this.object.offers.map((offer: rdf.Offer) => { const msgSubscribe: string = offerKindActionHandler(offer.kind); if (!msgSubscribe) return nothing; return html`
${this._renderButton( undefined, "sm", msgSubscribe, "primary", undefined, true )}
`; })}`; } _renderDataOfferBadgeRow(): TemplateResult { return html`
${this.renderTemplateWhenWith(["offers"], this._renderKindBadgeComponent)} ${this.renderTemplateWhenWith( ["categories"], this._renderCategoryBadgeComponent )}
`; } _renderColumns(...columns: TemplateResultOrSymbol[]): TemplateResultOrSymbol { const filteredColumns = columns.filter((col) => col !== nothing); if (filteredColumns.length === 1) { return columns[0]; } return html`
${filteredColumns.map( (col) => html`
${col}
` )}
`; } _renderServiceSpecificModal(): TemplateResultOrSymbol { return html`${this.renderTemplateWhenWith( ["images"], this._renderImageSingle )} ${this._renderColumns( html`${this.renderTemplateWhenWith(["long_description"], () => this._renderTitleValueDivision( msg("Features & Functionalities"), this.object.long_description ) )}${this.renderTemplateWhenWith( [["is_in_app", "is_external", "is_api"]], () => html`${this._renderDivision("h4", msg("Installation Possible"))}
${this.renderTemplateWhenWith( ["is_in_app"], () => html`${this._renderBadge("success", msg("In-App"))}
` )} ${this.renderTemplateWhenWith( ["is_external"], () => html`${this._renderBadge("success", msg("External"))}` )} ${this.renderTemplateWhenWith( ["is_api"], () => html`${this._renderBadge("success", msg("API"))}` )} ` )}${this.renderTemplateWhenWith( ["developper", "developper.url"], () => html`${this._renderDivision("h4", msg("Developper"))} ${this.object.developper.name}` )}${this.renderTemplateWhenWith(["release_date"], () => this._renderTitleValueDivision( msg("Release Date"), formatDate(this.object.release_date) ) )}${this.renderTemplateWhenWith(["last_update"], () => this._renderTitleValueDivision( msg("Last Update"), formatDate(this.object.last_update) ) )}${this.renderTemplateWhenWith(["documentation_url"], () => this._renderButton( undefined, "sm", "Read the full documentation", "outline-gray" ) )}` )}`; } _renderModal(): TemplateResultOrSymbol { if (!this.object || !this.object["@type"]) { return nothing; } return html`${this.renderTemplateWhenWith( [rdf.RDFTYPE_OBJECT, "images"], this._renderImageArray )} `; } _closeModal() { this.dispatchEvent(new CustomEvent("close")); } _addBookmark() { this.dispatchEvent( new CustomEvent("bookmark", { detail: { add: true, object: this.object }, }) ); } _removeBookmark() { this.dispatchEvent( new CustomEvent("bookmark", { detail: { add: false, object: this.object }, }) ); } _purchase() { console.log(msg("Disabled for POC")); this.dispatchEvent(new CustomEvent("purchase")); } render() { return html``; } }