@@ -25,7 +25,7 @@ import { ShareableNotice } from "./templates/shareable-notice";
2525
2626import { BtrixElement } from "@/classes/BtrixElement";
2727import type { OverflowDropdown } from "@/components/ui/overflow-dropdown";
28- import { WorkflowTab } from "@/routes";
28+ import { OrgTab, WorkflowTab } from "@/routes";
2929import { noData } from "@/strings/ui";
3030import type { ListWorkflow } from "@/types/crawler";
3131import { humanizeSchedule } from "@/utils/cron";
@@ -40,15 +40,15 @@ export type WorkflowColumnName =
4040 | "actions";
4141
4242const columnWidths = {
43- name: "minmax(18rem, 1fr)",
43+ // TODO Consolidate with table.stylesheet.css
44+ // https://github.com/webrecorder/browsertrix/issues/3001
45+ name: "[clickable-start] minmax(18rem, 1fr)",
4446 "latest-crawl": "minmax(15rem, 18rem)",
4547 "total-crawls": "minmax(6rem, 9rem)",
4648 modified: "minmax(12rem, 15rem)",
47- actions: "3rem",
49+ actions: "[clickable-end] 3rem",
4850} as const satisfies Record<WorkflowColumnName, string>;
4951
50- // postcss-lit-disable-next-line
51- const mediumBreakpointCss = css`30rem`;
5252// postcss-lit-disable-next-line
5353const largeBreakpointCss = css`60rem`;
5454// postcss-lit-disable-next-line
@@ -65,11 +65,6 @@ const rowCss = css`
6565 right: 0;
6666 }
6767
68- @media only screen and (min-width: ${mediumBreakpointCss}) {
69- .row {
70- grid-template-columns: repeat(2, 1fr);
71- }
72- }
7368 @media only screen and (min-width: ${largeBreakpointCss}) {
7469 .row {
7570 grid-template-columns: var(--btrix-workflow-list-columns);
@@ -252,6 +247,43 @@ export class WorkflowListItem extends BtrixElement {
252247 border-left: 1px solid var(--sl-panel-border-color);
253248 }
254249 }
250+
251+ /*
252+ * TODO Consolidate with table.stylesheet.css
253+ * https://github.com/webrecorder/browsertrix/issues/3001
254+ */
255+ .rowClickTarget--cell {
256+ display: grid;
257+ grid-template-columns: subgrid;
258+ white-space: nowrap;
259+ overflow: hidden;
260+ }
261+
262+ .rowClickTarget {
263+ max-width: 100%;
264+ }
265+
266+ .col sl-tooltip > *,
267+ .col btrix-popover > *,
268+ .col btrix-overflow-dropdown {
269+ /* Place above .rowClickTarget::after overlay */
270+ z-index: 10;
271+ position: relative;
272+ }
273+
274+ .rowClickTarget::after {
275+ content: "";
276+ display: block;
277+ position: absolute;
278+ inset: 0;
279+ grid-column: clickable-start / clickable-end;
280+ }
281+
282+ .rowClickTarget:focus-visible {
283+ outline: var(--sl-focus-ring);
284+ outline-offset: -0.25rem;
285+ border-radius: 0.5rem;
286+ }
255287 `,
256288 ];
257289
@@ -271,13 +303,18 @@ export class WorkflowListItem extends BtrixElement {
271303 @query("btrix-overflow-dropdown")
272304 dropdownMenu!: OverflowDropdown;
273305
306+ @query("a")
307+ private readonly anchor?: HTMLAnchorElement | null;
308+
274309 private readonly columnTemplate = {
275- name: () =>
276- html`<div class="col">
277- <div class="detail url items-center truncate">
310+ name: () => {
311+ const href = `/orgs/${this.orgSlugState}/${OrgTab.Workflows}/${this.workflow?.id}/${this.workflow?.lastCrawlState?.startsWith("failed") ? WorkflowTab.Logs : WorkflowTab.LatestCrawl}`;
312+
313+ return html`<div class="col rowClickTarget--cell">
314+ <a class="detail url rowClickTarget items-center truncate" href=${href}>
278315 ${when(this.workflow?.shareable, ShareableNotice)}
279316 ${this.safeRender(this.renderName)}
280- </div >
317+ </a >
281318 <div class="desc truncate">
282319 ${this.safeRender((workflow) => {
283320 if (workflow.schedule) {
@@ -291,7 +328,8 @@ export class WorkflowListItem extends BtrixElement {
291328 return msg("---");
292329 })}
293330 </div>
294- </div>`,
331+ </div>`;
332+ },
295333 "latest-crawl": () =>
296334 html`<div class="col">${this.safeRender(this.renderLatestCrawl)}</div>`,
297335 "total-crawls": () =>
@@ -358,20 +396,7 @@ export class WorkflowListItem extends BtrixElement {
358396 } satisfies Record<WorkflowColumnName, () => TemplateResult>;
359397
360398 render() {
361- return html`<div
362- class="item row"
363- role="button"
364- @click=${async (e: MouseEvent) => {
365- if (e.target === this.dropdownMenu) {
366- return;
367- }
368- e.preventDefault();
369- await this.updateComplete;
370- const failedStates = ["failed", "failed_not_logged_in"];
371- const href = `/orgs/${this.orgSlugState}/workflows/${this.workflow?.id}/${failedStates.includes(this.workflow?.lastCrawlState || "") ? WorkflowTab.Logs : WorkflowTab.LatestCrawl}`;
372- this.navigate.to(href);
373- }}
374- >
399+ return html`<div class="item row">
375400 ${this.columns
376401 ? this.columns.map((col) => this.columnTemplate[col]())
377402 : Object.values(this.columnTemplate).map((render) => render())}
@@ -480,7 +505,7 @@ export class WorkflowListItem extends BtrixElement {
480505
481506 return html`
482507 <sl-tooltip hoist placement="bottom" ?disabled=${!tooltipContent}>
483- <div>
508+ <div class="w-max" @click=${this.redirectEventToAnchor} >
484509 <div class="detail">${status}</div>
485510 <div class="desc duration">${duration}</div>
486511 </div>
@@ -495,7 +520,7 @@ export class WorkflowListItem extends BtrixElement {
495520
496521 return html`
497522 <sl-tooltip hoist placement="bottom">
498- <div>
523+ <div class="w-max" @click=${this.redirectEventToAnchor} >
499524 <div class="detail truncate">
500525 ${workflow.modifiedByName
501526 ? html`<btrix-user-chip
@@ -548,6 +573,19 @@ export class WorkflowListItem extends BtrixElement {
548573 >${nameSuffix}
549574 `;
550575 };
576+
577+ /*
578+ * TODO Remove when refactored to `btrix-table`
579+ * https://github.com/webrecorder/browsertrix/issues/3001
580+ */
581+ private readonly redirectEventToAnchor = (e: MouseEvent) => {
582+ if (!e.defaultPrevented) {
583+ const newEvent = new MouseEvent(e.type, e);
584+ e.stopPropagation();
585+
586+ this.anchor?.dispatchEvent(newEvent);
587+ }
588+ };
551589}
552590
553591@customElement("btrix-workflow-list")
0 commit comments