From 9f8b469a398885811170c943be1b8a6747c38da6 Mon Sep 17 00:00:00 2001 From: sua yoo Date: Tue, 2 Dec 2025 14:26:46 -0800 Subject: [PATCH 1/3] add icons --- frontend/src/assets/icons/file-earmark-scan.svg | 8 ++++++++ frontend/src/assets/icons/file-earmark-scan2.svg | 7 +++++++ frontend/src/assets/icons/file-earmark-scan3.svg | 6 ++++++ 3 files changed, 21 insertions(+) create mode 100644 frontend/src/assets/icons/file-earmark-scan.svg create mode 100644 frontend/src/assets/icons/file-earmark-scan2.svg create mode 100644 frontend/src/assets/icons/file-earmark-scan3.svg diff --git a/frontend/src/assets/icons/file-earmark-scan.svg b/frontend/src/assets/icons/file-earmark-scan.svg new file mode 100644 index 0000000000..408f744403 --- /dev/null +++ b/frontend/src/assets/icons/file-earmark-scan.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/frontend/src/assets/icons/file-earmark-scan2.svg b/frontend/src/assets/icons/file-earmark-scan2.svg new file mode 100644 index 0000000000..4fa3f2d470 --- /dev/null +++ b/frontend/src/assets/icons/file-earmark-scan2.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/frontend/src/assets/icons/file-earmark-scan3.svg b/frontend/src/assets/icons/file-earmark-scan3.svg new file mode 100644 index 0000000000..a2988adca8 --- /dev/null +++ b/frontend/src/assets/icons/file-earmark-scan3.svg @@ -0,0 +1,6 @@ + + + + + + From 30501daa07f6ef99d948519bcd61afc986e78f29 Mon Sep 17 00:00:00 2001 From: sua yoo Date: Tue, 2 Dec 2025 14:32:07 -0800 Subject: [PATCH 2/3] add state --- frontend/src/types/crawlState.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/types/crawlState.ts b/frontend/src/types/crawlState.ts index f32e06c1ae..20bc18f0df 100644 --- a/frontend/src/types/crawlState.ts +++ b/frontend/src/types/crawlState.ts @@ -11,6 +11,7 @@ export const WAITING_NOT_PAUSED_STATES = [ "starting", "waiting_capacity", "waiting_org_limit", + "waiting_dedupe_index", ] as const; // Match backend TYPE_PAUSED_STATES in models.py From 3ab24b64330522b03a253929c2813c615cf98840 Mon Sep 17 00:00:00 2001 From: sua yoo Date: Tue, 2 Dec 2025 15:53:49 -0800 Subject: [PATCH 3/3] add badges --- .../src/assets/icons/file-earmark-scan.svg | 6 +- frontend/src/components/ui/badge.ts | 8 +- .../linked-collections-list-item.ts | 4 +- .../features/crawls/crawler-channel-badge.ts | 2 +- frontend/src/features/crawls/proxy-badge.ts | 2 +- frontend/src/features/dedupe/dedupe-badge.ts | 39 ++++++++++ .../features/dedupe/dedupe-source-badge.ts | 22 ++++++ frontend/src/features/dedupe/index.ts | 2 + frontend/src/features/index.ts | 1 + .../archived-item-detail.ts | 75 +++++++++++++++---- frontend/src/pages/org/workflow-detail.ts | 21 +++++- frontend/src/types/crawler.ts | 2 + 12 files changed, 158 insertions(+), 26 deletions(-) create mode 100644 frontend/src/features/dedupe/dedupe-badge.ts create mode 100644 frontend/src/features/dedupe/dedupe-source-badge.ts create mode 100644 frontend/src/features/dedupe/index.ts diff --git a/frontend/src/assets/icons/file-earmark-scan.svg b/frontend/src/assets/icons/file-earmark-scan.svg index 408f744403..ca3dc8cc7e 100644 --- a/frontend/src/assets/icons/file-earmark-scan.svg +++ b/frontend/src/assets/icons/file-earmark-scan.svg @@ -1,7 +1,7 @@ - - - + + + diff --git a/frontend/src/components/ui/badge.ts b/frontend/src/components/ui/badge.ts index e679229211..de33dd533e 100644 --- a/frontend/src/components/ui/badge.ts +++ b/frontend/src/components/ui/badge.ts @@ -13,6 +13,8 @@ export type BadgeVariant = | "primary" | "cyan" | "blue" + | "violet" + | "orange" | "high-contrast" | "text" | "text-neutral"; @@ -52,7 +54,7 @@ export class Badge extends TailwindElement { return html`
${item.name}
${dedupeEnabled - ? html` - ${msg("Dedupe Source")} - ` + ? html`` : nothing} `, ]; diff --git a/frontend/src/features/crawls/crawler-channel-badge.ts b/frontend/src/features/crawls/crawler-channel-badge.ts index adce184bdc..049702b6ff 100644 --- a/frontend/src/features/crawls/crawler-channel-badge.ts +++ b/frontend/src/features/crawls/crawler-channel-badge.ts @@ -36,7 +36,7 @@ export class CrawlerChannelBadge extends TailwindElement { variant=${this.channelId === CrawlerChannelImage.Default ? "neutral" : "blue"} - class="font-monostyle whitespace-nowrap" + class="font-monostyle" > ${this.channelId} diff --git a/frontend/src/features/crawls/proxy-badge.ts b/frontend/src/features/crawls/proxy-badge.ts index dabf5082a8..37e60ecb30 100644 --- a/frontend/src/features/crawls/proxy-badge.ts +++ b/frontend/src/features/crawls/proxy-badge.ts @@ -29,7 +29,7 @@ export class ProxyBadge extends TailwindElement { ?disabled=${!proxy?.description} hoist > - + ${proxy?.label || this.proxyId} diff --git a/frontend/src/features/dedupe/dedupe-badge.ts b/frontend/src/features/dedupe/dedupe-badge.ts new file mode 100644 index 0000000000..5c4dc47589 --- /dev/null +++ b/frontend/src/features/dedupe/dedupe-badge.ts @@ -0,0 +1,39 @@ +import { localized, msg } from "@lit/localize"; +import { html } from "lit"; +import { customElement, property } from "lit/decorators.js"; + +import { TailwindElement } from "@/classes/TailwindElement"; + +@customElement("btrix-dedupe-badge") +@localized() +export class DedupeBadge extends TailwindElement { + @property({ type: Boolean }) + requiredByCrawls = false; + + render() { + return html` + + + ${this.requiredByCrawls ? msg("Dependency") : msg("Dependent")} + + `; + } +} diff --git a/frontend/src/features/dedupe/dedupe-source-badge.ts b/frontend/src/features/dedupe/dedupe-source-badge.ts new file mode 100644 index 0000000000..0e188e468d --- /dev/null +++ b/frontend/src/features/dedupe/dedupe-source-badge.ts @@ -0,0 +1,22 @@ +import { localized, msg } from "@lit/localize"; +import { html } from "lit"; +import { customElement } from "lit/decorators.js"; + +import { TailwindElement } from "@/classes/TailwindElement"; + +@customElement("btrix-dedupe-source-badge") +@localized() +export class DedupeSourceBadge extends TailwindElement { + render() { + return html` + + + ${msg("Dedupe")} + + `; + } +} diff --git a/frontend/src/features/dedupe/index.ts b/frontend/src/features/dedupe/index.ts new file mode 100644 index 0000000000..bbbbbaa481 --- /dev/null +++ b/frontend/src/features/dedupe/index.ts @@ -0,0 +1,2 @@ +import("./dedupe-badge"); +import("./dedupe-source-badge"); diff --git a/frontend/src/features/index.ts b/frontend/src/features/index.ts index bd047b5664..af87087230 100644 --- a/frontend/src/features/index.ts +++ b/frontend/src/features/index.ts @@ -4,6 +4,7 @@ import "./browser-profiles"; import "./crawls"; import "./collections"; import "./crawl-workflows"; +import "./dedupe"; import "./org"; import "./qa"; import "./users"; diff --git a/frontend/src/pages/org/archived-item-detail/archived-item-detail.ts b/frontend/src/pages/org/archived-item-detail/archived-item-detail.ts index 0cf0f79332..1e194891de 100644 --- a/frontend/src/pages/org/archived-item-detail/archived-item-detail.ts +++ b/frontend/src/pages/org/archived-item-detail/archived-item-detail.ts @@ -11,7 +11,12 @@ import { BtrixElement } from "@/classes/BtrixElement"; import { type Dialog } from "@/components/ui/dialog"; import { ClipboardController } from "@/controllers/clipboard"; import type { CrawlMetadataEditor } from "@/features/archived-items/item-metadata-editor"; -import { pageBack, pageNav, type Breadcrumb } from "@/layouts/pageHeader"; +import { + pageBack, + pageHeader, + pageNav, + type Breadcrumb, +} from "@/layouts/pageHeader"; import { OrgTab, WorkflowTab } from "@/routes"; import type { APIPaginatedList } from "@/types/api"; import type { @@ -411,7 +416,9 @@ export class ArchivedItemDetail extends BtrixElement { break; default: sectionContent = html` -
+
${this.renderPanel(msg("Overview"), this.renderOverview(), [ tw`rounded-lg border p-4`, @@ -673,20 +680,56 @@ export class ArchivedItemDetail extends BtrixElement { } private renderHeader() { - return html` -
- -
- ${this.isCrawler - ? this.item - ? this.renderMenu() - : html`` - : nothing} -
-
- `; + const badgesSkeleton = () => + html``; + + const badges = (item: ArchivedItem) => { + return html`
+ ${isCrawl(item) + ? html` + + ${msg("Crawl")} + + + + ${item.reviewStatus + ? msg("Reviewed") + : msg("No Review")} + + ${item.requiresCrawls || item.requiredByCrawls + ? html`` + : nothing} ` + : html` + + ${msg("Uploaded")}`} +
`; + }; + return pageHeader({ + title: this.item ? renderName(this.item) : undefined, + secondary: when(this.item, badges, badgesSkeleton), + actions: this.isCrawler + ? this.item + ? this.renderMenu() + : html`` + : undefined, + }); } private renderMenu() { diff --git a/frontend/src/pages/org/workflow-detail.ts b/frontend/src/pages/org/workflow-detail.ts index 4b8a7673dc..f672b44170 100644 --- a/frontend/src/pages/org/workflow-detail.ts +++ b/frontend/src/pages/org/workflow-detail.ts @@ -683,7 +683,12 @@ export class WorkflowDetail extends BtrixElement {
-

${this.tabLabels[tab]}

+
+

${this.tabLabels[tab]}

+ ${tab === WorkflowTab.LatestCrawl + ? this.renderDedupeBadge() + : nothing} +
${this.renderPanelAction()}
@@ -1389,6 +1394,20 @@ export class WorkflowDetail extends BtrixElement { `; }; + private readonly renderDedupeBadge = () => { + const latestCrawl = this.latestCrawlTask.value; + + if ( + !latestCrawl || + (!latestCrawl.requiredByCrawls && !latestCrawl.requiresCrawls) + ) + return; + + return html``; + }; + private readonly renderPausedNotice = ( { truncate } = { truncate: false }, ) => { diff --git a/frontend/src/types/crawler.ts b/frontend/src/types/crawler.ts index f24ade1241..abf72354ec 100644 --- a/frontend/src/types/crawler.ts +++ b/frontend/src/types/crawler.ts @@ -206,6 +206,8 @@ export type Crawl = ArchivedItemBase & browserWindows: number; shouldPause: boolean | null; resources?: (StorageFile & { numReplicas: number })[]; + requiresCrawls: boolean; + requiredByCrawls: boolean; }; export type Upload = ArchivedItemBase & {