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("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`
${crawlConfig?.config.seeds.map(
(url: any) => html` - ${url}
`
)}
`
)}
${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`
${includeUrlList.map(
(url: string) =>
staticHtml`- ${unsafeStatic(
new RegexColorize().colorizeText(url)
)}
`
)}
`
: 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`
${additionalUrlList.map((url) => html`- ${url}
`)}
`
: 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}
`;
}
}