import { html as staticHtml, unsafeStatic } from "lit/static-html.js"; import { state, property } from "lit/decorators.js"; import { when } from "lit/directives/when.js"; import { msg, localized, str } from "@lit/localize"; import RegexColorize from "regex-colorize"; import ISO6391 from "iso-639-1"; import LiteElement, { html } from "../utils/LiteElement"; import type { CrawlConfig, Seed, SeedConfig } from "../pages/org/types"; import { humanizeSchedule } from "../utils/cron"; /** * Usage: * ```ts * * ``` */ @localized() export class ConfigDetails extends LiteElement { @property({ type: Object }) crawlConfig?: CrawlConfig; @property({ type: Boolean }) anchorLinks = false; // Hide tag field, e.g. if embedded in crawl detail view @property({ type: Boolean }) hideTags = false; private readonly scopeTypeLabels: Record< CrawlConfig["config"]["scopeType"], string > = { prefix: msg("Path Begins with This URL"), host: msg("Pages on This Domain"), domain: msg("Pages on This Domain & Subdomains"), "page-spa": msg("Single Page App (In-Page Links Only)"), page: msg("Page"), custom: msg("Custom"), any: msg("Any"), }; render() { const crawlConfig = this.crawlConfig; const exclusions = crawlConfig?.config.exclude || []; return html`

${this.renderAnchorLink("crawl-information")}${msg( "Crawl Information" )}

${this.renderSetting(msg("Name"), crawlConfig?.name)} ${this.hideTags ? "" : this.renderSetting( msg("Tags"), crawlConfig?.tags?.length ? crawlConfig.tags.map( (tag) => html`${tag}` ) : undefined )}

${this.renderAnchorLink("crawler-settings")} ${msg("Crawler Settings")}

${when( crawlConfig?.jobType === "seed-crawl", this.renderConfirmSeededSettings, this.renderConfirmUrlListSettings )} ${when( exclusions.length, () => html`
`, () => this.renderSetting(msg("Exclusions"), msg("None")) )} ${this.renderSetting( msg("Page Time Limit"), crawlConfig?.config.behaviorTimeout ? msg(str`${crawlConfig?.config.behaviorTimeout / 60} minute(s)`) : msg("None") )} ${this.renderSetting( msg("Crawl Time Limit"), crawlConfig?.crawlTimeout ? msg(str`${crawlConfig?.crawlTimeout / 60} minute(s)`) : msg("None") )} ${this.renderSetting(msg("Crawler Instances"), crawlConfig?.scale)}

${this.renderAnchorLink("browser-settings")} ${msg("Browser Settings")}

${this.renderSetting( msg("Browser Profile"), when( crawlConfig?.profileid, () => html` ${crawlConfig?.profileName} `, () => msg("Default Profile") ) )} ${this.renderSetting( msg("Block Ads by Domain"), crawlConfig?.config.blockAds )} ${this.renderSetting( msg("Language"), ISO6391.getName(crawlConfig?.config.lang!) )}

${this.renderAnchorLink("crawl-scheduling")} ${msg("Crawl Scheduling")}

${this.renderSetting( msg("Crawl Schedule Type"), crawlConfig?.schedule ? msg("Run on a Recurring Basis") : msg("No Schedule") )} ${when(crawlConfig?.schedule, () => this.renderSetting( msg("Schedule"), crawlConfig?.schedule ? humanizeSchedule(crawlConfig.schedule) : undefined ) )}
`; } private renderConfirmUrlListSettings = () => { const crawlConfig = this.crawlConfig; return html` ${this.renderSetting( msg("List of URLs"), html` ` )} ${this.renderSetting( msg("Include Any Linked Page"), Boolean(crawlConfig?.config.extraHops) )} `; }; private renderConfirmSeededSettings = () => { const crawlConfig = this.crawlConfig!; const seedsConfig = crawlConfig.config; const additionalUrlList = seedsConfig.seeds.slice(1); let primarySeedConfig: SeedConfig | Seed = seedsConfig; let primarySeedUrl = seedsConfig.seeds[0]; if (typeof seedsConfig.seeds[0] !== "string") { primarySeedConfig = seedsConfig.seeds[0]; primarySeedUrl = primarySeedConfig.url; } const includeUrlList = primarySeedConfig.include || seedsConfig.include; return html` ${this.renderSetting(msg("Primary Seed URL"), primarySeedUrl)} ${this.renderSetting( msg("Crawl Scope"), this.scopeTypeLabels[ primarySeedConfig.scopeType || seedsConfig.scopeType ] )} ${this.renderSetting( msg("Extra URLs in Scope"), includeUrlList?.length ? html` ` : msg("None") )} ${this.renderSetting( msg("Include Any Linked Page (“one hop out”)"), Boolean(primarySeedConfig.extraHops ?? seedsConfig.extraHops) )} ${this.renderSetting( msg("List of Additional URLs"), additionalUrlList?.length ? html` ` : msg("None") )} ${this.renderSetting( msg("Max Pages"), seedsConfig.limit ? msg(str`${primarySeedConfig.limit ?? seedsConfig.limit} pages`) : msg("Unlimited") )} `; }; private renderAnchorLink(id: string) { if (!this.anchorLinks) return; const currentUrl = window.location.href; return html` `; } private renderSetting(label: string, value: any) { let content = value; if (!this.crawlConfig) { content = html` `; } else if (typeof value === "boolean") { content = value ? msg("Yes") : msg("No"); } else if (typeof value !== "number" && !value) { content = html`${msg("Not specified")}`; } return html` ${content} `; } }