task: Display built-in behaviors as list (#2518)
- Displays built-in behaviors as single field in workflow settings - Standardizes how "None" is displayed in workflow settings - Refactors behavior names into enum
This commit is contained in:
		
							parent
							
								
									61809ab3c5
								
							
						
					
					
						commit
						df8c80f3cc
					
				@ -8,7 +8,13 @@ import capitalize from "lodash/fp/capitalize";
 | 
			
		||||
import RegexColorize from "regex-colorize";
 | 
			
		||||
 | 
			
		||||
import { BtrixElement } from "@/classes/BtrixElement";
 | 
			
		||||
import type { CrawlConfig, Seed, SeedConfig } from "@/pages/org/types";
 | 
			
		||||
import { none, notSpecified } from "@/layouts/empty";
 | 
			
		||||
import {
 | 
			
		||||
  Behavior,
 | 
			
		||||
  type CrawlConfig,
 | 
			
		||||
  type Seed,
 | 
			
		||||
  type SeedConfig,
 | 
			
		||||
} from "@/pages/org/types";
 | 
			
		||||
import { labelFor } from "@/strings/crawl-workflows/labels";
 | 
			
		||||
import scopeTypeLabel from "@/strings/crawl-workflows/scopeType";
 | 
			
		||||
import sectionStrings from "@/strings/crawl-workflows/section";
 | 
			
		||||
@ -162,22 +168,15 @@ export class ConfigDetails extends BtrixElement {
 | 
			
		||||
        heading: sectionStrings.behaviors,
 | 
			
		||||
        renderDescItems: (seedsConfig) => html`
 | 
			
		||||
          ${this.renderSetting(
 | 
			
		||||
            labelFor.autoscrollBehavior,
 | 
			
		||||
            seedsConfig?.behaviors &&
 | 
			
		||||
              !seedsConfig.behaviors.includes("autoscroll")
 | 
			
		||||
              ? msg("Disabled")
 | 
			
		||||
              : html`<span class="text-neutral-400"
 | 
			
		||||
                  >${msg("Enabled (default)")}</span
 | 
			
		||||
                >`,
 | 
			
		||||
          )}
 | 
			
		||||
          ${this.renderSetting(
 | 
			
		||||
            labelFor.autoclickBehavior,
 | 
			
		||||
            seedsConfig?.behaviors &&
 | 
			
		||||
              seedsConfig.behaviors.includes("autoclick")
 | 
			
		||||
              ? msg("Enabled")
 | 
			
		||||
              : html`<span class="text-neutral-400"
 | 
			
		||||
                  >${msg("Disabled (default)")}</span
 | 
			
		||||
                >`,
 | 
			
		||||
            labelFor.behaviors,
 | 
			
		||||
            [
 | 
			
		||||
              seedsConfig?.behaviors?.includes(Behavior.AutoScroll) &&
 | 
			
		||||
                labelFor.autoscrollBehavior,
 | 
			
		||||
              seedsConfig?.behaviors?.includes(Behavior.AutoClick) &&
 | 
			
		||||
                labelFor.autoclickBehavior,
 | 
			
		||||
            ]
 | 
			
		||||
              .filter((v) => v)
 | 
			
		||||
              .join(", ") || none,
 | 
			
		||||
          )}
 | 
			
		||||
          ${this.renderSetting(
 | 
			
		||||
            labelFor.pageLoadTimeoutSeconds,
 | 
			
		||||
@ -424,7 +423,7 @@ export class ConfigDetails extends BtrixElement {
 | 
			
		||||
                  )}
 | 
			
		||||
                </ul>
 | 
			
		||||
              `
 | 
			
		||||
            : msg("None"),
 | 
			
		||||
            : none,
 | 
			
		||||
          true,
 | 
			
		||||
        ),
 | 
			
		||||
      )}
 | 
			
		||||
@ -463,7 +462,7 @@ export class ConfigDetails extends BtrixElement {
 | 
			
		||||
                })}
 | 
			
		||||
              </ul>
 | 
			
		||||
            `
 | 
			
		||||
          : msg("None"),
 | 
			
		||||
          : none,
 | 
			
		||||
        true,
 | 
			
		||||
      )}
 | 
			
		||||
      ${when(
 | 
			
		||||
@ -477,7 +476,7 @@ export class ConfigDetails extends BtrixElement {
 | 
			
		||||
            </btrix-queue-exclusion-table>
 | 
			
		||||
          </div>
 | 
			
		||||
        `,
 | 
			
		||||
        () => this.renderSetting(msg("Exclusions"), msg("None")),
 | 
			
		||||
        () => this.renderSetting(msg("Exclusions"), none),
 | 
			
		||||
      )}
 | 
			
		||||
    `;
 | 
			
		||||
  };
 | 
			
		||||
@ -490,11 +489,9 @@ export class ConfigDetails extends BtrixElement {
 | 
			
		||||
    } else if (typeof value === "boolean") {
 | 
			
		||||
      content = value ? msg("Yes") : msg("No");
 | 
			
		||||
    } else if (Array.isArray(value) && !value.length) {
 | 
			
		||||
      content = html`<span class="text-neutral-400">${msg("None")}</span>`;
 | 
			
		||||
      content = none;
 | 
			
		||||
    } else if (typeof value !== "number" && !value) {
 | 
			
		||||
      content = html`<span class="text-neutral-400"
 | 
			
		||||
        >${msg("Not specified")}</span
 | 
			
		||||
      >`;
 | 
			
		||||
      content = notSpecified;
 | 
			
		||||
    }
 | 
			
		||||
    return html`
 | 
			
		||||
      <btrix-desc-list-item label=${label} class=${breakAll ? "break-all" : ""}>
 | 
			
		||||
 | 
			
		||||
@ -62,7 +62,12 @@ import { labelFor } from "@/strings/crawl-workflows/labels";
 | 
			
		||||
import scopeTypeLabels from "@/strings/crawl-workflows/scopeType";
 | 
			
		||||
import sectionStrings from "@/strings/crawl-workflows/section";
 | 
			
		||||
import { AnalyticsTrackEvent } from "@/trackEvents";
 | 
			
		||||
import { ScopeType, type Seed, type WorkflowParams } from "@/types/crawler";
 | 
			
		||||
import {
 | 
			
		||||
  Behavior,
 | 
			
		||||
  ScopeType,
 | 
			
		||||
  type Seed,
 | 
			
		||||
  type WorkflowParams,
 | 
			
		||||
} from "@/types/crawler";
 | 
			
		||||
import type { UnderlyingFunction } from "@/types/utils";
 | 
			
		||||
import { NewWorkflowOnlyScopeType } from "@/types/workflow";
 | 
			
		||||
import { track } from "@/utils/analytics";
 | 
			
		||||
@ -111,11 +116,10 @@ type ProgressState = {
 | 
			
		||||
  tabs: Tabs;
 | 
			
		||||
};
 | 
			
		||||
const DEFAULT_BEHAVIORS = [
 | 
			
		||||
  "autoscroll",
 | 
			
		||||
  "autoplay",
 | 
			
		||||
  "autofetch",
 | 
			
		||||
  "siteSpecific",
 | 
			
		||||
];
 | 
			
		||||
  Behavior.AutoPlay,
 | 
			
		||||
  Behavior.AutoFetch,
 | 
			
		||||
  Behavior.SiteSpecific,
 | 
			
		||||
] as const;
 | 
			
		||||
const formName = "newJobConfig" as const;
 | 
			
		||||
const panelSuffix = "--panel" as const;
 | 
			
		||||
 | 
			
		||||
@ -1182,7 +1186,7 @@ https://archiveweb.page/images/${"logo.svg"}`}
 | 
			
		||||
 | 
			
		||||
  private renderBehaviors() {
 | 
			
		||||
    return html`
 | 
			
		||||
      ${this.renderSectionHeading(msg("Built-in Behaviors"))}
 | 
			
		||||
      ${this.renderSectionHeading(labelFor.behaviors)}
 | 
			
		||||
      ${inputCol(
 | 
			
		||||
        html`<sl-checkbox
 | 
			
		||||
          name="autoscrollBehavior"
 | 
			
		||||
@ -2206,17 +2210,17 @@ https://archiveweb.page/images/${"logo.svg"}`}
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private setBehaviors(): string {
 | 
			
		||||
    let behaviors = (
 | 
			
		||||
      this.formState.autoscrollBehavior
 | 
			
		||||
        ? DEFAULT_BEHAVIORS
 | 
			
		||||
        : DEFAULT_BEHAVIORS.slice(1)
 | 
			
		||||
    ).join(",");
 | 
			
		||||
    const behaviors: Behavior[] = [...DEFAULT_BEHAVIORS];
 | 
			
		||||
 | 
			
		||||
    if (this.formState.autoclickBehavior) {
 | 
			
		||||
      behaviors += ",autoclick";
 | 
			
		||||
    if (this.formState.autoscrollBehavior) {
 | 
			
		||||
      behaviors.unshift(Behavior.AutoScroll);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return behaviors;
 | 
			
		||||
    if (this.formState.autoclickBehavior) {
 | 
			
		||||
      behaviors.push(Behavior.AutoClick);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return behaviors.join(",");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private parseUrlListConfig(): Pick<
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								frontend/src/layouts/empty.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								frontend/src/layouts/empty.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
import { html } from "lit";
 | 
			
		||||
 | 
			
		||||
import { stringFor } from "@/strings/ui";
 | 
			
		||||
 | 
			
		||||
export const notSpecified = html`<span class="text-neutral-400">
 | 
			
		||||
  ${stringFor.notSpecified}
 | 
			
		||||
</span>`;
 | 
			
		||||
 | 
			
		||||
export const none = html`<span class="text-neutral-400">
 | 
			
		||||
  ${stringFor.none}
 | 
			
		||||
</span>`;
 | 
			
		||||
@ -1,6 +1,7 @@
 | 
			
		||||
import { msg } from "@lit/localize";
 | 
			
		||||
 | 
			
		||||
export const labelFor = {
 | 
			
		||||
  behaviors: msg("Built-in Behaviors"),
 | 
			
		||||
  autoscrollBehavior: msg("Autoscroll"),
 | 
			
		||||
  autoclickBehavior: msg("Autoclick"),
 | 
			
		||||
  pageLoadTimeoutSeconds: msg("Page Load Limit"),
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,15 @@
 | 
			
		||||
import { msg } from "@lit/localize";
 | 
			
		||||
import { html, type TemplateResult } from "lit";
 | 
			
		||||
 | 
			
		||||
export const noData = "--";
 | 
			
		||||
export const notApplicable = msg("n/a");
 | 
			
		||||
export const stringFor: Record<string, string> = {
 | 
			
		||||
  noData: "--",
 | 
			
		||||
  notApplicable: msg("n/a"),
 | 
			
		||||
  notSpecified: msg("Not specified"),
 | 
			
		||||
  none: msg("None"),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const noData = stringFor.noData;
 | 
			
		||||
export const notApplicable = stringFor.notApplicable;
 | 
			
		||||
 | 
			
		||||
// TODO Refactor all generic confirmation messages to use utility
 | 
			
		||||
export const deleteConfirmation = (name: string | TemplateResult) =>
 | 
			
		||||
 | 
			
		||||
@ -10,6 +10,14 @@ export enum ScopeType {
 | 
			
		||||
  Any = "any",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export enum Behavior {
 | 
			
		||||
  AutoScroll = "autoscroll",
 | 
			
		||||
  AutoClick = "autoclick",
 | 
			
		||||
  AutoPlay = "autoplay",
 | 
			
		||||
  AutoFetch = "autofetch",
 | 
			
		||||
  SiteSpecific = "siteSpecific",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type Seed = {
 | 
			
		||||
  url: string;
 | 
			
		||||
  scopeType: ScopeType | undefined;
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,7 @@ import { getAppSettings } from "./app";
 | 
			
		||||
 | 
			
		||||
import type { Tags } from "@/components/ui/tag-input";
 | 
			
		||||
import {
 | 
			
		||||
  Behavior,
 | 
			
		||||
  ScopeType,
 | 
			
		||||
  type Profile,
 | 
			
		||||
  type Seed,
 | 
			
		||||
@ -284,10 +285,10 @@ export function getInitialFormState(params: {
 | 
			
		||||
    pageLimit:
 | 
			
		||||
      params.initialWorkflow.config.limit ?? defaultFormState.pageLimit,
 | 
			
		||||
    autoscrollBehavior: params.initialWorkflow.config.behaviors
 | 
			
		||||
      ? params.initialWorkflow.config.behaviors.includes("autoscroll")
 | 
			
		||||
      ? params.initialWorkflow.config.behaviors.includes(Behavior.AutoScroll)
 | 
			
		||||
      : defaultFormState.autoscrollBehavior,
 | 
			
		||||
    autoclickBehavior: params.initialWorkflow.config.behaviors
 | 
			
		||||
      ? params.initialWorkflow.config.behaviors.includes("autoclick")
 | 
			
		||||
      ? params.initialWorkflow.config.behaviors.includes(Behavior.AutoClick)
 | 
			
		||||
      : defaultFormState.autoclickBehavior,
 | 
			
		||||
    userAgent:
 | 
			
		||||
      params.initialWorkflow.config.userAgent ?? defaultFormState.userAgent,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user