browsertrix/frontend/src/pages/org/workflows-new.ts
sua yoo 22435ddaf9
Save new workflow scope type preference (#2099)
Resolves https://github.com/webrecorder/browsertrix/issues/2091

<!-- Fixes #issue_number -->

### Changes

Saves scope type chosen from "+ New Workflow" dropdown to local storage, as well as from within workflow editor when creating a new workflow (but not editing an existing one).
2024-10-02 19:08:20 -07:00

151 lines
4.4 KiB
TypeScript

import { localized, msg } from "@lit/localize";
import { mergeDeep } from "immutable";
import { customElement, property } from "lit/decorators.js";
import { ifDefined } from "lit/directives/if-defined.js";
import { when } from "lit/directives/when.js";
import { ScopeType, type Seed, type WorkflowParams } from "./types";
import type { UserGuideEventMap } from "@/index";
import { pageNav, type Breadcrumb } from "@/layouts/pageHeader";
import { WorkflowScopeType } from "@/types/workflow";
import LiteElement, { html } from "@/utils/LiteElement";
import type { FormState as WorkflowFormState } from "@/utils/workflow";
/**
* Usage:
* ```ts
* <btrix-workflows-new></btrix-workflows-new>
* ```
*/
@localized()
@customElement("btrix-workflows-new")
export class WorkflowsNew extends LiteElement {
@property({ type: Boolean })
isCrawler!: boolean;
@property({ type: Array })
initialSeeds?: Seed[];
@property({ type: String })
scopeType?: WorkflowFormState["scopeType"];
@property({ type: Object })
initialWorkflow?: WorkflowParams;
private get defaultNewWorkflow(): WorkflowParams {
return {
name: "",
description: null,
profileid: null,
schedule: "",
config: {
scopeType: (this.appState.userPreferences?.newWorkflowScopeType ||
WorkflowScopeType.Page) as ScopeType,
exclude: [],
behaviorTimeout: null,
pageLoadTimeout: null,
pageExtraDelay: null,
postLoadDelay: null,
useSitemap: false,
failOnFailedSeed: false,
userAgent: null,
},
tags: [],
crawlTimeout: null,
maxCrawlSize: null,
jobType: "custom",
scale: 1,
autoAddCollections: [],
crawlerChannel: "default",
proxyId: null,
};
}
private renderBreadcrumbs() {
const breadcrumbs: Breadcrumb[] = [
{
href: `${this.orgBasePath}/workflows`,
content: msg("Crawl Workflows"),
},
{
content: msg("New Workflow"),
},
];
return pageNav(breadcrumbs);
}
render() {
if (!this.isCrawler) {
return this.renderNoAccess();
}
return html`
<div class="mb-5">${this.renderBreadcrumbs()}</div>
<header class="flex items-center justify-between">
<h2 class="mb-6 text-xl font-semibold">${msg("New Crawl Workflow")}</h2>
<sl-button
size="small"
@click=${() => {
this.dispatchEvent(
new CustomEvent<
UserGuideEventMap["btrix-user-guide-show"]["detail"]
>("btrix-user-guide-show", {
detail: {
path: "/user-guide/workflow-setup/#scope",
},
bubbles: true,
}),
);
}}
>
<sl-icon slot="prefix" name="book"></sl-icon>
${msg("Setup Guide")}
</sl-button>
</header>
${when(this.org, (org) => {
const initialWorkflow = mergeDeep(
this.defaultNewWorkflow,
{
profileid: org.crawlingDefaults?.profileid,
config: {
exclude: org.crawlingDefaults?.exclude || [""],
behaviorTimeout: org.crawlingDefaults?.behaviorTimeout,
pageLoadTimeout: org.crawlingDefaults?.pageLoadTimeout,
pageExtraDelay: org.crawlingDefaults?.pageExtraDelay,
postLoadDelay: org.crawlingDefaults?.postLoadDelay,
userAgent: org.crawlingDefaults?.userAgent,
blockAds: org.crawlingDefaults?.blockAds,
lang: org.crawlingDefaults?.lang,
},
crawlTimeout: org.crawlingDefaults?.crawlTimeout,
maxCrawlSize: org.crawlingDefaults?.maxCrawlSize,
crawlerChannel: org.crawlingDefaults?.crawlerChannel,
proxyId: org.crawlingDefaults?.proxyId,
},
this.initialWorkflow || {},
);
const scopeType = this.scopeType || initialWorkflow.config.scopeType;
return html`
<btrix-workflow-editor
initialScopeType=${ifDefined(
scopeType === ScopeType.Any ? undefined : scopeType,
)}
.initialWorkflow=${initialWorkflow}
.initialSeeds=${this.initialSeeds}
></btrix-workflow-editor>
`;
})}
`;
}
private readonly renderNoAccess = () => html`
<btrix-alert variant="danger">
${msg(`You don't have permission to create a new Workflow.`)}
</btrix-alert>
`;
}