This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

core / web / src / lib / components / repo / pipelines / PipelineToolbar.svelte
2.6 kB 86 lines
1<script module lang="ts"> 2 import { tv } from "tailwind-variants"; 3 4 export const pipelineToolbar = tv({ 5 slots: { 6 // same grid as IssueToolbar: group, search, count. search gets its own row on mobile. 7 root: "grid grid-cols-[auto_1fr_auto] gap-2", 8 search: "col-span-3 sm:col-span-1 sm:col-start-2", 9 group: "sm:row-start-1", 10 count: 11 "col-start-3 row-start-2 flex items-center gap-2 self-center justify-self-end typography-paragraph-small whitespace-nowrap text-foreground-muted sm:row-start-1 md:mr-2.5 md:ml-2", 12 qualifier: "hidden sm:inline" 13 } 14 }); 15</script> 16 17<script lang="ts"> 18 import { page } from "$app/state"; 19 import { resolve } from "$app/paths"; 20 import GitCommitHorizontal from "$icon/git-commit-horizontal"; 21 import GitPullRequest from "$icon/git-pull-request"; 22 import Play from "$icon/play"; 23 import Layers2 from "$icon/layers-2"; 24 import Button from "$lib/components/ui/Button.svelte"; 25 import ButtonGroup, { segmentProps } from "$lib/components/ui/ButtonGroup.svelte"; 26 import type { PipelineFilter } from "./pipeline"; 27 import PipelineSearch from "./PipelineSearch.svelte"; 28 29 interface Props { 30 ownerHandle: string; 31 repoName: string; 32 filter: PipelineFilter; 33 /** how many runs match the tab and query */ 34 total: number; 35 } 36 37 let { ownerHandle, repoName, filter, total }: Props = $props(); 38 39 const base = $derived(`/${ownerHandle}/${repoName}/pipelines`); 40 41 // keep the query when switching tabs 42 const segmentHref = (kind: PipelineFilter) => { 43 const query = page.url.searchParams.get("q"); 44 const suffix = query ? `&q=${encodeURIComponent(query)}` : ""; 45 return resolve(`${base}?trigger=${kind}${suffix}` as "/"); 46 }; 47 48 const classes = pipelineToolbar(); 49</script> 50 51<div class={classes.root()}> 52 <div class={classes.search()}> 53 <PipelineSearch {filter} /> 54 </div> 55 56 <ButtonGroup class={classes.group()}> 57 <!-- no manual segment: the appview only filters push and pull request --> 58 <Button size="sm" href={segmentHref("all")} {...segmentProps(filter === "all")} icon={Layers2}> 59 All 60 </Button> 61 <Button 62 size="sm" 63 href={segmentHref("push")} 64 {...segmentProps(filter === "push")} 65 icon={GitCommitHorizontal} 66 > 67 Push 68 </Button> 69 <Button 70 size="sm" 71 href={segmentHref("pull_request")} 72 {...segmentProps(filter === "pull_request")} 73 icon={GitPullRequest} 74 > 75 <!-- nbsp: a plain space between the spans gets collapsed away --> 76 <span>Pull<span class={classes.qualifier()}>&nbsp;request</span></span> 77 </Button> 78 </ButtonGroup> 79 80 {#if total > 0} 81 <span class={classes.count()}> 82 <Play /> 83 {total} pipeline {total === 1 ? "run" : "runs"} 84 </span> 85 {/if} 86</div>