Add "Copy <item type> ID" to a bunch of menus (#2426)
Addresses feedback from here https://discord.com/channels/895426029194207262/910966759165657161/1344367205004873819 by @tw4l. Add "Copy <item type> ID" to a bunch of menus, including all list and detail pages, as well as all other item/crawl/page lists. | Screenshots | |--------| | <img width="323" alt="Screenshot 2025-02-26 at 3 56 48 PM" src="https://github.com/user-attachments/assets/32044c47-65f3-4e80-8f39-df5fd2101324" /> | | <img width="246" alt="Screenshot 2025-02-26 at 4 02 06 PM" src="https://github.com/user-attachments/assets/8f2d6272-f450-4923-b5c9-751a2eea9a26" /> | | <img width="419" alt="Screenshot 2025-02-26 at 4 02 55 PM" src="https://github.com/user-attachments/assets/0c005a33-055d-4fb7-a79e-9bedae57b785" /> | | <img width="1104" alt="Screenshot 2025-02-26 at 1 57 01 PM" src="https://github.com/user-attachments/assets/7ee43400-1b30-4c78-89a0-3ddb89ef90ca" /> | | <img width="292" alt="Screenshot 2025-02-26 at 4 01 10 PM" src="https://github.com/user-attachments/assets/929f7870-aa83-4f3c-947a-efad377e0b49" /> | | <img width="240" alt="Screenshot 2025-02-26 at 4 03 19 PM" src="https://github.com/user-attachments/assets/45bff838-f741-45ce-b1a7-a8cfefa9656b" /> | --------- Co-authored-by: Henry Wilkinson <henry@wilkinson.graphics>
This commit is contained in:
		
							parent
							
								
									e67708bd4f
								
							
						
					
					
						commit
						00e85c3e94
					
				| @ -47,7 +47,10 @@ export class MenuItemLink extends TailwindElement { | ||||
|       download=${this.download} | ||||
|       aria-disabled=${this.disabled} | ||||
|       @click=${(e: MouseEvent) => { | ||||
|         if (this.disabled || this.loading) return; | ||||
|         if (this.disabled || this.loading) { | ||||
|           e.preventDefault(); | ||||
|           return; | ||||
|         } | ||||
| 
 | ||||
|         if (this.download) { | ||||
|           const dropdown = this.shadowRoot!.host.closest< | ||||
|  | ||||
| @ -630,6 +630,26 @@ export class ArchivedItemDetail extends BtrixElement { | ||||
|               <sl-divider></sl-divider> | ||||
|             `,
 | ||||
|           )} | ||||
|           ${when( | ||||
|             isSuccessfullyFinished(this.item), | ||||
|             () => html` | ||||
|               <btrix-menu-item-link | ||||
|                 href=${`/api/orgs/${this.orgId}/all-crawls/${this.itemId}/download?auth_bearer=${authToken}`} | ||||
|                 download | ||||
|               > | ||||
|                 <sl-icon name="cloud-download" slot="prefix"></sl-icon> | ||||
|                 ${msg("Download Item")} | ||||
|                 ${this.item?.fileSize | ||||
|                   ? html` <btrix-badge
 | ||||
|                       slot="suffix" | ||||
|                       class="font-monostyle text-xs text-neutral-500" | ||||
|                       >${this.localize.bytes(this.item.fileSize)}</btrix-badge | ||||
|                     >` | ||||
|                   : nothing} | ||||
|               </btrix-menu-item-link> | ||||
|               <sl-divider></sl-divider> | ||||
|             `,
 | ||||
|           )} | ||||
|           ${when( | ||||
|             this.itemType === "crawl", | ||||
|             () => html` | ||||
| @ -659,19 +679,15 @@ export class ArchivedItemDetail extends BtrixElement { | ||||
|             <sl-icon name="tags" slot="prefix"></sl-icon> | ||||
|             ${msg("Copy Tags")} | ||||
|           </sl-menu-item> | ||||
|           ${when( | ||||
|             isSuccessfullyFinished(this.item), | ||||
|             () => html` | ||||
|               <sl-divider></sl-divider> | ||||
|               <btrix-menu-item-link | ||||
|                 href=${`/api/orgs/${this.orgId}/all-crawls/${this.itemId}/download?auth_bearer=${authToken}`} | ||||
|                 download | ||||
|               > | ||||
|                 <sl-icon name="cloud-download" slot="prefix"></sl-icon> | ||||
|                 ${msg("Download Item")} | ||||
|               </btrix-menu-item-link> | ||||
|             `,
 | ||||
|           <sl-menu-item | ||||
|             @click=${() => | ||||
|               ClipboardController.copyToClipboard( | ||||
|                 this.item?.id ?? this.itemId ?? "", | ||||
|               )} | ||||
|           > | ||||
|             <sl-icon name="copy" slot="prefix"></sl-icon> | ||||
|             ${msg("Copy Item ID")} | ||||
|           </sl-menu-item> | ||||
|           ${when( | ||||
|             this.isCrawler, | ||||
|             () => html` | ||||
|  | ||||
| @ -16,6 +16,7 @@ import queryString from "query-string"; | ||||
| import { BtrixElement } from "@/classes/BtrixElement"; | ||||
| import { type Dialog } from "@/components/ui/dialog"; | ||||
| import type { PageChangeEvent } from "@/components/ui/pagination"; | ||||
| import { ClipboardController } from "@/controllers/clipboard"; | ||||
| import { iconFor as iconForPageReview } from "@/features/qa/page-list/helpers"; | ||||
| import * as pageApproval from "@/features/qa/page-list/helpers/approval"; | ||||
| import type { SelectDetail } from "@/features/qa/qa-run-dropdown"; | ||||
| @ -392,6 +393,13 @@ export class ArchivedItemDetailQA extends BtrixElement { | ||||
|                         </btrix-menu-item-link> | ||||
|                         <sl-divider></sl-divider> | ||||
|                       `}
 | ||||
|                   <sl-menu-item | ||||
|                     @click=${() => ClipboardController.copyToClipboard(run.id)} | ||||
|                   > | ||||
|                     <sl-icon name="copy" slot="prefix"></sl-icon> | ||||
|                     ${msg("Copy Run ID")} | ||||
|                   </sl-menu-item> | ||||
|                   <sl-divider></sl-divider> | ||||
|                   <sl-menu-item | ||||
|                     @click=${() => { | ||||
|                       this.deleting = run.id; | ||||
| @ -750,12 +758,16 @@ export class ArchivedItemDetailQA extends BtrixElement { | ||||
|           "[clickable-start] minmax(12rem, auto)", | ||||
|           "minmax(min-content, 12rem)", | ||||
|           "minmax(min-content, 12rem) [clickable-end]", | ||||
|           "min-content", | ||||
|         ].join(" ")}" | ||||
|       > | ||||
|         <btrix-table-head> | ||||
|           <btrix-table-header-cell>${msg("Page")}</btrix-table-header-cell> | ||||
|           <btrix-table-header-cell>${msg("Approval")}</btrix-table-header-cell> | ||||
|           <btrix-table-header-cell>${msg("Comments")}</btrix-table-header-cell> | ||||
|           <btrix-table-header-cell class="px-0"> | ||||
|             <span class="sr-only">${msg("Row actions")}</span> | ||||
|           </btrix-table-header-cell> | ||||
|         </btrix-table-head> | ||||
|         <btrix-table-body class="rounded border"> | ||||
|           ${this.pages?.items.map( | ||||
| @ -809,6 +821,21 @@ export class ArchivedItemDetailQA extends BtrixElement { | ||||
|                         ${msg("None")} | ||||
|                       </span>`}
 | ||||
|                 </btrix-table-cell> | ||||
|                 <btrix-table-cell class="p-0"> | ||||
|                   <div class="col action"> | ||||
|                     <btrix-overflow-dropdown> | ||||
|                       <sl-menu> | ||||
|                         <sl-menu-item | ||||
|                           @click=${() => | ||||
|                             ClipboardController.copyToClipboard(page.id)} | ||||
|                         > | ||||
|                           <sl-icon name="copy" slot="prefix"></sl-icon> | ||||
|                           ${msg("Copy Page ID")} | ||||
|                         </sl-menu-item> | ||||
|                       </sl-menu> | ||||
|                     </btrix-overflow-dropdown> | ||||
|                   </div> | ||||
|                 </btrix-table-cell> | ||||
|               </btrix-table-row> | ||||
|             `,
 | ||||
|           )} | ||||
|  | ||||
| @ -598,6 +598,26 @@ export class CrawlsList extends BtrixElement { | ||||
|           <sl-divider></sl-divider> | ||||
|         `,
 | ||||
|       )} | ||||
|       ${when( | ||||
|         isSuccessfullyFinished(item), | ||||
|         () => html` | ||||
|           <btrix-menu-item-link | ||||
|             href=${`/api/orgs/${this.orgId}/all-crawls/${item.id}/download?auth_bearer=${authToken}`} | ||||
|             download | ||||
|           > | ||||
|             <sl-icon name="cloud-download" slot="prefix"></sl-icon> | ||||
|             ${msg("Download Item")} | ||||
|             ${item.fileSize | ||||
|               ? html` <btrix-badge
 | ||||
|                   slot="suffix" | ||||
|                   class="font-monostyle text-xs text-neutral-500" | ||||
|                   >${this.localize.bytes(item.fileSize)}</btrix-badge | ||||
|                 >` | ||||
|               : nothing} | ||||
|           </btrix-menu-item-link> | ||||
|           <sl-divider></sl-divider> | ||||
|         `,
 | ||||
|       )} | ||||
|       ${item.type === "crawl" | ||||
|         ? html` | ||||
|             <sl-menu-item | ||||
| @ -615,14 +635,9 @@ export class CrawlsList extends BtrixElement { | ||||
|               <sl-icon name="copy" slot="prefix"></sl-icon> | ||||
|               ${msg("Copy Workflow ID")} | ||||
|             </sl-menu-item> | ||||
|             <sl-menu-item | ||||
|               @click=${() => ClipboardController.copyToClipboard(item.id)} | ||||
|             > | ||||
|               <sl-icon name="copy" slot="prefix"></sl-icon> | ||||
|               ${msg("Copy Archived Item ID")} | ||||
|             </sl-menu-item> | ||||
|           ` | ||||
|         : nothing} | ||||
| 
 | ||||
|       <sl-menu-item | ||||
|         @click=${() => | ||||
|           ClipboardController.copyToClipboard(item.tags.join(", "))} | ||||
| @ -631,19 +646,12 @@ export class CrawlsList extends BtrixElement { | ||||
|         <sl-icon name="tags" slot="prefix"></sl-icon> | ||||
|         ${msg("Copy Tags")} | ||||
|       </sl-menu-item> | ||||
|       ${when( | ||||
|         isSuccessfullyFinished(item), | ||||
|         () => html` | ||||
|           <sl-divider></sl-divider> | ||||
|           <btrix-menu-item-link | ||||
|             href=${`/api/orgs/${this.orgId}/all-crawls/${item.id}/download?auth_bearer=${authToken}`} | ||||
|             download | ||||
|       <sl-menu-item | ||||
|         @click=${() => ClipboardController.copyToClipboard(item.id)} | ||||
|       > | ||||
|             <sl-icon name="cloud-download" slot="prefix"></sl-icon> | ||||
|             ${msg("Download Item")} | ||||
|           </btrix-menu-item-link> | ||||
|         `,
 | ||||
|       )} | ||||
|         <sl-icon name="copy" slot="prefix"></sl-icon> | ||||
|         ${msg("Copy Item ID")} | ||||
|       </sl-menu-item> | ||||
|       ${when( | ||||
|         this.isCrawler && (item.type !== "crawl" || !isActive(item)), | ||||
|         () => html` | ||||
|  | ||||
| @ -10,6 +10,7 @@ import type { Profile, ProfileWorkflow } from "./types"; | ||||
| 
 | ||||
| import { BtrixElement } from "@/classes/BtrixElement"; | ||||
| import type { Dialog } from "@/components/ui/dialog"; | ||||
| import { ClipboardController } from "@/controllers/clipboard"; | ||||
| import type { BrowserConnectionChange } from "@/features/browser-profiles/profile-browser"; | ||||
| import { pageNav } from "@/layouts/pageHeader"; | ||||
| import { isApiError } from "@/utils/api"; | ||||
| @ -432,12 +433,19 @@ export class BrowserProfilesDetail extends BtrixElement { | ||||
|             ${msg("Duplicate Profile")} | ||||
|           </sl-menu-item> | ||||
|           <sl-divider></sl-divider> | ||||
|           <sl-menu-item | ||||
|             @click=${() => ClipboardController.copyToClipboard(this.profileId)} | ||||
|           > | ||||
|             <sl-icon name="copy" slot="prefix"></sl-icon> | ||||
|             ${msg("Copy Profile ID")} | ||||
|           </sl-menu-item> | ||||
|           <sl-divider></sl-divider> | ||||
|           <sl-menu-item | ||||
|             style="--sl-color-neutral-700: var(--danger)" | ||||
|             @click=${() => void this.deleteProfile()} | ||||
|           > | ||||
|             <sl-icon slot="prefix" name="trash3"></sl-icon> | ||||
|             ${msg("Delete")} | ||||
|             ${msg("Delete Profile")} | ||||
|           </sl-menu-item> | ||||
|         </sl-menu> | ||||
|       </sl-dropdown> | ||||
|  | ||||
| @ -15,6 +15,7 @@ import { | ||||
|   SortDirection, | ||||
|   type SortValues, | ||||
| } from "@/components/ui/table/table-header-cell"; | ||||
| import { ClipboardController } from "@/controllers/clipboard"; | ||||
| import { pageHeader } from "@/layouts/pageHeader"; | ||||
| import type { | ||||
|   APIPaginatedList, | ||||
| @ -325,6 +326,14 @@ export class BrowserProfilesList extends BtrixElement { | ||||
|             <sl-icon slot="prefix" name="files"></sl-icon> | ||||
|             ${msg("Duplicate Profile")} | ||||
|           </sl-menu-item> | ||||
|           <sl-divider></sl-divider> | ||||
|           <sl-menu-item | ||||
|             @click=${() => ClipboardController.copyToClipboard(data.id)} | ||||
|           > | ||||
|             <sl-icon name="copy" slot="prefix"></sl-icon> | ||||
|             ${msg("Copy Profile ID")} | ||||
|           </sl-menu-item> | ||||
|           <sl-divider></sl-divider> | ||||
|           <sl-menu-item | ||||
|             style="--sl-color-neutral-700: var(--danger)" | ||||
|             @click=${() => { | ||||
| @ -332,7 +341,7 @@ export class BrowserProfilesList extends BtrixElement { | ||||
|             }} | ||||
|           > | ||||
|             <sl-icon slot="prefix" name="trash3"></sl-icon> | ||||
|             ${msg("Delete")} | ||||
|             ${msg("Delete Profile")} | ||||
|           </sl-menu-item> | ||||
|         </sl-menu> | ||||
|       </btrix-overflow-dropdown> | ||||
|  | ||||
| @ -14,6 +14,7 @@ import { BtrixElement } from "@/classes/BtrixElement"; | ||||
| import type { MarkdownEditor } from "@/components/ui/markdown-editor"; | ||||
| import type { PageChangeEvent } from "@/components/ui/pagination"; | ||||
| import { viewStateContext, type ViewStateContext } from "@/context/view-state"; | ||||
| import { ClipboardController } from "@/controllers/clipboard"; | ||||
| import type { EditDialogTab } from "@/features/collections/collection-edit-dialog"; | ||||
| import { collectionShareLink } from "@/features/collections/helpers/share-link"; | ||||
| import { SelectCollectionAccess } from "@/features/collections/select-collection-access"; | ||||
| @ -563,6 +564,16 @@ export class CollectionDetail extends BtrixElement { | ||||
|             )} | ||||
|           </btrix-menu-item-link> | ||||
|           <sl-divider></sl-divider> | ||||
|           <sl-menu-item | ||||
|             @click=${() => | ||||
|               ClipboardController.copyToClipboard( | ||||
|                 this.collection?.id ?? this.collectionId, | ||||
|               )} | ||||
|           > | ||||
|             <sl-icon name="copy" slot="prefix"></sl-icon> | ||||
|             ${msg("Copy Collection ID")} | ||||
|           </sl-menu-item> | ||||
|           <sl-divider></sl-divider> | ||||
|           <sl-menu-item | ||||
|             style="--sl-color-neutral-700: var(--danger)" | ||||
|             @click=${this.confirmDelete} | ||||
| @ -868,6 +879,13 @@ export class CollectionDetail extends BtrixElement { | ||||
|                     <sl-icon name="folder-minus" slot="prefix"></sl-icon> | ||||
|                     ${msg("Remove from Collection")} | ||||
|                   </sl-menu-item> | ||||
|                   <sl-divider></sl-divider> | ||||
|                   <sl-menu-item | ||||
|                     @click=${() => ClipboardController.copyToClipboard(item.id)} | ||||
|                   > | ||||
|                     <sl-icon name="copy" slot="prefix"></sl-icon> | ||||
|                     ${msg("Copy Item ID")} | ||||
|                   </sl-menu-item> | ||||
|                 </sl-menu> | ||||
|               </btrix-overflow-dropdown> | ||||
|             </btrix-table-cell> | ||||
|  | ||||
| @ -585,12 +585,10 @@ export class CollectionsList extends BtrixElement { | ||||
|             <sl-icon name="gear" slot="prefix"></sl-icon> | ||||
|             ${msg("Edit Collection Settings")} | ||||
|           </sl-menu-item> | ||||
|           <sl-divider></sl-divider> | ||||
|           ${col.access === CollectionAccess.Public || | ||||
|           col.access === CollectionAccess.Unlisted | ||||
|             ? html` | ||||
|                 <sl-menu-item | ||||
|                   style="--sl-color-neutral-700: var(--success)" | ||||
|                   @click=${() => { | ||||
|                     ClipboardController.copyToClipboard(this.getShareLink(col)); | ||||
|                     this.notify.toast({ | ||||
| @ -605,14 +603,14 @@ export class CollectionsList extends BtrixElement { | ||||
|                 </sl-menu-item> | ||||
|               ` | ||||
|             : nothing} | ||||
| 
 | ||||
|           <sl-divider></sl-divider> | ||||
|           <btrix-menu-item-link | ||||
|             href=${`/api/orgs/${this.orgId}/collections/${col.id}/download?auth_bearer=${authToken}`} | ||||
|             download | ||||
|             ?disabled=${!col.totalSize} | ||||
|           > | ||||
|             <sl-icon name="cloud-download" slot="prefix"></sl-icon> | ||||
|             ${msg("Download")} | ||||
|             ${msg("Download Collection")} | ||||
|             <btrix-badge | ||||
|               slot="suffix" | ||||
|               class="font-monostyle text-xs text-neutral-500" | ||||
| @ -620,6 +618,13 @@ export class CollectionsList extends BtrixElement { | ||||
|             > | ||||
|           </btrix-menu-item-link> | ||||
|           <sl-divider></sl-divider> | ||||
|           <sl-menu-item | ||||
|             @click=${() => ClipboardController.copyToClipboard(col.id)} | ||||
|           > | ||||
|             <sl-icon name="copy" slot="prefix"></sl-icon> | ||||
|             ${msg("Copy Collection ID")} | ||||
|           </sl-menu-item> | ||||
|           <sl-divider></sl-divider> | ||||
|           <sl-menu-item | ||||
|             style="--sl-color-neutral-700: var(--danger)" | ||||
|             @click=${() => void this.manageCollection(col, "delete")} | ||||
|  | ||||
| @ -744,6 +744,14 @@ export class WorkflowDetail extends BtrixElement { | ||||
|             <sl-icon name="gear" slot="prefix"></sl-icon> | ||||
|             ${msg("Edit Workflow Settings")} | ||||
|           </sl-menu-item> | ||||
|           <sl-menu-item | ||||
|             ?disabled=${archivingDisabled} | ||||
|             @click=${() => void this.duplicateConfig()} | ||||
|           > | ||||
|             <sl-icon name="files" slot="prefix"></sl-icon> | ||||
|             ${msg("Duplicate Workflow")} | ||||
|           </sl-menu-item> | ||||
|           <sl-divider></sl-divider> | ||||
|           <sl-menu-item | ||||
|             @click=${() => | ||||
|               ClipboardController.copyToClipboard(workflow.tags.join(", "))} | ||||
| @ -753,11 +761,10 @@ export class WorkflowDetail extends BtrixElement { | ||||
|             ${msg("Copy Tags")} | ||||
|           </sl-menu-item> | ||||
|           <sl-menu-item | ||||
|             ?disabled=${archivingDisabled} | ||||
|             @click=${() => void this.duplicateConfig()} | ||||
|             @click=${() => ClipboardController.copyToClipboard(workflow.id)} | ||||
|           > | ||||
|             <sl-icon name="files" slot="prefix"></sl-icon> | ||||
|             ${msg("Duplicate Workflow")} | ||||
|             <sl-icon name="copy" slot="prefix"></sl-icon> | ||||
|             ${msg("Copy Workflow ID")} | ||||
|           </sl-menu-item> | ||||
|           ${when( | ||||
|             !workflow.crawlCount, | ||||
| @ -925,10 +932,18 @@ export class WorkflowDetail extends BtrixElement { | ||||
|                     )} | ||||
|                     .crawl=${crawl} | ||||
|                   > | ||||
|                     <sl-menu slot="menu"> | ||||
|                       <sl-menu-item | ||||
|                         @click=${() => | ||||
|                           ClipboardController.copyToClipboard(crawl.id)} | ||||
|                       > | ||||
|                         <sl-icon name="copy" slot="prefix"></sl-icon> | ||||
|                         ${msg("Copy Crawl ID")} | ||||
|                       </sl-menu-item> | ||||
|                       ${when( | ||||
|                         this.isCrawler, | ||||
|                       () => | ||||
|                         html` <sl-menu slot="menu">
 | ||||
|                         () => html` | ||||
|                           <sl-divider></sl-divider> | ||||
|                           <sl-menu-item | ||||
|                             style="--sl-color-neutral-700: var(--danger)" | ||||
|                             @click=${() => this.confirmDeleteCrawl(crawl)} | ||||
| @ -936,9 +951,10 @@ export class WorkflowDetail extends BtrixElement { | ||||
|                             <sl-icon name="trash3" slot="prefix"></sl-icon> | ||||
|                             ${msg("Delete Crawl")} | ||||
|                           </sl-menu-item> | ||||
|                         </sl-menu>`, | ||||
|                     )}</btrix-crawl-list-item | ||||
|                   >`,
 | ||||
|                         `,
 | ||||
|                       )} | ||||
|                     </sl-menu> | ||||
|                   </btrix-crawl-list-item>`, | ||||
|               ), | ||||
|             )} | ||||
|           </btrix-crawl-list> | ||||
|  | ||||
| @ -613,8 +613,7 @@ export class WorkflowsList extends BtrixElement { | ||||
|       ${when( | ||||
|         this.appState.isCrawler, | ||||
|         () => | ||||
|           html` <sl-divider></sl-divider>
 | ||||
|             <sl-menu-item | ||||
|           html`<sl-menu-item
 | ||||
|             @click=${() => | ||||
|               this.navigate.to( | ||||
|                 `${this.navigate.orgBasePath}/workflows/${workflow.id}?edit`, | ||||
| @ -642,6 +641,13 @@ export class WorkflowsList extends BtrixElement { | ||||
|             <sl-icon name="files" slot="prefix"></sl-icon> | ||||
|             ${msg("Duplicate Workflow")} | ||||
|           </sl-menu-item> | ||||
|           <sl-divider></sl-divider> | ||||
|           <sl-menu-item | ||||
|             @click=${() => ClipboardController.copyToClipboard(workflow.id)} | ||||
|           > | ||||
|             <sl-icon name="copy" slot="prefix"></sl-icon> | ||||
|             ${msg("Copy Workflow ID")} | ||||
|           </sl-menu-item> | ||||
|           ${when( | ||||
|             !workflow.crawlCount, | ||||
|             () => html` | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user