@chisquare-tech/origine-ngx-apps-code 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"chisquare-tech-origine-ngx-apps-code.mjs","sources":["../../../projects/code/src/lib/host.ts","../../../projects/code/src/lib/code.api.ts","../../../projects/code/src/lib/look.ts","../../../projects/code/src/lib/repo-base.ts","../../../projects/code/src/lib/diff.view.ts","../../../projects/code/src/lib/repos.page.ts","../../../projects/code/src/lib/repo.page.ts","../../../projects/code/src/lib/commit.box.ts","../../../projects/code/src/lib/file.page.ts","../../../projects/code/src/lib/history.pages.ts","../../../projects/code/src/lib/pulls.page.ts","../../../projects/code/src/lib/pull.page.ts","../../../projects/code/src/lib/settings.page.ts","../../../projects/code/src/lib/releases.page.ts","../../../projects/code/src/lib/new-file.page.ts","../../../projects/code/src/public-api.ts","../../../projects/code/src/chisquare-tech-origine-ngx-apps-code.ts"],"sourcesContent":["import { Signal } from '@angular/core';\n\n/** A person in the organization, as the host knows them (identity's members). */\nexport interface CodePerson {\n id: string;\n name: string;\n email?: string;\n}\n\n/** The project the screens are on. */\nexport interface CodeProject {\n id: string;\n key: string;\n name: string;\n /** The caller's capabilities on the project: code.write, protection.manage, resources.manage… */\n capabilities: string[];\n archivedAt?: string;\n}\n\n/**\n * What the Code screens need from the app that mounts them (cloud/web provides it, as it provides\n * DesignHost): where the person is, who is in the organization, and links inside the project.\n */\nexport abstract class CodeHost {\n abstract readonly project: Signal<CodeProject | null>;\n abstract readonly projectLoaded: Signal<boolean>;\n abstract readonly people: Signal<CodePerson[]>;\n abstract meId(): string;\n /** A router link to a path inside the current project ('' is its overview). */\n abstract link(path?: string): string[];\n}\n","import { Injectable, inject } from '@angular/core';\nimport { ApiService } from '@thescaffold/ngx-core';\nimport { Observable, map } from 'rxjs';\n\n// The code app's API (gox-apps/libs/code, mounted at /api/v1/code). Shapes mirror the Go JSON.\n\nexport interface Repo {\n projectId: string;\n projectKey: string;\n name: string;\n slug: string;\n description: string;\n visibility: 'private' | 'internal';\n defaultBranch: string;\n mergeMethods: string[];\n deleteBranchOnMerge: boolean;\n archivedAt?: string;\n createdBy: string;\n pushedAt?: string;\n sizeBytes: number;\n importState?: string;\n importSource?: string;\n importError?: string;\n cloneHttps: string;\n cloneSsh: string;\n empty: boolean;\n capabilities: string[];\n readOnly?: boolean;\n /** The caller's collaborator permission on this repository (read, write or maintain), if any. */\n collaborator?: string;\n createdAt?: string;\n}\n\nexport interface GitPerson {\n name: string;\n email: string;\n when: string;\n}\n\nexport interface Commit {\n oid: string;\n short: string;\n subject: string;\n body?: string;\n author: GitPerson;\n committer: GitPerson;\n parents: string[];\n keys: string[];\n}\n\nexport interface FileChange {\n status: string;\n path: string;\n oldPath?: string;\n additions: number;\n deletions: number;\n binary: boolean;\n}\n\nexport interface CommitDetail extends Commit {\n files: FileChange[];\n additions: number;\n deletions: number;\n}\n\nexport interface DiffLine {\n kind: 'context' | 'add' | 'delete';\n old?: number;\n new?: number;\n text: string;\n html: string;\n}\n\nexport interface DiffHunk {\n header: string;\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n lines: DiffLine[];\n}\n\nexport interface FileDiff {\n path: string;\n binary: boolean;\n truncated: boolean;\n hunks: DiffHunk[];\n}\n\nexport interface Comparison {\n base: string;\n head: string;\n mergeBase: string;\n ahead: number;\n behind: number;\n commits: Commit[];\n files: FileChange[];\n}\n\nexport interface Entry {\n name: string;\n path: string;\n type: 'tree' | 'blob' | 'commit';\n size?: number;\n lastCommit?: Commit;\n}\n\nexport interface Tree {\n ref: string;\n commit: string;\n path: string;\n entries: Entry[];\n lastCommit?: Commit;\n readme?: { path: string; html: string };\n}\n\nexport interface Blob {\n ref: string;\n commit: string;\n path: string;\n name: string;\n oid: string;\n size: number;\n language?: string;\n binary: boolean;\n image: boolean;\n truncated: boolean;\n lineCount: number;\n lines: string[];\n markdown?: string;\n rawUrl?: string;\n downloadUrl?: string;\n lastCommit?: Commit;\n /** The file as it is (asked for by the editor; UTF-8 text shown in full). */\n text?: string;\n}\n\nexport interface CommitRequest {\n branch: string;\n from?: string;\n expect?: string;\n files?: Record<string, string>;\n uploads?: Record<string, string>;\n deletes?: string[];\n pull?: { title?: string; body?: string };\n message: string;\n}\n\nexport interface CommitResult {\n branch: string;\n commit: Commit;\n created: boolean;\n pull?: number;\n}\n\nexport interface BlameHunk {\n commit: string;\n author: string;\n when: string;\n summary: string;\n startLine: number;\n lines: number;\n}\n\nexport interface Language {\n name: string;\n bytes: number;\n percent: number;\n}\n\nexport interface Ref {\n name: string;\n kind: 'branch' | 'tag';\n commit?: Commit;\n default?: boolean;\n protected?: boolean;\n rule?: string;\n ahead: number;\n behind: number;\n merged: boolean;\n canDelete: boolean;\n}\n\n/** A repository collaborator (DEV-06): access beyond the project role, for one repository. */\nexport interface Collaborator {\n repoId: string;\n userId: string;\n permission: 'read' | 'write' | 'maintain';\n projectRole: string;\n addedBy: string;\n createdAt: string;\n}\n\n/** A file on a release (DEV-15). */\nexport interface ReleaseAsset {\n id: string;\n releaseId: string;\n name: string;\n size: number;\n mediaType: string;\n createdBy: string;\n createdAt: string;\n}\n\n/** A release: a tag with a title, Markdown notes and files; a draft until published. */\nexport interface Release {\n id: string;\n repoId: string;\n tag: string;\n targetSha: string;\n short: string;\n title: string;\n notes: string;\n draft: boolean;\n prerelease: boolean;\n latest: boolean;\n createdBy: string;\n createdAt: string;\n publishedAt: string | null;\n version: number;\n assets: ReleaseAsset[];\n}\n\nexport interface ReleaseInput {\n tag?: string;\n target?: string;\n title?: string;\n notes?: string;\n draft?: boolean;\n prerelease?: boolean;\n version?: number;\n}\n\nexport interface Protection {\n id: string;\n repoId: string;\n pattern: string;\n blockDirectPush: boolean;\n blockForcePush: boolean;\n blockDeletion: boolean;\n requiredApprovals: number;\n dismissStaleApprovals: boolean;\n requireUpToDate: boolean;\n requireCodeOwnerReview?: boolean;\n requiredChecks: string[];\n}\n\nexport interface PullBrief {\n number: number;\n title: string;\n state: 'open' | 'closed' | 'merged';\n draft: boolean;\n authorId: string;\n source: string;\n target: string;\n labels: string[];\n review: string;\n checks: string;\n comments: number;\n keys: string[];\n updatedAt?: string;\n createdAt?: string;\n}\n\nexport interface GateRow {\n text: string;\n meta?: string;\n status: string;\n blocking: boolean;\n users?: string[];\n}\n\nexport interface Gate {\n mergeable: boolean;\n title: string;\n reasons: string[];\n rows: GateRow[];\n conflicts?: string[];\n}\n\nexport interface ReviewBrief {\n authorId: string;\n state: string;\n commitSha: string;\n stale: boolean;\n at: string;\n}\n\nexport interface CheckStatus {\n id: string;\n sha: string;\n context: string;\n state: string;\n url?: string;\n description?: string;\n}\n\nexport interface Pull {\n number: number;\n title: string;\n body: string;\n authorId: string;\n source: string;\n target: string;\n headSha: string;\n state: 'open' | 'closed' | 'merged';\n draft: boolean;\n labels: string[];\n reviewers: string[];\n assignees: string[];\n keys: string[];\n mergeBase: string;\n targetSha: string;\n commits: number;\n gate: Gate;\n reviews: ReviewBrief[];\n checks: CheckStatus[];\n mergeMethods: string[];\n deleteBranchOnMerge: boolean;\n canMerge: boolean;\n canReview: boolean;\n canEdit: boolean;\n sourceDeleted: boolean;\n mergedSha?: string;\n mergedBy?: string;\n mergeMethod?: string;\n mergedAt?: string;\n closedAt?: string;\n createdAt: string;\n updatedAt?: string;\n version: number;\n}\n\nexport interface PRComment {\n id: string;\n threadId?: string;\n reviewId?: string;\n authorId: string;\n body: string;\n pending: boolean;\n createdAt: string;\n editedAt?: string;\n /** The commit that applied this comment's suggested change. */\n appliedSha?: string;\n}\n\nexport interface Review {\n id: string;\n authorId: string;\n state: string;\n body: string;\n commitSha: string;\n createdAt: string;\n submittedAt?: string;\n}\n\nexport interface Thread {\n id: string;\n path: string;\n side: 'old' | 'new';\n line: number;\n startLine: number;\n commitSha: string;\n outdated: boolean;\n resolved: boolean;\n resolvedBy?: string;\n createdBy: string;\n createdAt: string;\n comments: PRComment[];\n}\n\nexport interface Timeline {\n comments: PRComment[];\n reviews: Review[];\n threads: Thread[];\n}\n\nexport interface NewComment {\n body: string;\n path?: string;\n side?: 'old' | 'new';\n line?: number;\n startLine?: number;\n threadId?: string;\n pending?: boolean;\n}\n\nconst C = 'v1/code';\nconst enc = encodeURIComponent;\nconst data = <T>(r: any): T => r?.data as T;\n\nexport function apiMessage(err: any, fallback = 'Something went wrong. Try again.'): string {\n return err?.error?.message || err?.body?.message || err?.message || fallback;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CodeApi {\n private readonly api = inject(ApiService);\n\n private repoPath(project: string, name: string) {\n return `${C}/project/${enc(project)}/repo/${enc(name)}`;\n }\n\n repos(project: string): Observable<Repo[]> {\n return this.api.get(`${C}/project/${enc(project)}/repo`).pipe(map((r) => data<Repo[]>(r) ?? []));\n }\n\n create(project: string, body: { name: string; description?: string; visibility?: string; defaultBranch?: string; readme?: boolean; gitignore?: string; licence?: string }): Observable<Repo> {\n return this.api.post(`${C}/project/${enc(project)}/repo`, body).pipe(map((r) => data<Repo>(r)));\n }\n\n import(project: string, body: { name: string; url: string; username?: string; token?: string; description?: string; visibility?: string }): Observable<Repo> {\n return this.api.post(`${C}/project/${enc(project)}/repo/import`, body).pipe(map((r) => data<Repo>(r)));\n }\n\n repo(project: string, name: string): Observable<Repo> {\n return this.api.get(this.repoPath(project, name)).pipe(map((r) => data<Repo>(r)));\n }\n\n update(project: string, name: string, body: Partial<{ name: string; description: string; visibility: string; defaultBranch: string; mergeMethods: string[]; deleteBranchOnMerge: boolean }>): Observable<Repo> {\n return this.api.patch(this.repoPath(project, name), body).pipe(map((r) => data<Repo>(r)));\n }\n\n remove(project: string, name: string): Observable<unknown> {\n return this.api.delete(`${this.repoPath(project, name)}?confirm=${enc(name)}`);\n }\n\n setArchived(project: string, name: string, on: boolean): Observable<Repo> {\n return this.api.post(`${this.repoPath(project, name)}/${on ? 'archive' : 'unarchive'}`, {}).pipe(map((r) => data<Repo>(r)));\n }\n\n protections(project: string, name: string): Observable<Protection[]> {\n return this.api.get(`${this.repoPath(project, name)}/protection`).pipe(map((r) => data<Protection[]>(r) ?? []));\n }\n\n addProtection(project: string, name: string, p: Partial<Protection>): Observable<Protection> {\n return this.api.post(`${this.repoPath(project, name)}/protection`, p).pipe(map((r) => data<Protection>(r)));\n }\n\n updateProtection(project: string, name: string, id: string, p: Partial<Protection>): Observable<Protection> {\n return this.api.patch(`${this.repoPath(project, name)}/protection/${enc(id)}`, p).pipe(map((r) => data<Protection>(r)));\n }\n\n removeProtection(project: string, name: string, id: string): Observable<unknown> {\n return this.api.delete(`${this.repoPath(project, name)}/protection/${enc(id)}`);\n }\n\n tree(project: string, name: string, ref: string, path: string): Observable<Tree> {\n return this.api.get(`${this.repoPath(project, name)}/tree`, { ref, path }).pipe(map((r) => data<Tree>(r)));\n }\n\n blob(project: string, name: string, ref: string, path: string, withText = false): Observable<Blob> {\n const p: Record<string, string> = { ref, path };\n if (withText) p['format'] = 'text';\n return this.api.get(`${this.repoPath(project, name)}/blob`, p).pipe(map((r) => data<Blob>(r)));\n }\n\n /** A commit from the browser (DEV-13): files, base64 uploads and deletes; from a new branch it can open a pull request. */\n commitFiles(project: string, name: string, body: CommitRequest): Observable<CommitResult> {\n return this.api.post(`${this.repoPath(project, name)}/commits`, body).pipe(map((r) => data<CommitResult>(r)));\n }\n\n blame(project: string, name: string, ref: string, path: string): Observable<BlameHunk[]> {\n return this.api.get(`${this.repoPath(project, name)}/blame`, { ref, path }).pipe(map((r) => data<BlameHunk[]>(r) ?? []));\n }\n\n files(project: string, name: string, ref: string): Observable<{ files: string[]; truncated: boolean }> {\n return this.api.get(`${this.repoPath(project, name)}/files`, { ref }).pipe(map((r) => data<{ files: string[]; truncated: boolean }>(r) ?? { files: [], truncated: false }));\n }\n\n languages(project: string, name: string, ref: string): Observable<Language[]> {\n return this.api.get(`${this.repoPath(project, name)}/languages`, { ref }).pipe(map((r) => data<Language[]>(r) ?? []));\n }\n\n archiveUrl(project: string, name: string, ref: string, format: 'zip' | 'tar.gz'): Observable<string> {\n return this.api.get(`${this.repoPath(project, name)}/archive`, { ref, format }).pipe(map((r) => data<{ url: string }>(r)?.url ?? ''));\n }\n\n commits(project: string, name: string, q: { ref?: string; path?: string; limit?: number; skip?: number }): Observable<Commit[]> {\n const p: Record<string, string> = {};\n if (q.ref) p['ref'] = q.ref;\n if (q.path) p['path'] = q.path;\n if (q.limit) p['limit'] = String(q.limit);\n if (q.skip) p['skip'] = String(q.skip);\n return this.api.get(`${this.repoPath(project, name)}/commits`, p).pipe(map((r) => data<Commit[]>(r) ?? []));\n }\n\n commit(project: string, name: string, sha: string): Observable<CommitDetail> {\n return this.api.get(`${this.repoPath(project, name)}/commit/${enc(sha)}`).pipe(map((r) => data<CommitDetail>(r)));\n }\n\n /** One file's hunks from base to head (\"\" base: the head's first parent). */\n diff(project: string, name: string, head: string, path: string, base = '', opts: { context?: number; ignoreSpace?: boolean } = {}): Observable<FileDiff> {\n const p: Record<string, string> = { head, path };\n if (base) p['base'] = base;\n if (opts.context) p['context'] = String(opts.context);\n if (opts.ignoreSpace) p['w'] = 'ignore';\n return this.api.get(`${this.repoPath(project, name)}/diff`, p).pipe(map((r) => data<FileDiff>(r)));\n }\n\n compare(project: string, name: string, base: string, head: string): Observable<Comparison> {\n return this.api.get(`${this.repoPath(project, name)}/compare`, { base, head }).pipe(map((r) => data<Comparison>(r)));\n }\n\n refs(project: string, name: string, kind: 'branch' | 'tag' = 'branch', q = ''): Observable<Ref[]> {\n const p: Record<string, string> = { kind };\n if (q) p['q'] = q;\n return this.api.get(`${this.repoPath(project, name)}/refs`, p).pipe(map((r) => data<Ref[]>(r) ?? []));\n }\n\n collaborators(project: string, name: string): Observable<Collaborator[]> {\n return this.api.get(`${this.repoPath(project, name)}/collaborators`).pipe(map((r) => data<Collaborator[]>(r) ?? []));\n }\n\n setCollaborator(project: string, name: string, userId: string, permission: string): Observable<Collaborator> {\n return this.api.put(`${this.repoPath(project, name)}/collaborators/${enc(userId)}`, { permission }).pipe(map((r) => data<Collaborator>(r)));\n }\n\n removeCollaborator(project: string, name: string, userId: string): Observable<unknown> {\n return this.api.delete(`${this.repoPath(project, name)}/collaborators/${enc(userId)}`);\n }\n\n createTag(project: string, name: string, tag: string, target: string): Observable<Ref> {\n return this.api.post(`${this.repoPath(project, name)}/tags`, { tag, target }).pipe(map((r) => data<Ref>(r)));\n }\n\n deleteTag(project: string, name: string, tag: string): Observable<unknown> {\n return this.api.delete(`${this.repoPath(project, name)}/tags/${enc(tag)}`);\n }\n\n releases(project: string, name: string): Observable<Release[]> {\n return this.api.get(`${this.repoPath(project, name)}/releases`).pipe(map((r) => data<Release[]>(r) ?? []));\n }\n\n createRelease(project: string, name: string, r: ReleaseInput): Observable<Release> {\n return this.api.post(`${this.repoPath(project, name)}/releases`, r).pipe(map((x) => data<Release>(x)));\n }\n\n updateRelease(project: string, name: string, id: string, r: ReleaseInput): Observable<Release> {\n return this.api.patch(`${this.repoPath(project, name)}/releases/${enc(id)}`, r).pipe(map((x) => data<Release>(x)));\n }\n\n deleteRelease(project: string, name: string, id: string, deleteTag: boolean): Observable<unknown> {\n return this.api.delete(`${this.repoPath(project, name)}/releases/${enc(id)}${deleteTag ? '?deleteTag=true' : ''}`);\n }\n\n /** Notes drafted from the done issues and merged pull requests since the previous release. */\n releaseNotes(project: string, name: string, target: string, tag = ''): Observable<string> {\n return this.api.post(`${this.repoPath(project, name)}/releases/notes`, { target, tag: tag || undefined }).pipe(map((r) => data<{ notes: string }>(r)?.notes ?? ''));\n }\n\n addAsset(project: string, name: string, id: string, file: File): Observable<ReleaseAsset> {\n return this.api\n .post(`${this.repoPath(project, name)}/releases/${enc(id)}/assets?filename=${encodeURIComponent(file.name)}`, null, {\n body: file, headers: { 'Content-Type': file.type || 'application/octet-stream' },\n })\n .pipe(map((r) => data<ReleaseAsset>(r)));\n }\n\n /** A release file's bytes (the download needs the session, so no plain link works). */\n assetBlob(project: string, name: string, id: string, asset: string): Observable<globalThis.Blob> {\n return this.api.get(`${this.repoPath(project, name)}/releases/${enc(id)}/assets/${enc(asset)}`, null, { responseType: 'blob' }).pipe(map((b: unknown) => b as globalThis.Blob));\n }\n\n deleteAsset(project: string, name: string, id: string, asset: string): Observable<unknown> {\n return this.api.delete(`${this.repoPath(project, name)}/releases/${enc(id)}/assets/${enc(asset)}`);\n }\n\n createBranch(project: string, name: string, branch: string, from: string): Observable<unknown> {\n return this.api.post(`${this.repoPath(project, name)}/branches`, { name: branch, from });\n }\n\n deleteBranch(project: string, name: string, branch: string): Observable<unknown> {\n return this.api.delete(`${this.repoPath(project, name)}/branches?branch=${enc(branch)}`);\n }\n\n deleteMerged(project: string, name: string): Observable<{ deleted?: string[] } | unknown> {\n return this.api.post(`${this.repoPath(project, name)}/branches/delete-merged`, {}).pipe(map((r) => data<any>(r)));\n }\n\n pulls(project: string, name: string, q: { state?: string; author?: string; reviewer?: string; needsMyReview?: boolean; label?: string; q?: string } = {}): Observable<PullBrief[]> {\n const p: Record<string, string> = {};\n for (const [k, v] of Object.entries(q)) if (v !== undefined && v !== '' && v !== false) p[k] = String(v);\n return this.api.get(`${this.repoPath(project, name)}/pulls`, p).pipe(map((r) => data<PullBrief[]>(r) ?? []));\n }\n\n template(project: string, name: string, target: string): Observable<string> {\n return this.api.get(`${this.repoPath(project, name)}/pull-template`, { target }).pipe(map((r) => {\n const d = data<any>(r);\n return typeof d === 'string' ? d : d?.body ?? '';\n }));\n }\n\n openPull(project: string, name: string, body: { source: string; target: string; title: string; body?: string; draft?: boolean; reviewers?: string[]; labels?: string[] }): Observable<Pull> {\n return this.api.post(`${this.repoPath(project, name)}/pulls`, body).pipe(map((r) => data<Pull>(r)));\n }\n\n pull(project: string, name: string, n: number): Observable<Pull> {\n return this.api.get(`${this.repoPath(project, name)}/pulls/${n}`).pipe(map((r) => data<Pull>(r)));\n }\n\n updatePull(project: string, name: string, n: number, body: Partial<{ title: string; body: string; draft: boolean; target: string; reviewers: string[]; assignees: string[]; labels: string[] }>): Observable<Pull> {\n return this.api.patch(`${this.repoPath(project, name)}/pulls/${n}`, body).pipe(map((r) => data<Pull>(r)));\n }\n\n closePull(project: string, name: string, n: number, reopen = false): Observable<Pull> {\n return this.api.post(`${this.repoPath(project, name)}/pulls/${n}/${reopen ? 'reopen' : 'close'}`, {}).pipe(map((r) => data<Pull>(r)));\n }\n\n merge(project: string, name: string, n: number, body: { method: string; message?: string; deleteBranch?: boolean; expectHead?: string }): Observable<Pull> {\n return this.api.post(`${this.repoPath(project, name)}/pulls/${n}/merge`, body).pipe(map((r) => data<Pull>(r)));\n }\n\n conversation(project: string, name: string, n: number): Observable<Timeline> {\n return this.api.get(`${this.repoPath(project, name)}/pulls/${n}/conversation`).pipe(map((r) => data<Timeline>(r) ?? { comments: [], reviews: [], threads: [] }));\n }\n\n comment(project: string, name: string, n: number, c: NewComment): Observable<PRComment> {\n return this.api.post(`${this.repoPath(project, name)}/pulls/${n}/comments`, c).pipe(map((r) => data<PRComment>(r)));\n }\n\n /** Commits suggested changes of line comments onto the pull request's branch (DEV-20). */\n applySuggestions(project: string, name: string, n: number, comments: string[], message = ''): Observable<CommitResult> {\n return this.api.post(`${this.repoPath(project, name)}/pulls/${n}/suggestions`, { comments, message }).pipe(map((r) => data<CommitResult>(r)));\n }\n\n /** Discards one of the caller's pending review comments. */\n discardComment(project: string, name: string, n: number, id: string): Observable<unknown> {\n return this.api.delete(`${this.repoPath(project, name)}/pulls/${n}/comments/${enc(id)}`);\n }\n\n review(project: string, name: string, n: number, state: 'commented' | 'approved' | 'changes_requested', body = ''): Observable<Review> {\n return this.api.post(`${this.repoPath(project, name)}/pulls/${n}/reviews`, { state, body }).pipe(map((r) => data<Review>(r)));\n }\n\n resolve(project: string, name: string, n: number, thread: string, on: boolean): Observable<unknown> {\n return this.api.post(`${this.repoPath(project, name)}/pulls/${n}/threads/${enc(thread)}/${on ? 'resolve' : 'unresolve'}`, {});\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CodePerson } from './host';\n\n// Small helpers the Code screens share.\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nexport function shortDate(d?: string): string {\n if (!d) return '';\n const t = new Date(d);\n return Number.isNaN(t.getTime()) ? '' : `${MONTHS[t.getMonth()]} ${t.getDate()}`;\n}\n\n/** \"Nov 7, 2026\" for a day heading. */\nexport function dayLabel(d?: string): string {\n if (!d) return '';\n const t = new Date(d);\n return Number.isNaN(t.getTime()) ? '' : `${MONTHS[t.getMonth()]} ${t.getDate()}, ${t.getFullYear()}`;\n}\n\nexport function ago(iso?: string, now = Date.now()): string {\n if (!iso) return '';\n const t = Date.parse(iso);\n if (Number.isNaN(t)) return '';\n const s = Math.max(0, Math.round((now - t) / 1000));\n if (s < 60) return 'just now';\n if (s < 3600) return `${Math.floor(s / 60)} min ago`;\n if (s < 86400) return `${Math.floor(s / 3600)} h ago`;\n if (s < 172800) return 'Yesterday';\n return shortDate(iso);\n}\n\nexport function initials(name: string): string {\n const w = (name || '').split(/[\\s@._-]+/).filter(Boolean);\n return ((w[0]?.[0] ?? '?') + (w[1]?.[0] ?? '')).toUpperCase();\n}\n\nexport function size(bytes?: number): string {\n if (!bytes) return '0 B';\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n}\n\n/** Names and initials by user id, from the host's people. */\nexport class People {\n private readonly byId: Map<string, CodePerson>;\n constructor(people: CodePerson[]) {\n this.byId = new Map(people.map((p) => [p.id, p]));\n }\n name(id?: string | null): string {\n if (!id) return 'Someone';\n return this.byId.get(id)?.name || this.byId.get(id)?.email || 'Someone';\n }\n initials(id?: string | null): string {\n return initials(this.name(id));\n }\n}\n\nconst LANG_COLOURS = ['var(--o-acc)', 'var(--o-ok)', 'var(--o-run)', 'var(--o-vio)', 'var(--o-bad-solid)', 'var(--o-line-mid)'];\nexport function langColour(i: number): string {\n return LANG_COLOURS[Math.min(i, LANG_COLOURS.length - 1)];\n}\n\n/** The state of checks as a dot class: success green, failure red, pending amber, none grey. */\nexport function checkDot(state: string): string {\n return state === 'success' ? 'o-dot o-grn' : state === 'failure' || state === 'error' ? 'o-dot o-red' : state === 'pending' ? 'o-dot o-amb' : 'o-dot o-gry';\n}\n\nexport function copy(text: string): Promise<void> {\n return navigator.clipboard?.writeText(text) ?? Promise.resolve();\n}\n\n/**\n * The repository the person was last in, per project, so the project-level tabs (Files, Commits,\n * Branches, Settings) open it. Browser storage is a convenience: without it the first repository is used.\n */\n@Injectable({ providedIn: 'root' })\nexport class CurrentRepo {\n get(project: string): string {\n try {\n return localStorage.getItem(`origine.code.repo.${project}`) ?? '';\n } catch {\n return '';\n }\n }\n set(project: string, repo: string) {\n try {\n localStorage.setItem(`origine.code.repo.${project}`, repo);\n } catch {\n /* storage blocked: the first repository is used */\n }\n }\n}\n\n/**\n * Highlighted code from the server: spans with Chroma's short token classes behind \"tk-\" (tk-k a\n * keyword, tk-s a string…), coloured with the theme's syntax tokens. Server HTML is not under the\n * component's encapsulation, hence ::ng-deep.\n */\nexport const TOKEN_CSS = `\n :host ::ng-deep [class^=\"tk-k\"]{color:var(--o-tk-k)}\n :host ::ng-deep [class^=\"tk-s\"], :host ::ng-deep [class^=\"tk-l\"]{color:var(--o-tk-s)}\n :host ::ng-deep [class^=\"tk-c\"]{color:var(--o-tk-c);font-style:italic}\n :host ::ng-deep [class^=\"tk-m\"]{color:var(--o-tk-n)}\n :host ::ng-deep .tk-nf, :host ::ng-deep .tk-nx, :host ::ng-deep .tk-fm{color:var(--o-tk-f)}\n :host ::ng-deep .tk-nb, :host ::ng-deep .tk-nt, :host ::ng-deep .tk-bp{color:var(--o-tk-p)}\n :host ::ng-deep .tk-gi{color:var(--o-add)} :host ::ng-deep .tk-gd{color:var(--o-bad-tx)}\n`;\n","import { ChangeDetectionStrategy, Component, Directive, ElementRef, HostListener, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute } from '@angular/router';\nimport { CodeApi, Ref, Repo, apiMessage } from './code.api';\nimport { CodeHost } from './host';\nimport { CurrentRepo, People } from './look';\n\n/**\n * What every page under /code/:repo shares: the project, the repository named in the URL (loaded\n * once per name), the person's people and permissions, and an error line. Pages extend it and load\n * their own data in onRepo().\n */\n@Directive()\nexport abstract class RepoPage {\n protected readonly host = inject(CodeHost);\n protected readonly api = inject(CodeApi);\n protected readonly route = inject(ActivatedRoute);\n private readonly current = inject(CurrentRepo);\n\n protected readonly name = signal('');\n protected readonly repo = signal<Repo | null>(null);\n protected readonly error = signal('');\n protected readonly note = signal('');\n protected readonly people = computed(() => new People(this.host.people()));\n protected readonly canWrite = computed(() => !this.repo()?.archivedAt && (this.repo()?.capabilities ?? []).includes('code.write'));\n protected readonly canAdmin = computed(() => (this.repo()?.capabilities ?? []).includes('resources.manage'));\n /** Repository settings short of a rename, the visibility and deletion: Maintainers, and maintain collaborators. */\n protected readonly canMaintain = computed(() => this.canAdmin() || (this.repo()?.capabilities ?? []).includes('repo.maintain'));\n protected readonly canProtect = computed(() => (this.repo()?.capabilities ?? []).includes('protection.manage'));\n\n constructor() {\n this.route.paramMap.subscribe((m) => this.name.set(m.get('repo') ?? ''));\n effect(() => {\n const name = this.name();\n const p = this.host.project();\n if (name && p) untracked(() => this.loadRepo(p.id, name));\n });\n }\n\n /** Called with the repository once it has loaded (and again after it changes). */\n protected abstract onRepo(repo: Repo): void;\n\n protected projectId(): string {\n return this.host.project()?.id ?? '';\n }\n\n protected link(path = ''): string[] {\n return this.host.link(`code/${this.name()}${path ? '/' + path : ''}`);\n }\n\n protected reloadRepo() {\n const p = this.host.project();\n if (p && this.name()) this.loadRepo(p.id, this.name());\n }\n\n private loadRepo(project: string, name: string) {\n this.error.set('');\n this.api.repo(project, name).subscribe({\n next: (r) => {\n this.repo.set(r);\n this.current.set(project, r.name);\n this.onRepo(r);\n },\n error: (e) => this.error.set(e?.status === 404 ? `There is no repository ${name} you can see in this project.` : apiMessage(e, `Could not open ${name}.`)),\n });\n }\n}\n\n// The branch and tag picker (prototype brOpen): a filterable menu of branches, then tags.\n@Component({\n selector: 'o-ref-picker',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`:host{position:relative;display:inline-block}`],\n template: `\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"toggle()\" [attr.aria-expanded]=\"open()\" aria-haspopup=\"menu\" data-testid=\"ref-picker\">\n <span class=\"o-faint\">{{ kindOf() }}</span><b class=\"o-mono\">{{ current() }}</b><span aria-hidden=\"true\">⌄</span>\n </button>\n @if (open()) {\n <div class=\"o-menu\" role=\"menu\" style=\"left:0;top:34px;width:280px;max-height:360px;overflow:auto\">\n <input class=\"o-in o-sm\" placeholder=\"Find a branch or tag\" aria-label=\"Find a branch or tag\" style=\"margin:4px 0 6px\" [ngModel]=\"q()\" (ngModelChange)=\"q.set($event)\" />\n <div class=\"o-lbl\" style=\"padding:4px 10px\">Branches</div>\n @for (b of shown('branch'); track b.name) {\n <button type=\"button\" role=\"menuitem\" (click)=\"pick(b.name)\"><span class=\"o-mono o-sm o-ell\">{{ b.name }}</span>@if (b.name === current()) {<span class=\"o-k o-grn-t\" aria-label=\"current\">✓</span>}</button>\n } @empty {<span class=\"o-faint o-sm\" style=\"padding:4px 10px\">No branches match.</span>}\n @if (shown('tag').length) {\n <div class=\"o-lbl\" style=\"padding:4px 10px\">Tags</div>\n @for (t of shown('tag'); track t.name) {<button type=\"button\" role=\"menuitem\" (click)=\"pick(t.name)\"><span class=\"o-mono o-sm o-ell\">{{ t.name }}</span></button>}\n }\n </div>\n }\n `,\n})\nexport class RefPicker {\n private readonly api = inject(CodeApi);\n private readonly host = inject(CodeHost);\n private readonly el = inject(ElementRef);\n\n readonly repo = input.required<string>();\n readonly current = input.required<string>();\n readonly picked = output<string>();\n\n protected readonly open = signal(false);\n protected readonly q = signal('');\n private readonly refs = signal<Ref[]>([]);\n protected readonly kindOf = computed(() => (this.refs().some((r) => r.kind === 'tag' && r.name === this.current()) ? 'tag' : 'branch'));\n\n protected shown(kind: 'branch' | 'tag') {\n const q = this.q().toLowerCase();\n return this.refs().filter((r) => r.kind === kind && (!q || r.name.toLowerCase().includes(q))).slice(0, 50);\n }\n\n protected toggle() {\n this.open.set(!this.open());\n const p = this.host.project();\n if (this.open() && p) {\n this.api.refs(p.id, this.repo(), 'branch').subscribe({ next: (b) => this.refs.set([...b, ...this.refs().filter((r) => r.kind === 'tag')]), error: () => undefined });\n this.api.refs(p.id, this.repo(), 'tag').subscribe({ next: (t) => this.refs.set([...this.refs().filter((r) => r.kind === 'branch'), ...t]), error: () => undefined });\n }\n }\n\n protected pick(name: string) {\n this.open.set(false);\n this.picked.emit(name);\n }\n\n @HostListener('document:click', ['$event'])\n protected outside(e: MouseEvent) {\n if (this.open() && !this.el.nativeElement.contains(e.target)) this.open.set(false);\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { AfterViewInit, ChangeDetectionStrategy, Component, DestroyRef, ElementRef, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CodeApi, DiffLine, FileChange, FileDiff, Thread, apiMessage } from './code.api';\nimport { CodeHost } from './host';\nimport { People, TOKEN_CSS, ago } from './look';\n\nexport interface LineComment {\n path: string;\n side: 'old' | 'new';\n line: number;\n body: string;\n /** Part of the caller's review, posted when it is submitted. */\n pending: boolean;\n}\n\nexport interface ThreadReply {\n threadId: string;\n body: string;\n}\n\n/** One row of the split view: the old side and the new side. */\nexport interface SplitRow {\n left?: DiffLine;\n right?: DiffLine;\n}\n\n/** Past this many changed lines a file waits for \"Load diff\" (DEV-19 large diffs). */\nconst LARGE = 600;\n/** Context steps for \"Show more context\". */\nconst CONTEXT = [3, 25, 100];\n\n// One file of a diff (prototype prDiffs): its header with +/− and Viewed, the hunks highlighted,\n// unified or split, and, on a pull request, the review threads on its lines and a comment form on\n// any line number (\"Add single comment\" or part of a review). The diff loads when the file scrolls\n// near the screen; a very large one waits to be asked for.\n@Component({\n selector: 'o-diff',\n imports: [FormsModule, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [TOKEN_CSS, `\n .o-ln .o-n{cursor:default;width:44px}\n .o-ln .o-n.cmt{cursor:pointer}\n .o-ln .o-n.cmt:hover{color:var(--o-acc-tx)}\n .hunk{color:var(--o-dim);background:var(--o-well);padding:2px 12px;font-size:11px}\n .split{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr)}\n .split .side-l{border-right:1px solid var(--o-line-soft)}\n .split .full{grid-column:1 / -1}\n .split .o-ln .o-t{white-space:pre-wrap;word-break:break-all}\n .empty-side{background:var(--o-well)}\n .viewed{display:inline-flex;align-items:center;gap:6px}\n .sugg{border:1px solid var(--o-line);border-radius:6px;overflow:hidden;margin-top:2px}\n .sugg-h{display:flex;align-items:center;gap:8px;padding:6px 10px;background:var(--o-well);font-size:12px}\n `],\n template: `\n <div class=\"o-card\" [attr.id]=\"'file-' + file().path\" [attr.data-testid]=\"'diff-' + file().path\">\n <div class=\"o-ch\" style=\"background:var(--o-well)\">\n <button type=\"button\" class=\"o-btn o-ghost o-xs\" (click)=\"toggleOpen()\" [attr.aria-expanded]=\"open()\" [attr.aria-label]=\"(open() ? 'Collapse ' : 'Expand ') + file().path\">{{ open() ? '▾' : '▸' }}</button>\n <span class=\"o-mono o-sm o-ell\">{{ file().oldPath && file().oldPath !== file().path ? file().oldPath + ' → ' : '' }}{{ file().path }}</span>\n <span class=\"o-grn-t o-sm\">+{{ file().additions }}</span><span class=\"o-red-t o-sm\">−{{ file().deletions }}</span>\n @if (threadsHere().length) {<span class=\"o-faint o-sm\">💬 {{ threadsHere().length }}</span>}\n <span class=\"o-r o-flex\" style=\"gap:6px\">\n @if (open() && diff() && context() < 100 && !file().binary) {<button type=\"button\" class=\"o-btn o-xs\" (click)=\"moreContext()\" [attr.aria-label]=\"'Show more context in ' + file().path\">More context</button>}\n <ng-content />\n @if (viewable()) {\n <button type=\"button\" class=\"o-btn o-xs viewed\" role=\"checkbox\" [attr.aria-checked]=\"viewed()\" [attr.aria-label]=\"'Viewed ' + file().path\" (click)=\"viewedChange.emit(!viewed())\"><span class=\"o-cbx\" [class.o-on]=\"viewed()\" style=\"width:12px;height:12px\"></span>Viewed</button>\n }\n </span>\n </div>\n @if (open()) {\n @if (file().binary) {\n <div class=\"o-empty o-sm\">A binary file.</div>\n } @else if (waiting()) {\n <div class=\"o-empty o-sm o-col\" style=\"gap:8px;align-items:center\">\n <span>{{ file().additions + file().deletions }} changed lines.</span>\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"waiting.set(false); load()\">Load diff</button>\n </div>\n } @else if (error()) {\n <div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>\n } @else if (diff(); as d) {\n @if (d.truncated) {<div class=\"o-note\">This diff is too large to show in full.</div>}\n @if (mode() === 'split') {\n <div class=\"o-code split\" style=\"overflow-x:auto\" role=\"table\" [attr.aria-label]=\"'Changes to ' + file().path + ', side by side'\">\n @for (h of d.hunks; track $index; let hi = $index) {\n <div class=\"hunk o-mono full\" role=\"row\">{{ h.header }}</div>\n @for (r of splitRows()[hi]; track $index) {\n @if (r.left; as l) {\n <div class=\"o-ln side-l\" role=\"row\" [class.o-del]=\"l.kind === 'delete'\" [attr.data-testid]=\"'split-old-' + l.old\">\n <span class=\"o-n\" role=\"rowheader\" [class.cmt]=\"canComment()\" (click)=\"startComment(l)\" [attr.title]=\"canComment() ? 'Comment on this line' : null\">{{ l.old }}</span>\n <span class=\"o-sr-only\">{{ l.kind === 'delete' ? 'removed' : '' }}</span>\n <span class=\"o-t\" role=\"cell\" [innerHTML]=\"l.html || l.text\"></span>\n </div>\n } @else {<div class=\"o-ln side-l empty-side\" aria-hidden=\"true\"><span class=\"o-n\"></span><span class=\"o-t\"></span></div>}\n @if (r.right; as l) {\n <div class=\"o-ln\" role=\"row\" [class.o-add]=\"l.kind === 'add'\" [attr.data-testid]=\"'split-new-' + l.new\">\n <span class=\"o-n\" role=\"rowheader\" [class.cmt]=\"canComment()\" (click)=\"startComment(l)\" [attr.title]=\"canComment() ? 'Comment on this line' : null\">{{ l.new }}</span>\n <span class=\"o-sr-only\">{{ l.kind === 'add' ? 'added' : '' }}</span>\n <span class=\"o-t\" role=\"cell\" [innerHTML]=\"l.html || l.text\"></span>\n </div>\n } @else {<div class=\"o-ln empty-side\" aria-hidden=\"true\"><span class=\"o-n\"></span><span class=\"o-t\"></span></div>}\n @for (l of rowLines(r); track $index) {\n @for (t of threadsAt(l); track t.id) {<div class=\"full\"><ng-container *ngTemplateOutlet=\"threadTpl; context: { $implicit: t }\" /></div>}\n @if (drafting() === key(l)) {<div class=\"full\"><ng-container *ngTemplateOutlet=\"draftTpl; context: { $implicit: l }\" /></div>}\n }\n }\n } @empty {<div class=\"o-empty o-sm full\">{{ ignoreSpace() ? 'Only whitespace changed.' : 'No changes to show.' }}</div>}\n </div>\n } @else {\n <div class=\"o-code\" style=\"overflow-x:auto\" role=\"table\" [attr.aria-label]=\"'Changes to ' + file().path\">\n @for (h of d.hunks; track $index) {\n <div class=\"hunk o-mono\" role=\"row\">{{ h.header }}</div>\n @for (l of h.lines; track $index) {\n <div class=\"o-ln\" role=\"row\" [class.o-add]=\"l.kind === 'add'\" [class.o-del]=\"l.kind === 'delete'\">\n <span class=\"o-n\" role=\"rowheader\" [class.cmt]=\"canComment()\" (click)=\"startComment(l)\" [attr.title]=\"canComment() ? 'Comment on this line' : null\">{{ l.kind === 'delete' ? l.old : l.new }}</span>\n <span class=\"o-s\" aria-hidden=\"true\">{{ l.kind === 'add' ? '+' : l.kind === 'delete' ? '−' : ' ' }}</span>\n <span class=\"o-sr-only\">{{ l.kind === 'add' ? 'added' : l.kind === 'delete' ? 'removed' : '' }}</span>\n <span class=\"o-t\" role=\"cell\" [innerHTML]=\"l.html || l.text\"></span>\n </div>\n @for (t of threadsAt(l); track t.id) {<ng-container *ngTemplateOutlet=\"threadTpl; context: { $implicit: t }\" />}\n @if (drafting() === key(l)) {<ng-container *ngTemplateOutlet=\"draftTpl; context: { $implicit: l }\" />}\n }\n } @empty {\n <div class=\"o-empty o-sm\">{{ ignoreSpace() ? 'Only whitespace changed.' : 'No changes to show.' }}</div>\n }\n </div>\n }\n } @else {\n <div class=\"o-empty o-sm\">Loading…</div>\n }\n }\n </div>\n\n <ng-template #threadTpl let-t>\n <div class=\"o-thread\" [attr.data-testid]=\"'thread-' + t.id\">\n <div class=\"o-cb o-col\" style=\"gap:6px;padding:10px 12px\">\n @for (c of t.comments; track c.id) {\n <span class=\"o-sm\"><b>{{ people().name(c.authorId) }}</b><span class=\"o-faint\"> · {{ ago(c.createdAt) }}</span>\n @if (c.pending) {<span class=\"o-chip o-amb\" style=\"margin-left:6px\">Pending</span>\n @if (c.authorId === me()) {<button type=\"button\" class=\"o-lnk\" style=\"margin-left:6px;color:var(--o-mut)\" (click)=\"discard.emit(c.id)\" [attr.aria-label]=\"'Discard pending comment: ' + c.body\">Discard</button>}\n }\n </span>\n @if (suggestionOf(c.body); as sg) {\n @if (sg.before) {<span style=\"white-space:pre-wrap\">{{ sg.before }}</span>}\n <div class=\"sugg\" [attr.data-testid]=\"'suggestion-' + c.id\">\n <div class=\"sugg-h\"><b>Suggested change</b>\n @if (c.appliedSha) {<span class=\"o-chip o-grn\">Applied in {{ c.appliedSha.slice(0, 7) }}</span>}\n @else if (t.outdated) {<span class=\"o-chip\">Outdated</span>}\n @else if (canApply() && !c.pending) {\n <span class=\"o-r o-flex\" style=\"gap:6px\">\n <button type=\"button\" class=\"o-btn o-xs\" (click)=\"batchToggle.emit(c.id)\" [attr.aria-pressed]=\"batch().includes(c.id)\">{{ batch().includes(c.id) ? 'Remove from batch' : 'Add to batch' }}</button>\n <button type=\"button\" class=\"o-btn o-xs o-pri\" (click)=\"apply.emit([c.id])\" data-testid=\"suggestion-apply\">Apply suggestion</button>\n </span>\n }\n </div>\n @for (l of sg.lines; track $index) {<div class=\"o-ln o-add\"><span class=\"o-s\" aria-hidden=\"true\">+</span><span class=\"o-t\">{{ l }}</span></div>}\n @if (!sg.lines.length) {<div class=\"o-faint o-sm\" style=\"padding:4px 10px\">Delete the line(s).</div>}\n </div>\n } @else {\n <span style=\"white-space:pre-wrap\">{{ c.body }}</span>\n }\n }\n </div>\n @if (canComment()) {\n <div class=\"o-cf\">\n <input class=\"o-in o-sm\" placeholder=\"Reply…\" aria-label=\"Reply\" [ngModel]=\"replies()[t.id] ?? ''\" (ngModelChange)=\"setReply(t.id, $event)\" (keydown.enter)=\"sendReply(t.id)\" />\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"sendReply(t.id)\">Reply</button>\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"resolve.emit({ threadId: t.id, resolved: !t.resolved })\">{{ t.resolved ? 'Unresolve' : 'Resolve' }}</button>\n </div>\n }\n </div>\n </ng-template>\n\n <ng-template #draftTpl let-l>\n <div class=\"o-thread\"><div class=\"o-cb o-col\" style=\"gap:8px;padding:10px 12px\">\n <textarea class=\"o-in\" rows=\"2\" [placeholder]=\"'Leave a comment on line ' + lineOf(l)\" [attr.aria-label]=\"'Comment on line ' + lineOf(l)\" [ngModel]=\"draftBody()\" (ngModelChange)=\"draftBody.set($event)\" data-testid=\"line-comment\"></textarea>\n <div class=\"o-flex o-wrap\"><button type=\"button\" class=\"o-btn o-xs\" (click)=\"insertSuggestion(l)\" data-testid=\"insert-suggestion\">Insert suggestion</button><span class=\"o-faint o-xs\">Markdown works.</span>\n <button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"drafting.set('')\">Cancel</button>\n <button type=\"button\" class=\"o-btn o-sm\" [disabled]=\"!draftBody().trim()\" (click)=\"send(l, false)\" data-testid=\"line-comment-add\">Add single comment</button>\n <button type=\"button\" class=\"o-btn o-sm o-pri\" [disabled]=\"!draftBody().trim()\" (click)=\"send(l, true)\" data-testid=\"line-comment-review\">{{ reviewing() ? 'Add review comment' : 'Start a review' }}</button>\n </div>\n </div></div>\n </ng-template>\n `,\n})\nexport class DiffView implements AfterViewInit {\n private readonly api = inject(CodeApi);\n private readonly host = inject(CodeHost);\n private readonly el = inject(ElementRef<HTMLElement>);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly repo = input.required<string>();\n readonly file = input.required<FileChange>();\n readonly head = input.required<string>();\n readonly base = input('');\n readonly threads = input<Thread[]>([]);\n readonly canComment = input(false);\n readonly mode = input<'unified' | 'split'>('unified');\n readonly ignoreSpace = input(false);\n /** The file is marked viewed (pull requests); null hides the Viewed button. */\n readonly viewed = input<boolean | null>(null);\n /** The caller has a pending review on this pull request. */\n readonly reviewing = input(false);\n readonly comment = output<LineComment>();\n readonly reply = output<ThreadReply>();\n readonly resolve = output<{ threadId: string; resolved: boolean }>();\n readonly discard = output<string>();\n /** The caller can push to the pull request's branch, so may apply suggestions. */\n readonly canApply = input(false);\n /** Suggestions batched to apply together. */\n readonly batch = input<string[]>([]);\n readonly apply = output<string[]>();\n readonly batchToggle = output<string>();\n readonly viewedChange = output<boolean>();\n\n protected readonly open = signal(true);\n protected readonly visible = signal(false);\n protected readonly waiting = signal(false);\n protected readonly context = signal(CONTEXT[0]);\n protected readonly diff = signal<FileDiff | null>(null);\n protected readonly error = signal('');\n protected readonly drafting = signal('');\n protected readonly draftBody = signal('');\n protected readonly replies = signal<Record<string, string>>({});\n protected readonly people = computed(() => new People(this.host.people()));\n protected readonly threadsHere = computed(() => this.threads().filter((t) => t.path === this.file().path));\n protected readonly viewable = computed(() => this.viewed() !== null);\n protected readonly me = computed(() => this.host.meId());\n protected readonly splitRows = computed(() => (this.diff()?.hunks ?? []).map((h) => pair(h.lines)));\n protected readonly ago = (s?: string) => ago(s);\n private asked = false;\n\n constructor() {\n effect(() => {\n // viewed files fold away (and unfold when unmarked)\n const v = this.viewed();\n if (v !== null) untracked(() => this.open.set(!v));\n });\n effect(() => {\n // what the diff depends on; it loads once the file is near the screen and open\n this.head();\n this.base();\n this.ignoreSpace();\n this.context();\n const f = this.file();\n if (!this.visible() || !this.open() || f.binary) return;\n untracked(() => {\n if (!this.asked && f.additions + f.deletions > LARGE) {\n this.waiting.set(true);\n return;\n }\n this.load();\n });\n });\n }\n\n ngAfterViewInit() {\n if (typeof IntersectionObserver === 'undefined') {\n this.visible.set(true);\n return;\n }\n const io = new IntersectionObserver((entries) => {\n if (entries.some((e) => e.isIntersecting)) {\n this.visible.set(true);\n io.disconnect();\n }\n }, { rootMargin: '600px 0px' });\n io.observe(this.el.nativeElement);\n this.destroyRef.onDestroy(() => io.disconnect());\n }\n\n protected load() {\n const p = this.host.project();\n const f = this.file();\n if (!p || !this.head() || f.binary) return;\n this.asked = true;\n this.waiting.set(false);\n this.error.set('');\n this.api.diff(p.id, this.repo(), this.head(), f.path, this.base(), { context: this.context(), ignoreSpace: this.ignoreSpace() }).subscribe({\n next: (d) => this.diff.set(d),\n error: (e) => this.error.set(apiMessage(e, 'Could not load this diff.')),\n });\n }\n\n protected toggleOpen() {\n this.open.set(!this.open());\n }\n\n protected moreContext() {\n const next = CONTEXT.find((c) => c > this.context());\n if (next) this.context.set(next);\n }\n\n protected key(l: DiffLine) {\n return `${l.kind === 'delete' ? 'old' : 'new'}:${this.lineOf(l)}`;\n }\n\n protected lineOf(l: DiffLine) {\n return (l.kind === 'delete' ? l.old : l.new) ?? 0;\n }\n\n /** The lines of a split row that threads and drafts hang from (a context line once). */\n protected rowLines(r: SplitRow): DiffLine[] {\n if (r.left && r.right && r.left === r.right) return [r.left];\n return [r.left, r.right].filter((l): l is DiffLine => !!l);\n }\n\n protected threadsAt(l: DiffLine): Thread[] {\n const side = l.kind === 'delete' ? 'old' : 'new';\n const n = this.lineOf(l);\n return this.threadsHere().filter((t) => !t.outdated && t.side === side && t.line === n);\n }\n\n protected startComment(l: DiffLine) {\n if (!this.canComment()) return;\n this.drafting.set(this.key(l));\n this.draftBody.set('');\n }\n\n protected send(l: DiffLine, pending: boolean) {\n const body = this.draftBody().trim();\n if (!body) return;\n this.comment.emit({ path: this.file().path, side: l.kind === 'delete' ? 'old' : 'new', line: this.lineOf(l), body, pending });\n this.drafting.set('');\n this.draftBody.set('');\n }\n\n /** A comment's ```suggestion block, split into the text before it and the suggested lines. */\n protected suggestionOf(body: string): { before: string; lines: string[] } | null {\n const m = /```suggestion[^\\n]*\\n([\\s\\S]*?)```/.exec(body);\n if (!m) return null;\n const text = m[1].replace(/\\n$/, '');\n return { before: body.slice(0, m.index).trim(), lines: text === '' ? [] : text.split('\\n') };\n }\n\n protected insertSuggestion(l: DiffLine) {\n const cur = this.draftBody();\n this.draftBody.set((cur ? cur.trimEnd() + '\\n' : '') + '```suggestion\\n' + l.text + '\\n```');\n }\n\n protected setReply(id: string, v: string) {\n this.replies.set({ ...this.replies(), [id]: v });\n }\n\n protected sendReply(id: string) {\n const body = (this.replies()[id] ?? '').trim();\n if (!body) return;\n this.reply.emit({ threadId: id, body });\n this.setReply(id, '');\n }\n}\n\n/** Pairs a hunk's lines side by side: context on both sides, a run of removals beside the run of additions that follows it. */\nexport function pair(lines: DiffLine[]): SplitRow[] {\n const rows: SplitRow[] = [];\n let i = 0;\n while (i < lines.length) {\n const l = lines[i];\n if (l.kind === 'context') {\n rows.push({ left: l, right: l });\n i++;\n continue;\n }\n const dels: DiffLine[] = [];\n const adds: DiffLine[] = [];\n while (i < lines.length && lines[i].kind === 'delete') dels.push(lines[i++]);\n while (i < lines.length && lines[i].kind === 'add') adds.push(lines[i++]);\n for (let k = 0; k < Math.max(dels.length, adds.length); k++) rows.push({ left: dels[k], right: adds[k] });\n }\n return rows;\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { CodeApi, Repo, apiMessage } from './code.api';\nimport { CodeHost } from './host';\nimport { CurrentRepo, People, ago, copy } from './look';\n\n// /{org}/{project}/code (prototype \"code_repos\"): the project's repositories.\n@Component({\n selector: 'o-code-repos',\n imports: [RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page\">\n <div class=\"o-ph\">\n <div class=\"o-col\"><span class=\"o-eyebrow\">{{ host.project()?.key }} · {{ repos().length }} {{ repos().length === 1 ? 'repository' : 'repositories' }}</span><h1 class=\"o-t\">Repositories</h1></div>\n @if (canWrite()) {\n <div class=\"o-acts\">\n <a class=\"o-btn\" [routerLink]=\"host.link('code/new')\" [queryParams]=\"{ import: 1 }\">Import repository</a>\n <a class=\"o-btn o-dark\" [routerLink]=\"host.link('code/new')\" data-testid=\"new-repo\">+ New repository</a>\n </div>\n }\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n <div class=\"o-card\" style=\"overflow-x:auto\">\n <div class=\"o-tbl\" role=\"table\" aria-label=\"Repositories\" style=\"min-width:640px\">\n <div class=\"o-thead\" role=\"rowgroup\"><div class=\"o-tr\" role=\"row\"><div class=\"o-th\" role=\"columnheader\">Name</div><div class=\"o-th\" role=\"columnheader\">Default branch</div><div class=\"o-th\" role=\"columnheader\">Last push</div><div class=\"o-th\" role=\"columnheader\">Size</div><div class=\"o-th\" role=\"columnheader\">Visibility</div></div></div>\n <div class=\"o-tbody\" role=\"rowgroup\">\n @for (r of repos(); track r.name) {\n <a class=\"o-tr o-click\" role=\"row\" [routerLink]=\"host.link('code/' + r.name)\" [attr.data-testid]=\"'repo-' + r.name\">\n <div class=\"o-td\" role=\"cell\"><div class=\"o-col\" style=\"gap:2px\"><b class=\"o-mono o-b5\">{{ r.name }}</b>@if (r.description) {<span class=\"o-faint o-sm\">{{ r.description }}</span>}</div></div>\n <div class=\"o-td o-mono o-sm\" role=\"cell\">{{ r.defaultBranch }}</div>\n <div class=\"o-td o-mut\" role=\"cell\">{{ r.importState === 'running' || r.importState === 'queued' ? 'Importing…' : r.empty ? 'Empty' : ago(r.pushedAt) }}</div>\n <div class=\"o-td o-mut o-sm\" role=\"cell\">{{ sizeOf(r.sizeBytes) }}</div>\n <div class=\"o-td\" role=\"cell\"><span class=\"o-chip\">{{ r.visibility === 'private' ? 'Private' : 'Org-internal' }}</span>@if (r.archivedAt) {<span class=\"o-chip o-amb\" style=\"margin-left:4px\">Archived</span>}</div>\n </a>\n } @empty {\n <div class=\"o-empty\">{{ loaded() ? 'No repositories yet. Create one, or import from GitHub, GitLab, Bitbucket or any Git server.' : 'Loading…' }}</div>\n }\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class ReposPage {\n protected readonly host = inject(CodeHost);\n private readonly api = inject(CodeApi);\n protected readonly repos = signal<Repo[]>([]);\n protected readonly loaded = signal(false);\n protected readonly error = signal('');\n protected readonly ago = (s?: string) => ago(s);\n protected readonly canWrite = computed(() => {\n const p = this.host.project();\n return !!p && !p.archivedAt && p.capabilities.includes('code.write');\n });\n\n constructor() {\n effect(() => {\n const p = this.host.project();\n if (p) untracked(() => this.api.repos(p.id).subscribe({\n next: (r) => { this.repos.set(r); this.loaded.set(true); },\n error: (e) => { this.loaded.set(true); this.error.set(apiMessage(e, 'Could not load the repositories.')); },\n }));\n });\n }\n\n protected sizeOf(b: number) {\n return b < 1024 * 1024 ? `${Math.max(1, Math.round(b / 1024))} KB` : `${(b / 1024 / 1024).toFixed(1)} MB`;\n }\n}\n\n// /{org}/{project}/code/new (prototype \"code_new\"): create an empty repository with optional\n// README, .gitignore and licence, or import one from a URL; then the quick-setup commands.\n@Component({\n selector: 'o-code-new',\n imports: [FormsModule, RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page o-narrow\">\n <div class=\"o-ph\"><div class=\"o-col\"><span class=\"o-eyebrow\">{{ host.project()?.key }}</span><h1 class=\"o-t\">Add a repository</h1></div></div>\n <div class=\"o-tabs\" role=\"tablist\">\n <button type=\"button\" role=\"tab\" class=\"o-tab\" [class.o-on]=\"mode() === 'create'\" [attr.aria-selected]=\"mode() === 'create'\" (click)=\"mode.set('create')\">Create</button>\n <button type=\"button\" role=\"tab\" class=\"o-tab\" [class.o-on]=\"mode() === 'import'\" [attr.aria-selected]=\"mode() === 'import'\" (click)=\"mode.set('import')\">Import from URL</button>\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n\n @if (made(); as r) {\n <div class=\"o-card\">\n <div class=\"o-ch\"><b class=\"o-mono\">{{ r.name }}</b><span class=\"o-chip\">{{ r.empty ? 'empty' : r.importState ? 'importing' : 'ready' }}</span><span class=\"o-r\">Quick setup</span></div>\n <div class=\"o-cb o-col\" style=\"gap:14px\">\n <div class=\"o-flex\">\n <div class=\"o-seg\" role=\"group\" aria-label=\"Protocol\"><button type=\"button\" [class.o-on]=\"proto() === 'https'\" (click)=\"proto.set('https')\">HTTPS</button><button type=\"button\" [class.o-on]=\"proto() === 'ssh'\" (click)=\"proto.set('ssh')\">SSH</button></div>\n <div class=\"o-copy\" style=\"flex:1\"><span data-testid=\"clone-url\">{{ url() }}</span><button type=\"button\" class=\"o-btn o-xs\" (click)=\"copyUrl()\">{{ copied() ? 'Copied' : 'Copy' }}</button></div>\n </div>\n @if (r.empty) {\n <b class=\"o-sm\">Create a new repository on the command line</b>\n <div class=\"o-term\"><div>echo \"# {{ r.name }}\" &gt;&gt; README.md</div><div>git init &amp;&amp; git add README.md</div><div>git commit -m \"first commit\"</div><div>git branch -M {{ r.defaultBranch }}</div><div>git remote add origin {{ url() }}</div><div>git push -u origin {{ r.defaultBranch }}</div></div>\n <b class=\"o-sm\">…or push an existing repository</b>\n <div class=\"o-term\"><div>git remote add origin {{ url() }}</div><div>git branch -M {{ r.defaultBranch }}</div><div>git push -u origin {{ r.defaultBranch }}</div></div>\n }\n <a class=\"o-btn o-dark\" style=\"align-self:flex-start\" [routerLink]=\"host.link('code/' + r.name)\">Open {{ r.name }}</a>\n </div>\n </div>\n } @else if (mode() === 'create') {\n <form class=\"o-card o-cb o-form\" (ngSubmit)=\"create()\">\n <div class=\"o-fld\"><label for=\"nr-name\">Repository name</label><input id=\"nr-name\" class=\"o-in o-mono\" name=\"name\" [(ngModel)]=\"repoName\" placeholder=\"payments-api\" autocomplete=\"off\" data-testid=\"repo-name\" /><span class=\"o-hint\">Letters, digits, dots, dashes and underscores.</span></div>\n <div class=\"o-fld\"><label for=\"nr-desc\">Description <span class=\"o-faint\">(optional)</span></label><input id=\"nr-desc\" class=\"o-in\" name=\"desc\" [(ngModel)]=\"desc\" placeholder=\"What lives here?\" /></div>\n <div class=\"o-fld\"><span class=\"o-lbl\" style=\"padding:0\">Visibility</span>\n <div class=\"o-g2\">\n <button type=\"button\" class=\"o-opt\" [class.o-on]=\"vis === 'private'\" (click)=\"vis = 'private'\"><span class=\"o-rad\" [class.o-on]=\"vis === 'private'\"></span><span class=\"o-col\" style=\"gap:2px\"><b>Private</b><span class=\"o-faint o-sm\">Project members only</span></span></button>\n <button type=\"button\" class=\"o-opt\" [class.o-on]=\"vis === 'internal'\" (click)=\"vis = 'internal'\"><span class=\"o-rad\" [class.o-on]=\"vis === 'internal'\"></span><span class=\"o-col\" style=\"gap:2px\"><b>Org-internal</b><span class=\"o-faint o-sm\">Everyone in the organization can read</span></span></button>\n </div>\n </div>\n <div class=\"o-g4\">\n <div class=\"o-fld\"><label for=\"nr-br\">Default branch</label><input id=\"nr-br\" class=\"o-in o-mono\" name=\"branch\" [(ngModel)]=\"branch\" /></div>\n <div class=\"o-fld\"><span class=\"o-lbl\" style=\"padding:0\" id=\"nr-readme\">README</span><button type=\"button\" class=\"o-tog\" role=\"switch\" aria-labelledby=\"nr-readme\" [class.o-on]=\"readme\" [attr.aria-checked]=\"readme\" (click)=\"readme = !readme\" data-testid=\"repo-readme\"></button></div>\n <div class=\"o-fld\"><label for=\"nr-gi\">.gitignore</label><select id=\"nr-gi\" class=\"o-in\" name=\"gi\" [(ngModel)]=\"gitignore\"><option value=\"\">None</option><option value=\"node\">Node</option><option value=\"go\">Go</option><option value=\"python\">Python</option></select></div>\n <div class=\"o-fld\"><label for=\"nr-lic\">Licence</label><select id=\"nr-lic\" class=\"o-in\" name=\"lic\" [(ngModel)]=\"licence\"><option value=\"\">None</option><option value=\"MIT\">MIT</option><option value=\"Apache-2.0\">Apache 2.0</option></select></div>\n </div>\n <div class=\"o-flex\"><span class=\"o-faint o-sm\">Push limits: 2 GB per push, 100 MB per file.</span><button type=\"submit\" class=\"o-btn o-dark o-r\" [disabled]=\"busy() || !repoName.trim()\" data-testid=\"repo-create\">Create repository</button></div>\n </form>\n } @else {\n <form class=\"o-card o-cb o-form\" (ngSubmit)=\"importRepo()\">\n <div class=\"o-fld\"><label for=\"ir-url\">Git URL</label><input id=\"ir-url\" class=\"o-in o-mono\" name=\"url\" [(ngModel)]=\"url_\" placeholder=\"https://github.com/acme/payments-api.git\" (blur)=\"nameFromUrl()\" /><span class=\"o-hint\">GitHub, GitLab, Bitbucket or any Git server over HTTPS. All branches and tags are copied.</span></div>\n <div class=\"o-fld\"><label for=\"ir-name\">Repository name</label><input id=\"ir-name\" class=\"o-in o-mono\" name=\"iname\" [(ngModel)]=\"repoName\" /></div>\n <div class=\"o-g2\">\n <div class=\"o-fld\"><label for=\"ir-user\">Username <span class=\"o-faint\">(private repos)</span></label><input id=\"ir-user\" class=\"o-in\" name=\"user\" [(ngModel)]=\"user\" autocomplete=\"off\" /></div>\n <div class=\"o-fld\"><label for=\"ir-tok\">Access token</label><input id=\"ir-tok\" class=\"o-in\" type=\"password\" name=\"token\" [(ngModel)]=\"token\" autocomplete=\"off\" /></div>\n </div>\n <div class=\"o-flex\"><button type=\"button\" class=\"o-tog o-dis\" disabled aria-label=\"Keep as a pull mirror\"></button><span class=\"o-sm\">Keep as a pull mirror</span><b class=\"o-ph-tag o-later\">Later</b></div>\n <div class=\"o-flex\"><span class=\"o-faint o-sm\">Imports run in the background; you'll get an inbox message when done.</span><button type=\"submit\" class=\"o-btn o-dark o-r\" [disabled]=\"busy() || !url_.trim() || !repoName.trim()\">Import</button></div>\n </form>\n }\n </div>\n `,\n})\nexport class NewRepoPage {\n protected readonly host = inject(CodeHost);\n private readonly api = inject(CodeApi);\n private readonly route = inject(ActivatedRoute);\n\n protected readonly mode = signal<'create' | 'import'>('create');\n protected readonly made = signal<Repo | null>(null);\n protected readonly proto = signal<'https' | 'ssh'>('https');\n protected readonly busy = signal(false);\n protected readonly error = signal('');\n protected readonly copied = signal(false);\n protected readonly url = computed(() => (this.proto() === 'ssh' ? this.made()?.cloneSsh : this.made()?.cloneHttps) || '');\n protected repoName = '';\n protected desc = '';\n protected vis: 'private' | 'internal' = 'private';\n protected branch = 'main';\n protected readme = true;\n protected gitignore = '';\n protected licence = '';\n protected url_ = '';\n protected user = '';\n protected token = '';\n\n constructor() {\n this.route.queryParamMap.subscribe((q) => this.mode.set(q.get('import') ? 'import' : 'create'));\n }\n\n protected nameFromUrl() {\n if (this.repoName.trim()) return;\n const m = this.url_.trim().match(/([^/:]+?)(\\.git)?\\/?$/);\n if (m) this.repoName = m[1];\n }\n\n protected copyUrl() {\n void copy(this.url()).then(() => { this.copied.set(true); setTimeout(() => this.copied.set(false), 1500); });\n }\n\n protected create() {\n const p = this.host.project();\n if (!p) return;\n this.busy.set(true);\n this.error.set('');\n this.api.create(p.id, { name: this.repoName.trim(), description: this.desc.trim(), visibility: this.vis, defaultBranch: this.branch.trim() || 'main', readme: this.readme, gitignore: this.gitignore, licence: this.licence }).subscribe({\n next: (r) => { this.busy.set(false); this.made.set(r); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not create the repository.')); },\n });\n }\n\n protected importRepo() {\n const p = this.host.project();\n if (!p) return;\n this.busy.set(true);\n this.error.set('');\n this.api.import(p.id, { name: this.repoName.trim(), url: this.url_.trim(), username: this.user.trim() || undefined, token: this.token || undefined, visibility: this.vis }).subscribe({\n next: (r) => { this.busy.set(false); this.token = ''; this.made.set(r); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not start the import.')); },\n });\n }\n}\n\n// /{org}/{project}/code/{files,commits,branches,settings}: the project-level tabs open the repository\n// the person was last in (else the first one) at that tab.\n@Component({\n selector: 'o-code-current',\n imports: [RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page o-narrow\">\n @if (none()) {\n <div class=\"o-card o-empty\"><p>No repositories yet.</p><a class=\"o-btn\" style=\"margin-top:14px\" [routerLink]=\"host.link('code/new')\">+ New repository</a></div>\n } @else if (error()) {\n <div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>\n } @else {\n <div class=\"o-card\"><div class=\"o-empty\">Opening the repository…</div></div>\n }\n </div>\n `,\n})\nexport class CurrentRepoPage {\n protected readonly host = inject(CodeHost);\n private readonly api = inject(CodeApi);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly current = inject(CurrentRepo);\n protected readonly none = signal(false);\n protected readonly error = signal('');\n\n constructor() {\n effect(() => {\n const p = this.host.project();\n if (!p) return;\n untracked(() => {\n const tab = String(this.route.snapshot.data['codeTab'] ?? '');\n this.api.repos(p.id).subscribe({\n next: (rs) => {\n if (!rs.length) return this.none.set(true);\n const last = this.current.get(p.id);\n const repo = rs.find((r) => r.name === last)?.name ?? rs[0].name;\n void this.router.navigate(this.host.link(`code/${repo}${tab ? '/' + tab : ''}`), { replaceUrl: true });\n },\n error: (e) => this.error.set(apiMessage(e, 'Could not load the repositories.')),\n });\n });\n });\n }\n}\n\n","import { ChangeDetectionStrategy, Component, ElementRef, HostListener, computed, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router, RouterLink } from '@angular/router';\nimport { Language, Repo, Tree, apiMessage } from './code.api';\nimport { RefPicker, RepoPage } from './repo-base';\nimport { ago, copy, initials, langColour } from './look';\n\n// /{org}/{project}/code/{repo}?ref=&path= (prototype \"code_repo\"): the repository's files at a\n// branch, tag or commit, the last commit of each entry, the README, the clone menu and languages.\n@Component({\n selector: 'o-code-repo',\n imports: [FormsModule, RouterLink, RefPicker],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`.anchor{position:relative} .ic{width:18px;flex:none;color:var(--o-dim);text-align:center}`],\n template: `\n <div class=\"o-page\">\n @if (repo(); as r) {\n <div class=\"o-ph\">\n <div class=\"o-col\">\n <span class=\"o-eyebrow\">{{ r.projectKey }}</span>\n <div class=\"o-flex\"><h1 class=\"o-t o-mono\" style=\"font-size:19px\">{{ r.name }}</h1><span class=\"o-chip\">{{ r.visibility === 'private' ? 'Private' : 'Org-internal' }}</span>@if (r.archivedAt) {<span class=\"o-chip o-amb\">Archived</span>}</div>\n @if (r.description) {<span class=\"o-mut\">{{ r.description }}</span>}\n </div>\n @if (!r.empty) {<div class=\"o-acts\"><button type=\"button\" class=\"o-btn o-sm\" (click)=\"archive('zip')\">Download ZIP</button></div>}\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n\n @if (r.importState && r.importState !== 'done') {\n <div class=\"o-card o-cb o-col\" style=\"gap:6px\">\n <b>{{ r.importState === 'failed' ? 'The import failed' : 'Importing from ' + r.importSource }}</b>\n <span class=\"o-mut o-sm\">{{ r.importState === 'failed' ? r.importError : 'This runs in the background; the inbox tells you when it is done.' }}</span>\n </div>\n } @else if (r.empty) {\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>This repository is empty</b><span class=\"o-r\">Quick setup</span></div>\n <div class=\"o-cb o-col\" style=\"gap:14px\">\n <div class=\"o-flex\">\n <div class=\"o-seg\" role=\"group\" aria-label=\"Protocol\"><button type=\"button\" [class.o-on]=\"proto() === 'https'\" (click)=\"proto.set('https')\">HTTPS</button><button type=\"button\" [class.o-on]=\"proto() === 'ssh'\" (click)=\"proto.set('ssh')\">SSH</button></div>\n <div class=\"o-copy\" style=\"flex:1\"><span data-testid=\"clone-url\">{{ cloneUrl() }}</span><button type=\"button\" class=\"o-btn o-xs\" (click)=\"copyClone()\">{{ copied() ? 'Copied' : 'Copy' }}</button></div>\n </div>\n <b class=\"o-sm\">Push an existing repository</b>\n <div class=\"o-term\"><div>git remote add origin {{ cloneUrl() }}</div><div>git branch -M {{ r.defaultBranch }}</div><div>git push -u origin {{ r.defaultBranch }}</div></div>\n </div>\n </div>\n } @else {\n <div class=\"o-flex o-wrap\">\n <o-ref-picker [repo]=\"r.name\" [current]=\"ref() || r.defaultBranch\" (picked)=\"go($event, '')\" />\n <nav class=\"o-flex o-sm o-mono\" aria-label=\"Path\">\n <a [routerLink]=\"link()\" [queryParams]=\"qp('')\">{{ r.name }}</a>\n @for (c of crumbs(); track c.path) {<span class=\"o-faint\">/</span><a [routerLink]=\"link()\" [queryParams]=\"qp(c.path)\">{{ c.name }}</a>}\n </nav>\n <span class=\"o-r\"></span>\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"openFinder()\">Go to file <span class=\"o-kbd\">T</span></button>\n @if (canWrite()) {\n <span class=\"anchor add\">\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"addOpen.set(!addOpen())\" [attr.aria-expanded]=\"addOpen()\" aria-haspopup=\"menu\" data-testid=\"add-file\">Add file ⌄</button>\n @if (addOpen()) {\n <div class=\"o-menu\" role=\"menu\" style=\"right:0;top:34px;width:200px\">\n <a role=\"menuitem\" [routerLink]=\"link('new')\" [queryParams]=\"{ ref: ref() || null, path: path() || null }\" data-testid=\"add-new\">Create new file</a>\n <a role=\"menuitem\" [routerLink]=\"link('upload')\" [queryParams]=\"{ ref: ref() || null, path: path() || null }\" data-testid=\"add-upload\">Upload files</a>\n </div>\n }\n </span>\n }\n <span class=\"anchor\">\n <button type=\"button\" class=\"o-btn o-sm o-pri\" (click)=\"cloneOpen.set(!cloneOpen())\" [attr.aria-expanded]=\"cloneOpen()\" aria-haspopup=\"dialog\" data-testid=\"clone-menu\">Code ⌄</button>\n @if (cloneOpen()) {\n <div class=\"o-menu\" role=\"dialog\" aria-label=\"Clone\" style=\"right:0;top:34px;width:380px;padding:12px;display:flex;flex-direction:column;gap:10px\">\n <b>Clone</b>\n <div class=\"o-seg\" role=\"group\" aria-label=\"Protocol\" style=\"align-self:flex-start\"><button type=\"button\" [class.o-on]=\"proto() === 'https'\" (click)=\"proto.set('https')\">HTTPS</button><button type=\"button\" [class.o-on]=\"proto() === 'ssh'\" (click)=\"proto.set('ssh')\">SSH</button></div>\n <div class=\"o-copy\"><span data-testid=\"clone-url\">{{ cloneUrl() }}</span><button type=\"button\" class=\"o-btn o-xs\" (click)=\"copyClone()\">{{ copied() ? 'Copied' : 'Copy' }}</button></div>\n <span class=\"o-hint\">{{ proto() === 'https' ? 'Use a personal access token as the password.' : 'Add your SSH key under Account › SSH and signing keys.' }}</span>\n <hr style=\"border:none;border-top:1px solid var(--o-line-soft);margin:0;width:100%\">\n <div class=\"o-flex\"><button type=\"button\" class=\"o-btn o-sm\" (click)=\"archive('zip')\">Download ZIP</button><button type=\"button\" class=\"o-btn o-sm\" (click)=\"archive('tar.gz')\">Download tar.gz</button></div>\n </div>\n }\n </span>\n </div>\n <div class=\"o-split\">\n <div class=\"o-col\" style=\"gap:14px;min-width:0\">\n <div class=\"o-card\">\n @if (tree()?.lastCommit; as lc) {\n <div class=\"o-ch\" style=\"background:var(--o-well)\">\n <span class=\"o-av\" aria-hidden=\"true\">{{ initials(lc.author.name) }}</span><b class=\"o-b5\">{{ lc.author.name }}</b>\n <a class=\"o-ell o-mut\" style=\"min-width:0\" [routerLink]=\"link('commit/' + lc.oid)\">{{ lc.subject }}</a>\n <span class=\"o-r o-flex o-sm\"><a class=\"o-mono\" [routerLink]=\"link('commit/' + lc.oid)\">{{ lc.short }}</a><span class=\"o-faint\">{{ ago(lc.committer.when) }}</span><a [routerLink]=\"link('commits')\" [queryParams]=\"{ ref: ref() }\">History</a></span>\n </div>\n }\n @if (path()) {<a class=\"o-row o-click\" [routerLink]=\"link()\" [queryParams]=\"qp(parent())\"><span class=\"o-faint o-mono ic\">..</span></a>}\n @for (e of tree()?.entries ?? []; track e.path) {\n <a class=\"o-row o-click\" [routerLink]=\"e.type === 'tree' ? link() : link('blob')\" [queryParams]=\"qp(e.path)\" [attr.data-testid]=\"'entry-' + e.name\">\n <span class=\"ic\" aria-hidden=\"true\">{{ e.type === 'tree' ? '▸' : '·' }}</span>\n <span class=\"o-mono o-sm\" style=\"width:200px;flex:none\" [class.o-b5]=\"e.type === 'tree'\">{{ e.name }}</span>\n <span class=\"o-ell o-faint o-sm\" style=\"flex:1\">{{ e.lastCommit?.subject }}</span>\n <span class=\"o-faint o-sm\">{{ ago(e.lastCommit?.committer?.when) }}</span>\n </a>\n } @empty {\n @if (!tree()) {<div class=\"o-empty\">Loading…</div>}\n }\n </div>\n @if (tree()?.readme; as rd) {\n <div class=\"o-card\">\n <div class=\"o-ch\"><b class=\"o-mono o-sm\">{{ rd.path }}</b></div>\n <div class=\"o-cb o-md readme\" style=\"font-size:14px;padding:18px 22px\" [innerHTML]=\"rd.html\"></div>\n </div>\n }\n </div>\n <div class=\"o-col\" style=\"gap:14px\">\n <div class=\"o-card o-cb o-col\"><b>About</b><span class=\"o-mut o-lh\">{{ r.description || 'No description.' }}</span><span class=\"o-faint o-sm\">Default branch <span class=\"o-mono\">{{ r.defaultBranch }}</span></span></div>\n <div class=\"o-card o-cb o-col\"><b>Releases</b><a class=\"o-sm\" [routerLink]=\"link('releases')\" data-testid=\"repo-releases\">Releases and tags</a></div>\n <div class=\"o-card o-cb o-col\"><b>Deployments</b><span class=\"o-faint o-sm\">Environments show here once Deploy is set up.</span></div>\n @if (langs().length) {\n <div class=\"o-card o-cb o-col\">\n <b>Languages</b>\n <div style=\"display:flex;height:8px;border-radius:4px;overflow:hidden\" role=\"img\" [attr.aria-label]=\"langLabel()\">@for (l of langs(); track l.name; let i = $index) {<i [style.width.%]=\"l.percent\" [style.background]=\"colour(i)\"></i>}</div>\n <div class=\"o-legend\">@for (l of langs(); track l.name; let i = $index) {<span><span class=\"o-dot\" [style.background]=\"colour(i)\"></span>{{ l.name }} {{ l.percent.toFixed(0) }}%</span>}</div>\n </div>\n }\n </div>\n </div>\n }\n } @else if (error()) {\n <div class=\"o-card o-empty\"><p>{{ error() }}</p><a class=\"o-btn\" style=\"margin-top:14px\" [routerLink]=\"host.link('code')\">All repositories</a></div>\n } @else {\n <div class=\"o-card\"><div class=\"o-empty\">Loading…</div></div>\n }\n </div>\n\n @if (finding()) {\n <div class=\"o-overlay\" (click)=\"finding.set(false)\">\n <div class=\"o-dlg o-wide\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Go to file\" (click)=\"$event.stopPropagation()\" (keydown.escape)=\"finding.set(false)\">\n <div class=\"o-dlg-b\">\n <input class=\"o-in o-mono\" placeholder=\"Find a file\" aria-label=\"Find a file\" [ngModel]=\"fq()\" (ngModelChange)=\"fq.set($event)\" (keydown.enter)=\"openFirst()\" />\n <div class=\"o-col\" style=\"gap:0;max-height:50vh;overflow:auto\">\n @for (f of found(); track f) {<a class=\"o-row o-click o-mono o-sm\" [routerLink]=\"link('blob')\" [queryParams]=\"qp(f)\" (click)=\"finding.set(false)\">{{ f }}</a>}\n @if (!found().length) {<span class=\"o-faint o-sm\" style=\"padding:8px\">{{ files().length ? 'No files match.' : 'Loading files…' }}</span>}\n </div>\n </div>\n </div>\n </div>\n }\n `,\n})\nexport class RepoHomePage extends RepoPage {\n private readonly router = inject(Router);\n private readonly el = inject(ElementRef);\n\n protected readonly tree = signal<Tree | null>(null);\n protected readonly langs = signal<Language[]>([]);\n protected readonly ref = signal('');\n protected readonly path = signal('');\n protected readonly proto = signal<'https' | 'ssh'>('https');\n protected readonly cloneOpen = signal(false);\n protected readonly addOpen = signal(false);\n protected readonly copied = signal(false);\n protected readonly finding = signal(false);\n protected readonly fq = signal('');\n protected readonly files = signal<string[]>([]);\n protected readonly ago = (s?: string) => ago(s);\n protected readonly initials = initials;\n protected readonly colour = langColour;\n protected readonly cloneUrl = computed(() => (this.proto() === 'ssh' ? this.repo()?.cloneSsh : this.repo()?.cloneHttps) || '');\n protected readonly crumbs = computed(() => {\n const parts = this.path().split('/').filter(Boolean);\n return parts.map((name, i) => ({ name, path: parts.slice(0, i + 1).join('/') }));\n });\n protected readonly parent = computed(() => this.path().split('/').slice(0, -1).join('/'));\n protected readonly found = computed(() => {\n const q = this.fq().toLowerCase();\n return this.files().filter((f) => !q || f.toLowerCase().includes(q)).slice(0, 50);\n });\n protected readonly langLabel = computed(() => this.langs().map((l) => `${l.name} ${l.percent.toFixed(0)}%`).join(', '));\n\n constructor() {\n super();\n this.route.queryParamMap.subscribe((q) => {\n this.ref.set(q.get('ref') ?? '');\n this.path.set(q.get('path') ?? '');\n const r = this.repo();\n if (r && r.name === this.name()) this.load(r);\n });\n }\n\n protected onRepo(r: Repo) {\n this.load(r);\n if (!r.empty) this.api.languages(this.projectId(), r.name, this.ref() || r.defaultBranch).subscribe({ next: (l) => this.langs.set(l), error: () => undefined });\n }\n\n protected qp(path: string) {\n return { ref: this.ref() || null, path: path || null };\n }\n\n protected go(ref: string, path: string) {\n void this.router.navigate(this.link(), { queryParams: { ref, path: path || null } });\n }\n\n protected copyClone() {\n void copy(this.cloneUrl()).then(() => { this.copied.set(true); setTimeout(() => this.copied.set(false), 1500); });\n }\n\n protected archive(format: 'zip' | 'tar.gz') {\n const r = this.repo();\n if (!r) return;\n this.api.archiveUrl(this.projectId(), r.name, this.ref() || r.defaultBranch, format).subscribe({\n next: (u) => { if (u) location.assign(u); },\n error: (e) => this.error.set(apiMessage(e, 'Could not prepare the download.')),\n });\n }\n\n protected openFirst() {\n const f = this.found()[0];\n if (f) { this.finding.set(false); void this.router.navigate(this.link('blob'), { queryParams: this.qp(f) }); }\n }\n\n /** T opens Go to file (prototype). */\n @HostListener('document:keydown', ['$event'])\n protected key(e: KeyboardEvent) {\n const t = e.target as HTMLElement | null;\n if (e.key !== 't' || e.metaKey || e.ctrlKey || e.altKey || t?.closest('input,textarea,select,[contenteditable]')) return;\n if (this.repo() && !this.repo()!.empty && !this.finding()) { e.preventDefault(); this.openFinder(); }\n }\n\n private load(r: Repo) {\n if (r.empty || (r.importState && r.importState !== 'done')) return;\n const ref = this.ref() || r.defaultBranch;\n this.tree.set(null);\n this.api.tree(this.projectId(), r.name, ref, this.path()).subscribe({\n next: (t) => this.tree.set(t),\n error: (e) => this.error.set(apiMessage(e, 'Could not read the files.')),\n });\n this.files.set([]);\n }\n\n protected openFinder() {\n const r = this.repo();\n if (!r || r.empty) return;\n this.finding.set(true);\n this.fq.set('');\n if (!this.files().length) this.api.files(this.projectId(), r.name, this.ref() || r.defaultBranch).subscribe({ next: (f) => this.files.set(f.files), error: () => undefined });\n setTimeout(() => (this.el.nativeElement as HTMLElement).querySelector<HTMLInputElement>('input[aria-label=\"Find a file\"]')?.focus());\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CodeApi, Protection } from './code.api';\nimport { CodeHost } from './host';\n\n/** Where a web commit goes: onto the branch, or onto a new branch with a pull request. */\nexport interface CommitChoice {\n message: string;\n /** Set for a new branch (with a pull request into the current one). */\n newBranch?: string;\n}\n\n/** Whether a branch protection pattern names the branch (as code's protect.Match: * within a segment, ** across). */\nexport function matchesPattern(pattern: string, branch: string): boolean {\n const seg = (p: string) => '^' + p.split('*').map((x) => x.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('[^/]*') + '$';\n const pat = pattern.split('/');\n const name = branch.split('/');\n const go = (i: number, j: number): boolean => {\n if (i === pat.length) return j === name.length;\n if (pat[i] === '**') {\n if (i === pat.length - 1) return j < name.length;\n for (let k = j; k <= name.length; k++) if (go(i + 1, k)) return true;\n return false;\n }\n return j < name.length && new RegExp(seg(pat[i])).test(name[j]) && go(i + 1, j + 1);\n };\n return go(0, 0);\n}\n\n// The web editor's commit box (prototype code_file \"Commit and open PR\", DEV-13): a message, and\n// either the branch itself or a new branch with a pull request. A branch whose rules block direct\n// pushes only offers the second.\n@Component({\n selector: 'o-commit-box',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-col\" style=\"gap:10px\" data-testid=\"commit-box\">\n @if (blocked()) {<div class=\"o-note o-blu\">Your change is committed to a new branch with a pull request because <b>{{ branch() }}</b> is protected.</div>}\n <div class=\"o-fld\"><label for=\"cb-msg\">Commit message</label><input id=\"cb-msg\" class=\"o-in\" [ngModel]=\"message()\" (ngModelChange)=\"message.set($event)\" data-testid=\"commit-message\" /></div>\n @if (!blocked()) {\n <label class=\"o-flex o-sm\"><input type=\"radio\" name=\"cb-where\" [checked]=\"!toNew()\" (change)=\"toNew.set(false)\" /> Commit directly to <b class=\"o-mono\">{{ branch() }}</b></label>\n <label class=\"o-flex o-sm\"><input type=\"radio\" name=\"cb-where\" [checked]=\"toNew()\" (change)=\"toNew.set(true)\" data-testid=\"commit-new-branch\" /> Create a new branch and open a pull request</label>\n }\n @if (toNew() || blocked()) {\n <div class=\"o-flex o-sm\"><span class=\"o-faint\">→ new branch</span><input class=\"o-in o-sm o-mono\" style=\"max-width:260px\" aria-label=\"New branch\" [ngModel]=\"newBranch()\" (ngModelChange)=\"newBranch.set($event)\" data-testid=\"commit-branch\" /></div>\n }\n <div class=\"o-flex\">\n <button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"cancel.emit()\">Cancel</button>\n <button type=\"button\" class=\"o-btn o-sm o-pri\" [disabled]=\"busy() || !message().trim() || ((toNew() || blocked()) && !newBranch().trim())\" (click)=\"send()\" data-testid=\"commit-submit\">{{ toNew() || blocked() ? 'Commit and open PR' : 'Commit changes' }}</button>\n </div>\n </div>\n `,\n})\nexport class CommitBox {\n private readonly api = inject(CodeApi);\n private readonly host = inject(CodeHost);\n\n readonly repo = input.required<string>();\n readonly branch = input.required<string>();\n readonly defaultMessage = input('');\n readonly busy = input(false);\n readonly commit = output<CommitChoice>();\n readonly cancel = output<void>();\n\n protected readonly message = signal('');\n protected readonly toNew = signal(false);\n protected readonly newBranch = signal('');\n private readonly rules = signal<Protection[]>([]);\n protected readonly blocked = computed(() => this.rules().some((r) => r.blockDirectPush && matchesPattern(r.pattern, this.branch())));\n\n constructor() {\n effect(() => {\n const m = this.defaultMessage();\n untracked(() => this.message.set(m));\n });\n effect(() => {\n const repo = this.repo();\n const p = this.host.project();\n if (!p || !repo) return;\n untracked(() => {\n this.api.protections(p.id, repo).subscribe({ next: (r) => this.rules.set(r), error: () => undefined });\n const me = (this.host.people().find((x) => x.id === this.host.meId())?.name || 'patch').toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'patch';\n this.newBranch.set(`${me}/patch-${Math.floor(Date.now() / 1000) % 100000}`);\n });\n });\n }\n\n protected send() {\n const toNew = this.toNew() || this.blocked();\n this.commit.emit({ message: this.message().trim(), newBranch: toNew ? this.newBranch().trim() : undefined });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { Router, RouterLink } from '@angular/router';\nimport { FormsModule } from '@angular/forms';\nimport { BlameHunk, Blob, CommitRequest, Repo, apiMessage } from './code.api';\nimport { CommitBox, CommitChoice } from './commit.box';\nimport { RefPicker, RepoPage } from './repo-base';\nimport { TOKEN_CSS, ago, copy, initials, size } from './look';\n\n// /{org}/{project}/code/{repo}/blob?ref=&path= (prototype \"code_file\"): one file, highlighted, with\n// Markdown preview, blame, raw, copy and download; a line number links to that line (#L12).\n@Component({\n selector: 'o-code-file',\n imports: [RouterLink, RefPicker, FormsModule, CommitBox],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [TOKEN_CSS, `.o-ln .o-n{text-decoration:none} .o-btn.o-on{background:var(--o-tx);border-color:var(--o-tx);color:var(--o-acc-fg)}`],\n template: `\n <div class=\"o-page o-wide\">\n @if (repo(); as r) {\n <div class=\"o-flex o-wrap\">\n <o-ref-picker [repo]=\"r.name\" [current]=\"ref() || r.defaultBranch\" (picked)=\"pickRef($event)\" />\n <nav class=\"o-flex o-sm o-mono\" aria-label=\"Path\">\n <a [routerLink]=\"link()\" [queryParams]=\"{ ref: ref() || null }\">{{ r.name }}</a>\n @for (c of crumbs(); track c.path; let last = $last) {\n <span class=\"o-faint\">/</span>\n @if (last) {<b aria-current=\"page\">{{ c.name }}</b>} @else {<a [routerLink]=\"link()\" [queryParams]=\"{ ref: ref() || null, path: c.path }\">{{ c.name }}</a>}\n }\n </nav>\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @if (note()) {<div class=\"o-note\" role=\"status\">{{ note() }}</div>}\n @if (blob(); as b) {\n <div class=\"o-card\">\n @if (b.lastCommit; as lc) {\n <div class=\"o-ch\" style=\"background:var(--o-well)\">\n <span class=\"o-av\" aria-hidden=\"true\">{{ initials(lc.author.name) }}</span><b class=\"o-b5\">{{ lc.author.name }}</b>\n <span class=\"o-ell o-mut\" style=\"min-width:0\">{{ lc.subject }}</span>\n <span class=\"o-r o-sm\"><a class=\"o-mono\" [routerLink]=\"link('commit/' + lc.oid)\">{{ lc.short }}</a> · {{ ago(lc.committer.when) }} · <a [routerLink]=\"link('commits')\" [queryParams]=\"{ ref: ref() || null, path: b.path }\">History</a></span>\n </div>\n }\n <div class=\"o-ch\">\n <span class=\"o-faint o-sm\">{{ meta() }}</span>\n <span class=\"o-r o-flex\" style=\"gap:6px\">\n @if (b.markdown) {\n <div class=\"o-seg\" role=\"group\" aria-label=\"View\"><button type=\"button\" [class.o-on]=\"view() === 'preview'\" (click)=\"view.set('preview')\">Preview</button><button type=\"button\" [class.o-on]=\"view() === 'code'\" (click)=\"view.set('code')\">Code</button></div>\n }\n @if (!b.binary && !b.truncated) {<button type=\"button\" class=\"o-btn o-xs\" [class.o-on]=\"blaming()\" [attr.aria-pressed]=\"blaming()\" (click)=\"toggleBlame()\">Blame</button>}\n @if (b.rawUrl) {<a class=\"o-btn o-xs\" [href]=\"b.rawUrl\" target=\"_blank\" rel=\"noopener\">Raw</a>}\n @if (!b.binary) {<button type=\"button\" class=\"o-btn o-xs\" (click)=\"copyText()\">{{ copied() ? 'Copied' : 'Copy' }}</button>}\n @if (b.downloadUrl) {<a class=\"o-btn o-xs\" [href]=\"b.downloadUrl\">Download</a>}\n @if (editable()) {\n @if (!b.binary && !b.truncated) {<button type=\"button\" class=\"o-btn o-xs\" (click)=\"startEdit()\" [disabled]=\"mode() !== ''\" data-testid=\"file-edit\">Edit</button>}\n <button type=\"button\" class=\"o-btn o-xs\" (click)=\"mode.set('delete')\" [disabled]=\"mode() !== ''\" data-testid=\"file-delete\">Delete</button>\n }\n </span>\n </div>\n @if (mode() === 'edit') {\n <div class=\"o-cb o-col\" style=\"gap:10px;background:var(--o-well);border-bottom:1px solid var(--o-line-soft)\">\n @if (text() === null) {<span class=\"o-faint o-sm\">Loading the file…</span>} @else {\n <textarea class=\"o-in o-mono\" rows=\"16\" style=\"font-size:12px;height:auto;padding:8px 10px\" aria-label=\"File contents\" [ngModel]=\"text()\" (ngModelChange)=\"text.set($event)\" data-testid=\"file-text\"></textarea>\n <o-commit-box [repo]=\"r.name\" [branch]=\"branch()\" [defaultMessage]=\"'Update ' + b.name\" [busy]=\"busy()\" (commit)=\"save($event)\" (cancel)=\"mode.set('')\" />\n }\n </div>\n }\n @if (mode() === 'delete') {\n <div class=\"o-cb o-col\" style=\"gap:10px;background:var(--o-well);border-bottom:1px solid var(--o-line-soft)\">\n <span class=\"o-sm\">Delete <b class=\"o-mono\">{{ b.path }}</b> from <b class=\"o-mono\">{{ branch() }}</b>?</span>\n <o-commit-box [repo]=\"r.name\" [branch]=\"branch()\" [defaultMessage]=\"'Delete ' + b.name\" [busy]=\"busy()\" (commit)=\"save($event, true)\" (cancel)=\"mode.set('')\" />\n </div>\n }\n @if (b.image && b.rawUrl) {\n <div class=\"o-cb\" style=\"text-align:center\"><img [src]=\"b.rawUrl\" [alt]=\"b.name\" style=\"max-width:100%\" /></div>\n } @else if (b.binary || b.truncated) {\n <div class=\"o-empty\">{{ b.binary ? 'A binary file.' : 'Too large to show here.' }} @if (b.rawUrl) {<a [href]=\"b.rawUrl\" target=\"_blank\" rel=\"noopener\">View raw</a>}</div>\n } @else if (b.markdown && view() === 'preview') {\n <div class=\"o-cb o-md\" style=\"font-size:14px;padding:18px 22px\" [innerHTML]=\"b.markdown\"></div>\n } @else {\n <div class=\"o-code\" style=\"padding:8px 0;overflow-x:auto\" role=\"table\" [attr.aria-label]=\"b.path\">\n @for (l of b.lines; track $index; let i = $index) {\n <div class=\"o-ln\" [class.o-hl]=\"line() === i + 1\" role=\"row\" [attr.id]=\"'L' + (i + 1)\">\n @if (blaming()) {<span class=\"o-bl\" role=\"cell\" [attr.title]=\"blameAt(i + 1)?.summary\">{{ blameLabel(i + 1) }}</span>}\n <a class=\"o-n\" role=\"rowheader\" [routerLink]=\"[]\" [queryParamsHandling]=\"'preserve'\" [fragment]=\"'L' + (i + 1)\" (click)=\"pickLine(i + 1)\" [attr.aria-label]=\"'Line ' + (i + 1)\">{{ i + 1 }}</a>\n <span class=\"o-t\" role=\"cell\" [innerHTML]=\"l\"></span>\n </div>\n }\n </div>\n }\n </div>\n <span class=\"o-faint o-sm\">Click a line number to link to that line.</span>\n } @else if (!error()) {\n <div class=\"o-card\"><div class=\"o-empty\">Loading…</div></div>\n }\n } @else if (error()) {\n <div class=\"o-card o-empty\"><p>{{ error() }}</p></div>\n }\n </div>\n `,\n})\nexport class FilePage extends RepoPage {\n private readonly router = inject(Router);\n protected readonly blob = signal<Blob | null>(null);\n protected readonly blame = signal<BlameHunk[]>([]);\n protected readonly blaming = signal(false);\n protected readonly ref = signal('');\n protected readonly path = signal('');\n protected readonly line = signal(0);\n protected readonly view = signal<'preview' | 'code'>('preview');\n protected readonly copied = signal(false);\n protected readonly ago = (s?: string) => ago(s);\n protected readonly initials = initials;\n protected readonly crumbs = computed(() => {\n const parts = this.path().split('/').filter(Boolean);\n return parts.map((name, i) => ({ name, path: parts.slice(0, i + 1).join('/') }));\n });\n protected readonly meta = computed(() => {\n const b = this.blob();\n if (!b) return '';\n return [b.binary ? '' : `${b.lineCount} lines`, size(b.size), b.language ?? ''].filter(Boolean).join(' · ');\n });\n\n protected readonly mode = signal<'' | 'edit' | 'delete'>('');\n protected readonly text = signal<string | null>(null);\n protected readonly busy = signal(false);\n private readonly branches = signal<string[]>([]);\n /** The branch the view is on ('' for a tag or a commit, which cannot take commits). */\n protected readonly branch = computed(() => {\n const r = this.repo();\n const ref = this.ref() || r?.defaultBranch || '';\n return this.branches().includes(ref) ? ref : '';\n });\n protected readonly editable = computed(() => this.canWrite() && !!this.branch());\n\n constructor() {\n super();\n this.route.queryParamMap.subscribe((q) => {\n this.ref.set(q.get('ref') ?? '');\n this.path.set(q.get('path') ?? '');\n const r = this.repo();\n if (r && r.name === this.name()) this.load(r);\n });\n this.route.fragment.subscribe((f) => this.line.set(f?.startsWith('L') ? Number(f.slice(1)) || 0 : 0));\n }\n\n protected onRepo(r: Repo) {\n this.load(r);\n this.api.refs(this.projectId(), r.name, 'branch').subscribe({ next: (b) => this.branches.set(b.map((x) => x.name)), error: () => undefined });\n }\n\n protected startEdit() {\n const r = this.repo();\n if (!r) return;\n this.mode.set('edit');\n this.text.set(null);\n this.api.blob(this.projectId(), r.name, this.branch(), this.path(), true).subscribe({\n next: (b) => {\n if (b.text === undefined) { this.mode.set(''); this.error.set('This file cannot be edited in the browser.'); return; }\n this.blob.set(b);\n this.text.set(b.text);\n },\n error: (e) => { this.mode.set(''); this.error.set(apiMessage(e, 'Could not open the file.')); },\n });\n }\n\n /** Commits the edit (or the delete), onto the branch or onto a new branch with a pull request. */\n protected save(c: CommitChoice, del = false) {\n const r = this.repo();\n const b = this.blob();\n if (!r || !b) return;\n const body: CommitRequest = c.newBranch\n ? { branch: c.newBranch, from: this.branch(), message: c.message, pull: {} }\n : { branch: this.branch(), expect: b.commit, message: c.message };\n if (del) body.deletes = [b.path];\n else body.files = { [b.path]: this.text() ?? '' };\n this.busy.set(true);\n this.error.set('');\n this.api.commitFiles(this.projectId(), r.name, body).subscribe({\n next: (res) => {\n this.busy.set(false);\n this.mode.set('');\n if (res.pull) { void this.router.navigate(this.link('pull/' + res.pull)); return; }\n if (del) { void this.router.navigate(this.link(), { queryParams: { ref: res.branch, path: b.path.split('/').slice(0, -1).join('/') || null } }); return; }\n this.note.set(`Committed ${res.commit.short} to ${res.branch}.`);\n void this.router.navigate(this.link('blob'), { queryParams: { ref: res.branch, path: b.path } });\n this.load(r);\n },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not commit.')); },\n });\n }\n\n protected pickRef(ref: string) {\n void this.router.navigate(this.link('blob'), { queryParams: { ref, path: this.path() } });\n }\n\n protected pickLine(n: number) {\n this.line.set(n);\n }\n\n protected copyText() {\n const b = this.blob();\n if (!b) return;\n const div = document.createElement('div');\n const text = b.lines.map((l) => { div.innerHTML = l; return div.textContent ?? ''; }).join('\\n');\n void copy(text).then(() => { this.copied.set(true); setTimeout(() => this.copied.set(false), 1500); });\n }\n\n protected toggleBlame() {\n this.blaming.set(!this.blaming());\n const r = this.repo();\n if (this.blaming() && r && !this.blame().length) {\n this.api.blame(this.projectId(), r.name, this.ref() || r.defaultBranch, this.path()).subscribe({ next: (b) => this.blame.set(b), error: (e) => this.error.set(apiMessage(e, 'Could not load the blame.')) });\n }\n }\n\n protected blameAt(n: number): BlameHunk | undefined {\n return this.blame().find((h) => n >= h.startLine && n < h.startLine + h.lines);\n }\n\n /** The hunk's commit and author on its first line only. */\n protected blameLabel(n: number): string {\n const h = this.blameAt(n);\n return h && h.startLine === n ? `${h.commit.slice(0, 7)} ${h.author} · ${ago(h.when)}` : '';\n }\n\n private load(r: Repo) {\n if (!this.path()) return;\n this.blob.set(null);\n this.blame.set([]);\n this.blaming.set(false);\n this.api.blob(this.projectId(), r.name, this.ref() || r.defaultBranch, this.path()).subscribe({\n next: (b) => { this.blob.set(b); this.view.set(b.markdown ? 'preview' : 'code'); if (this.line()) setTimeout(() => document.getElementById('L' + this.line())?.scrollIntoView({ block: 'center' })); },\n error: (e) => this.error.set(apiMessage(e, `Could not open ${this.path()}.`)),\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router, RouterLink } from '@angular/router';\nimport { Commit, CommitDetail, Ref, Repo, apiMessage } from './code.api';\nimport { DiffView } from './diff.view';\nimport { RefPicker, RepoPage } from './repo-base';\nimport { ago, dayLabel, initials } from './look';\n\nconst PAGE = 30;\n\n// /{org}/{project}/code/{repo}/commits?ref=&path= (prototype \"code_commits\"): history grouped by\n// day, with the issue keys each message names.\n@Component({\n selector: 'o-code-commits',\n imports: [RouterLink, RefPicker],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page\">\n @if (repo(); as r) {\n <div class=\"o-ph\">\n <div class=\"o-col\"><span class=\"o-eyebrow\">{{ r.name }}{{ path() ? ' · ' + path() : '' }}</span><h1 class=\"o-t\">Commits</h1></div>\n <div class=\"o-acts\"><o-ref-picker [repo]=\"r.name\" [current]=\"ref() || r.defaultBranch\" (picked)=\"pickRef($event)\" /></div>\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @for (g of groups(); track g.day) {\n <span class=\"o-lbl\" style=\"margin-top:4px\">Commits on {{ g.day }}</span>\n <div class=\"o-card\">\n @for (c of g.items; track c.oid) {\n <div class=\"o-row\" [attr.data-testid]=\"'commit-' + c.short\">\n <div class=\"o-col\" style=\"gap:4px;flex:1;min-width:0\">\n <a class=\"o-b5 o-ell\" style=\"color:var(--o-tx)\" [routerLink]=\"link('commit/' + c.oid)\">{{ c.subject }}</a>\n <span class=\"o-flex o-faint o-sm o-wrap\"><span class=\"o-av\" aria-hidden=\"true\">{{ initials(c.author.name) }}</span>{{ c.author.name }} committed {{ ago(c.committer.when) }}\n @for (k of c.keys; track k) {<a class=\"o-chip o-blu\" [routerLink]=\"host.link('issues/' + k)\">{{ k }}</a>}\n </span>\n </div>\n <a class=\"o-btn o-sm o-mono\" [routerLink]=\"link('commit/' + c.oid)\">{{ c.short }}</a>\n <a class=\"o-btn o-sm\" [routerLink]=\"link()\" [queryParams]=\"{ ref: c.oid }\" title=\"Browse files at this commit\" [attr.aria-label]=\"'Browse files at ' + c.short\">‹›</a>\n </div>\n }\n </div>\n } @empty {\n <div class=\"o-card\"><div class=\"o-empty\">{{ loading() ? 'Loading…' : r.empty ? 'No commits yet: push to ' + r.defaultBranch + '.' : 'No commits.' }}</div></div>\n }\n @if (more()) {<button type=\"button\" class=\"o-btn o-sm\" style=\"align-self:center\" (click)=\"next()\" [disabled]=\"loading()\">Older commits</button>}\n } @else if (error()) {\n <div class=\"o-card o-empty\"><p>{{ error() }}</p></div>\n }\n </div>\n `,\n})\nexport class CommitsPage extends RepoPage {\n private readonly router = inject(Router);\n protected readonly commits = signal<Commit[]>([]);\n protected readonly ref = signal('');\n protected readonly path = signal('');\n protected readonly loading = signal(false);\n protected readonly more = signal(false);\n protected readonly ago = (s?: string) => ago(s);\n protected readonly initials = initials;\n protected readonly groups = computed(() => {\n const out: { day: string; items: Commit[] }[] = [];\n for (const c of this.commits()) {\n const d = dayLabel(c.committer.when);\n const last = out[out.length - 1];\n if (last?.day === d) last.items.push(c);\n else out.push({ day: d, items: [c] });\n }\n return out;\n });\n\n constructor() {\n super();\n this.route.queryParamMap.subscribe((q) => {\n this.ref.set(q.get('ref') ?? '');\n this.path.set(q.get('path') ?? '');\n const r = this.repo();\n if (r && r.name === this.name()) this.load(r, 0);\n });\n }\n\n protected onRepo(r: Repo) {\n this.load(r, 0);\n }\n\n protected pickRef(ref: string) {\n void this.router.navigate(this.link('commits'), { queryParams: { ref, path: this.path() || null } });\n }\n\n protected next() {\n const r = this.repo();\n if (r) this.load(r, this.commits().length);\n }\n\n private load(r: Repo, skip: number) {\n if (r.empty) return;\n this.loading.set(true);\n this.api.commits(this.projectId(), r.name, { ref: this.ref() || r.defaultBranch, path: this.path() || undefined, limit: PAGE, skip }).subscribe({\n next: (cs) => { this.loading.set(false); this.commits.set(skip ? [...this.commits(), ...cs] : cs); this.more.set(cs.length === PAGE); },\n error: (e) => { this.loading.set(false); this.error.set(apiMessage(e, 'Could not load the history.')); },\n });\n }\n}\n\n// /{org}/{project}/code/{repo}/commit/{sha} (prototype \"code_commit\"): the message, author, keys,\n// parents and every changed file's diff.\n@Component({\n selector: 'o-code-commit',\n imports: [RouterLink, DiffView],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page\">\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @if (commit(); as c) {\n <div class=\"o-card\">\n <div class=\"o-cb o-col\" style=\"gap:10px\">\n <h1 class=\"o-t\">{{ c.subject }}</h1>\n @if (c.body) {<span class=\"o-mut o-lh\" style=\"white-space:pre-wrap\">{{ c.body }}</span>}\n <div class=\"o-flex o-wrap o-sm\">\n <span class=\"o-av\" aria-hidden=\"true\">{{ initials(c.author.name) }}</span><b class=\"o-b5\">{{ c.author.name }}</b><span class=\"o-faint\">committed {{ ago(c.committer.when) }}</span>\n @for (k of c.keys; track k) {<a class=\"o-chip o-blu\" [routerLink]=\"host.link('issues/' + k)\">{{ k }}</a>}\n <span class=\"o-r o-mono o-faint\">commit {{ c.oid.slice(0, 10) }}@for (p of c.parents; track p) { · parent <a [routerLink]=\"link('commit/' + p)\">{{ p.slice(0, 7) }}</a>}</span>\n </div>\n </div>\n <div class=\"o-cf\"><a [routerLink]=\"link()\" [queryParams]=\"{ ref: c.oid }\">Browse files</a><span class=\"o-r\">{{ c.files.length }} {{ c.files.length === 1 ? 'file' : 'files' }} changed · <span class=\"o-grn-t\">+{{ c.additions }}</span> <span class=\"o-red-t\">−{{ c.deletions }}</span></span></div>\n </div>\n @for (f of c.files; track f.path) {\n <o-diff [repo]=\"name()\" [file]=\"f\" [head]=\"c.oid\" />\n }\n } @else if (!error()) {\n <div class=\"o-card\"><div class=\"o-empty\">Loading…</div></div>\n }\n </div>\n `,\n})\nexport class CommitPage extends RepoPage {\n protected readonly commit = signal<CommitDetail | null>(null);\n protected readonly ago = (s?: string) => ago(s);\n protected readonly initials = initials;\n private sha = '';\n\n constructor() {\n super();\n this.route.paramMap.subscribe((m) => {\n this.sha = m.get('sha') ?? '';\n const r = this.repo();\n if (r && r.name === this.name()) this.onRepo(r);\n });\n }\n\n protected onRepo(r: Repo) {\n if (!this.sha) return;\n this.commit.set(null);\n this.api.commit(this.projectId(), r.name, this.sha).subscribe({ next: (c) => this.commit.set(c), error: (e) => this.error.set(apiMessage(e, `Could not open commit ${this.sha.slice(0, 7)}.`)) });\n }\n}\n\n// /{org}/{project}/code/{repo}/branches (prototype \"code_branches\"): each branch with its last\n// commit, how far behind and ahead of the default branch it is, protection, its pull request, and\n// create, delete and delete-merged.\n@Component({\n selector: 'o-code-branches',\n imports: [FormsModule, RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`.ab{display:flex;align-items:center;gap:0;width:200px} .ab i{display:block;height:6px} .ab .l{flex:1;display:flex;justify-content:flex-end;border-right:1px solid var(--o-line-mid)} .ab .rr{flex:1}`],\n template: `\n <div class=\"o-page\">\n @if (repo(); as r) {\n <div class=\"o-ph\">\n <div class=\"o-col\"><span class=\"o-eyebrow\">{{ r.name }}</span><h1 class=\"o-t\">Branches</h1></div>\n @if (canWrite()) {\n <div class=\"o-acts\">\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"deleteMerged()\" [disabled]=\"busy()\">Delete merged</button>\n <button type=\"button\" class=\"o-btn o-sm o-dark\" (click)=\"adding.set(!adding())\" data-testid=\"new-branch\">+ New branch</button>\n </div>\n }\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @if (note()) {<div class=\"o-note\" role=\"status\">{{ note() }}</div>}\n @if (adding()) {\n <form class=\"o-card o-cb o-flex o-wrap\" (ngSubmit)=\"create()\">\n <div class=\"o-fld\" style=\"flex:1\"><label for=\"nb-name\">Branch name</label><input id=\"nb-name\" class=\"o-in o-mono\" name=\"name\" [(ngModel)]=\"newName\" data-testid=\"branch-name\" /></div>\n <div class=\"o-fld\"><label for=\"nb-from\">From</label><select id=\"nb-from\" class=\"o-in\" name=\"from\" [(ngModel)]=\"from\">@for (b of refs(); track b.name) {<option [value]=\"b.name\">{{ b.name }}</option>}</select></div>\n <button type=\"submit\" class=\"o-btn o-dark\" style=\"align-self:flex-end\" [disabled]=\"!newName.trim() || busy()\" data-testid=\"branch-create\">Create branch</button>\n </form>\n }\n <div class=\"o-card\" style=\"overflow-x:auto\">\n <div class=\"o-tbl\" role=\"table\" aria-label=\"Branches\" style=\"min-width:720px\">\n <div class=\"o-thead\" role=\"rowgroup\"><div class=\"o-tr\" role=\"row\"><div class=\"o-th\" role=\"columnheader\">Branch</div><div class=\"o-th\" role=\"columnheader\">Updated</div><div class=\"o-th\" role=\"columnheader\" style=\"width:220px\">Behind | Ahead of {{ r.defaultBranch }}</div><div class=\"o-th\" role=\"columnheader\">Pull request</div><div class=\"o-th\" role=\"columnheader\"></div></div></div>\n <div class=\"o-tbody\" role=\"rowgroup\">\n @for (b of refs(); track b.name) {\n <div class=\"o-tr\" role=\"row\" [attr.data-testid]=\"'branch-' + b.name\">\n <div class=\"o-td\" role=\"cell\"><span class=\"o-flex\"><a class=\"o-mono o-b5 o-sm\" [routerLink]=\"link()\" [queryParams]=\"{ ref: b.name }\">{{ b.name }}</a>@if (b.default) {<span class=\"o-chip\">default</span>}@if (b.protected) {<span class=\"o-chip o-amb\" [attr.title]=\"'Rule ' + b.rule\">protected</span>}@if (b.merged && !b.default) {<span class=\"o-chip o-vio\">merged</span>}</span></div>\n <div class=\"o-td o-mut o-sm\" role=\"cell\">@if (b.commit) {<span class=\"o-flex\"><span class=\"o-av\" aria-hidden=\"true\">{{ initials(b.commit.author.name) }}</span>{{ ago(b.commit.committer.when) }}</span>}</div>\n <div class=\"o-td\" role=\"cell\">\n @if (!b.default) {\n <div class=\"ab\" [attr.aria-label]=\"b.behind + ' behind, ' + b.ahead + ' ahead'\">\n <span class=\"o-mono o-xs o-faint\" style=\"width:26px;text-align:right;padding-right:4px\">{{ b.behind }}</span>\n <div class=\"l\"><i [style.width.%]=\"bar(b.behind)\" style=\"border-radius:3px 0 0 3px;background:var(--o-line-mid)\"></i></div>\n <div class=\"rr\"><i [style.width.%]=\"bar(b.ahead)\" style=\"border-radius:0 3px 3px 0;background:var(--o-acc)\"></i></div>\n <span class=\"o-mono o-xs o-faint\" style=\"width:26px;padding-left:4px\">{{ b.ahead }}</span>\n </div>\n }\n </div>\n <div class=\"o-td\" role=\"cell\">\n @if (pullFor(b.name); as pr) {<a [class]=\"pr.state === 'merged' ? 'o-chip o-vio' : pr.state === 'closed' ? 'o-chip' : 'o-chip o-blu'\" [routerLink]=\"link('pull/' + pr.number)\">#{{ pr.number }} {{ pr.state }}</a>}\n @else if (!b.default && b.ahead > 0 && canWrite()) {<a class=\"o-btn o-xs\" [routerLink]=\"link('pulls')\" [queryParams]=\"{ new: 1, source: b.name }\">New PR</a>}\n </div>\n <div class=\"o-td o-num\" role=\"cell\">@if (b.canDelete && canWrite()) {<button type=\"button\" class=\"o-btn o-xs o-ghost\" (click)=\"remove(b)\" [attr.aria-label]=\"'Delete ' + b.name\">Delete</button>}</div>\n </div>\n } @empty {\n <div class=\"o-empty\">{{ r.empty ? 'No branches yet: push to create ' + r.defaultBranch + '.' : 'Loading…' }}</div>\n }\n </div>\n </div>\n </div>\n } @else if (error()) {\n <div class=\"o-card o-empty\"><p>{{ error() }}</p></div>\n }\n </div>\n `,\n})\nexport class BranchesPage extends RepoPage {\n protected readonly refs = signal<Ref[]>([]);\n protected readonly pulls = signal<{ number: number; state: string; source: string }[]>([]);\n protected readonly adding = signal(false);\n protected readonly busy = signal(false);\n protected readonly ago = (s?: string) => ago(s);\n protected readonly initials = initials;\n protected newName = '';\n protected from = '';\n private readonly maxAB = computed(() => Math.max(1, ...this.refs().map((r) => Math.max(r.ahead, r.behind))));\n\n protected onRepo(r: Repo) {\n this.from = r.defaultBranch;\n this.load(r);\n }\n\n protected bar(n: number) {\n return n ? Math.max(4, (100 * n) / this.maxAB()) : 0;\n }\n\n protected pullFor(branch: string) {\n return this.pulls().find((p) => p.source === branch && p.state === 'open') ?? this.pulls().find((p) => p.source === branch);\n }\n\n protected create() {\n const r = this.repo();\n const n = this.newName.trim();\n if (!r || !n) return;\n this.busy.set(true);\n this.api.createBranch(this.projectId(), r.name, n, this.from || r.defaultBranch).subscribe({\n next: () => { this.busy.set(false); this.adding.set(false); this.newName = ''; this.note.set(`Branch ${n} created.`); this.load(r); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not create the branch.')); },\n });\n }\n\n protected remove(b: Ref) {\n const r = this.repo();\n if (!r) return;\n this.api.deleteBranch(this.projectId(), r.name, b.name).subscribe({\n next: () => { this.note.set(`Branch ${b.name} deleted.`); this.load(r); },\n error: (e) => this.error.set(apiMessage(e, `Could not delete ${b.name}.`)),\n });\n }\n\n protected deleteMerged() {\n const r = this.repo();\n if (!r) return;\n this.busy.set(true);\n this.api.deleteMerged(this.projectId(), r.name).subscribe({\n next: (res: any) => { this.busy.set(false); const n = (res?.deleted ?? res ?? []).length ?? 0; this.note.set(n ? `${n} merged ${n === 1 ? 'branch' : 'branches'} deleted.` : 'No merged branches to delete.'); this.load(r); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not delete merged branches.')); },\n });\n }\n\n private load(r: Repo) {\n if (r.empty) return;\n this.api.refs(this.projectId(), r.name, 'branch').subscribe({ next: (b) => this.refs.set(b), error: (e) => this.error.set(apiMessage(e, 'Could not load the branches.')) });\n this.api.pulls(this.projectId(), r.name, { state: 'all' }).subscribe({ next: (p) => this.pulls.set(p), error: () => undefined });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { forkJoin, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { CodeApi, Comparison, PullBrief, Ref, Repo, apiMessage } from './code.api';\nimport { CodeHost } from './host';\nimport { People, ago, checkDot } from './look';\n\ninterface Row extends PullBrief {\n repo: string;\n}\n\nconst REVIEW: Record<string, string> = { approved: 'Approved', changes_requested: 'Changes requested', review_required: 'Review required', commented: 'Commented', '': '' };\n\n// /{org}/{project}/code/pulls (every repository) and /code/{repo}/pulls (prototype \"code_pulls\"):\n// open, merged and closed pull requests with their checks, review state and comments; filters; and\n// the form that opens one (?new=1&source=).\n@Component({\n selector: 'o-code-pulls',\n imports: [FormsModule, RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`.st{border:none;background:none;padding:0;font-size:12px;font-weight:500;cursor:pointer;color:var(--o-mut)} .st.o-on{color:var(--o-tx)} .o-btn.o-on{background:var(--o-tx);border-color:var(--o-tx);color:var(--o-acc-fg)}`],\n template: `\n <div class=\"o-page\">\n <div class=\"o-ph\">\n <div class=\"o-col\"><span class=\"o-eyebrow\">{{ repoName() || host.project()?.key + ' · every repository' }}</span><h1 class=\"o-t\">Pull requests</h1></div>\n @if (canWrite() && repos().length) {<div class=\"o-acts\"><button type=\"button\" class=\"o-btn o-dark\" (click)=\"startNew('')\" data-testid=\"new-pull\">New pull request</button></div>}\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n\n @if (opening()) {\n <form class=\"o-card\" (ngSubmit)=\"open()\" aria-label=\"New pull request\">\n <div class=\"o-ch\"><b>New pull request</b></div>\n <div class=\"o-cb o-col\" style=\"gap:12px\">\n <div class=\"o-flex o-wrap\">\n @if (!repoName()) {\n <select class=\"o-in o-sm\" style=\"width:auto\" name=\"repo\" aria-label=\"Repository\" [ngModel]=\"newRepo()\" (ngModelChange)=\"pickRepo($event)\">@for (r of repos(); track r.name) {<option [value]=\"r.name\">{{ r.name }}</option>}</select>\n }\n <span class=\"o-faint o-sm\">into</span>\n <select class=\"o-in o-sm o-mono\" style=\"width:auto\" name=\"target\" aria-label=\"Target branch\" [ngModel]=\"target()\" (ngModelChange)=\"target.set($event); compare()\">@for (b of branches(); track b.name) {<option [value]=\"b.name\">{{ b.name }}</option>}</select>\n <span class=\"o-faint o-sm\">from</span>\n <select class=\"o-in o-sm o-mono\" style=\"width:auto\" name=\"source\" aria-label=\"Source branch\" [ngModel]=\"source()\" (ngModelChange)=\"source.set($event); compare()\" data-testid=\"pull-source\">\n <option value=\"\">Choose a branch</option>\n @for (b of branches(); track b.name) {@if (b.name !== target()) {<option [value]=\"b.name\">{{ b.name }}</option>}}\n </select>\n @if (cmp(); as c) {<span class=\"o-faint o-sm\">{{ c.ahead }} {{ c.ahead === 1 ? 'commit' : 'commits' }} · {{ c.files.length }} {{ c.files.length === 1 ? 'file' : 'files' }}</span>}\n </div>\n <div class=\"o-fld\"><label for=\"np-title\">Title</label><input id=\"np-title\" class=\"o-in\" name=\"title\" [(ngModel)]=\"title\" data-testid=\"pull-title\" /><span class=\"o-hint\">Put an issue key in the title or description to link it; “Closes PAY-142” closes it on merge.</span></div>\n <div class=\"o-fld\"><label for=\"np-body\">Description</label><textarea id=\"np-body\" class=\"o-in\" rows=\"5\" name=\"body\" [(ngModel)]=\"body\" style=\"height:auto;padding:8px 10px\"></textarea></div>\n <div class=\"o-fld\"><label for=\"np-rev\">Reviewers</label>\n <select id=\"np-rev\" class=\"o-in\" name=\"reviewer\" [(ngModel)]=\"reviewer\"><option value=\"\">Nobody yet</option>@for (p of host.people(); track p.id) {@if (p.id !== host.meId()) {<option [value]=\"p.id\">{{ p.name || p.email }}</option>}}</select>\n </div>\n </div>\n <div class=\"o-cf\"><label class=\"o-flex o-sm\"><input type=\"checkbox\" name=\"draft\" [(ngModel)]=\"draft\" />Open as a draft</label><button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"opening.set(false)\">Cancel</button><button type=\"submit\" class=\"o-btn o-sm o-dark\" [disabled]=\"busy() || !source() || !title.trim()\" data-testid=\"pull-open\">Open pull request</button></div>\n </form>\n }\n\n <div class=\"o-flex o-wrap\">\n <input class=\"o-in o-sm\" style=\"flex:1;min-width:240px\" placeholder=\"Search titles\" aria-label=\"Search titles\" [(ngModel)]=\"q\" (keydown.enter)=\"load()\" (blur)=\"load()\" />\n <button type=\"button\" class=\"o-btn o-sm\" [class.o-on]=\"mine()\" [attr.aria-pressed]=\"mine()\" (click)=\"mine.set(!mine()); load()\">Needs my review</button>\n <select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Author\" [(ngModel)]=\"author\" (ngModelChange)=\"load()\"><option value=\"\">Author</option>@for (p of host.people(); track p.id) {<option [value]=\"p.id\">{{ p.name || p.email }}</option>}</select>\n </div>\n <div class=\"o-card\">\n <div class=\"o-ch\"><div class=\"o-flex\" style=\"gap:14px\" role=\"group\" aria-label=\"State\">\n @for (s of states; track s.id) {<button type=\"button\" class=\"st\" [class.o-on]=\"state() === s.id\" [attr.aria-pressed]=\"state() === s.id\" (click)=\"state.set(s.id); load()\">{{ s.icon }} {{ s.label }}</button>}\n </div></div>\n @for (p of rows(); track p.repo + p.number) {\n <a class=\"o-row o-click\" style=\"align-items:flex-start\" [routerLink]=\"host.link('code/' + p.repo + '/pull/' + p.number)\" [attr.data-testid]=\"'pull-' + p.number\">\n <span [style.color]=\"p.state === 'merged' ? 'var(--o-vio)' : p.state === 'closed' ? 'var(--o-bad-solid)' : 'var(--o-ok)'\" style=\"margin-top:1px\" aria-hidden=\"true\">{{ p.state === 'merged' ? '⇄' : p.state === 'closed' ? '✕' : '●' }}</span>\n <div class=\"o-col\" style=\"gap:4px;flex:1;min-width:0\">\n <span class=\"o-flex o-wrap\"><b class=\"o-b5\" style=\"color:var(--o-tx)\">{{ p.title }}</b>@for (l of p.labels; track l) {<span class=\"o-chip o-out\">{{ l }}</span>}@if (p.draft) {<span class=\"o-chip\">Draft</span>}</span>\n <span class=\"o-faint o-sm\">#{{ p.number }} · {{ people().name(p.authorId) }} · @if (!repoName()) {{{ p.repo }} · }<span class=\"o-mono\">{{ p.source }}</span> → <span class=\"o-mono\">{{ p.target }}</span> · updated {{ ago(p.updatedAt) }}</span>\n </div>\n <span class=\"o-flex o-sm\"><span [class]=\"dot(p.checks)\" [attr.title]=\"'Checks: ' + (p.checks || 'none')\"></span><span class=\"o-mut\">{{ review(p.review) }}</span><span class=\"o-faint\" [attr.aria-label]=\"p.comments + ' comments'\">💬 {{ p.comments }}</span></span>\n </a>\n } @empty {\n <div class=\"o-empty\">{{ loading() ? 'Loading…' : repos().length ? 'No pull requests match.' : 'No repositories yet.' }}</div>\n }\n </div>\n </div>\n `,\n})\nexport class PullsPage {\n protected readonly host = inject(CodeHost);\n private readonly api = inject(CodeApi);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n\n protected readonly states = [{ id: 'open', label: 'Open', icon: '●' }, { id: 'merged', label: 'Merged', icon: '✓' }, { id: 'closed', label: 'Closed', icon: '✕' }];\n protected readonly repoName = signal('');\n protected readonly repos = signal<Repo[]>([]);\n protected readonly rows = signal<Row[]>([]);\n protected readonly state = signal('open');\n protected readonly mine = signal(false);\n protected readonly loading = signal(false);\n protected readonly error = signal('');\n protected readonly busy = signal(false);\n protected readonly opening = signal(false);\n protected readonly newRepo = signal('');\n protected readonly branches = signal<Ref[]>([]);\n protected readonly source = signal('');\n protected readonly target = signal('');\n protected readonly cmp = signal<Comparison | null>(null);\n protected q = '';\n protected author = '';\n protected title = '';\n protected body = '';\n protected reviewer = '';\n protected draft = false;\n private wantNew: { source: string } | null = null;\n\n protected readonly people = computed(() => new People(this.host.people()));\n protected readonly ago = (s?: string) => ago(s);\n protected readonly dot = checkDot;\n protected readonly review = (r: string) => REVIEW[r] ?? r.replace(/_/g, ' ');\n protected readonly canWrite = computed(() => {\n const p = this.host.project();\n return !!p && !p.archivedAt && p.capabilities.includes('code.write');\n });\n\n constructor() {\n this.route.paramMap.subscribe((m) => this.repoName.set(m.get('repo') ?? ''));\n this.route.queryParamMap.subscribe((q) => { if (q.get('new')) this.wantNew = { source: q.get('source') ?? '' }; });\n effect(() => {\n const p = this.host.project();\n this.repoName();\n if (p) untracked(() => this.api.repos(p.id).subscribe({\n next: (rs) => {\n const only = this.repoName();\n this.repos.set(only ? rs.filter((r) => r.name === only) : rs.filter((r) => !r.empty));\n this.load();\n if (this.wantNew) { this.startNew(this.wantNew.source); this.wantNew = null; }\n },\n error: (e) => this.error.set(apiMessage(e, 'Could not load the repositories.')),\n }));\n });\n }\n\n protected load() {\n const p = this.host.project();\n if (!p) return;\n const q = { state: this.state(), q: this.q.trim(), author: this.author, needsMyReview: this.mine() };\n const repos = this.repos();\n if (!repos.length) { this.rows.set([]); return; }\n this.loading.set(true);\n forkJoin(repos.map((r) => this.api.pulls(p.id, r.name, q).pipe(map((ps) => ps.map((x) => ({ ...x, repo: r.name }))), catchError(() => of([] as Row[]))))).subscribe({\n next: (lists) => {\n this.loading.set(false);\n this.rows.set(lists.flat().sort((a, b) => (b.updatedAt ?? '').localeCompare(a.updatedAt ?? '')));\n },\n error: (e) => { this.loading.set(false); this.error.set(apiMessage(e, 'Could not load the pull requests.')); },\n });\n }\n\n protected startNew(source: string) {\n const repo = this.repoName() || this.repos()[0]?.name || '';\n if (!repo) return;\n this.opening.set(true);\n this.title = '';\n this.body = '';\n this.pickRepo(repo, source);\n }\n\n protected pickRepo(name: string, source = '') {\n const p = this.host.project();\n const r = this.repos().find((x) => x.name === name);\n if (!p || !r) return;\n this.newRepo.set(name);\n this.target.set(r.defaultBranch);\n this.source.set(source);\n this.cmp.set(null);\n this.api.refs(p.id, name, 'branch').subscribe({ next: (b) => { this.branches.set(b); this.compare(); }, error: () => undefined });\n this.api.template(p.id, name, r.defaultBranch).subscribe({ next: (t) => { if (!this.body) this.body = t; }, error: () => undefined });\n }\n\n protected compare() {\n const p = this.host.project();\n if (!p || !this.source() || !this.target()) { this.cmp.set(null); return; }\n if (!this.title.trim()) this.title = this.source().replace(/^[^/]+\\//, '').replace(/[-_]/g, ' ');\n this.api.compare(p.id, this.newRepo(), this.target(), this.source()).subscribe({ next: (c) => this.cmp.set(c), error: () => this.cmp.set(null) });\n }\n\n protected open() {\n const p = this.host.project();\n if (!p) return;\n this.busy.set(true);\n this.error.set('');\n this.api.openPull(p.id, this.newRepo(), { source: this.source(), target: this.target(), title: this.title.trim(), body: this.body, draft: this.draft, reviewers: this.reviewer ? [this.reviewer] : [] }).subscribe({\n next: (pr) => { this.busy.set(false); void this.router.navigate(this.host.link(`code/${this.newRepo()}/pull/${pr.number}`)); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not open the pull request.')); },\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, HostListener, computed, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterLink } from '@angular/router';\nimport { marked } from 'marked';\nimport { Comparison, Pull, Repo, Thread, Timeline, apiMessage } from './code.api';\nimport { DiffView, LineComment, ThreadReply } from './diff.view';\nimport { RepoPage } from './repo-base';\nimport { ago, checkDot, initials } from './look';\n\ntype Tab = 'conversation' | 'commits' | 'files' | 'checks';\n\ninterface Event {\n at: string;\n kind: 'comment' | 'review' | 'thread';\n who: string;\n body?: string;\n state?: string;\n thread?: Thread;\n id: string;\n}\n\nconst METHOD: Record<string, { label: string; hint: string; done: string }> = {\n merge: { label: 'Create a merge commit', hint: 'All commits plus a merge commit', done: 'merged' },\n squash: { label: 'Squash and merge', hint: 'One commit on the target', done: 'squashed and merged' },\n rebase: { label: 'Rebase and merge', hint: 'The commits, linear history', done: 'rebased and merged' },\n};\n\n// /{org}/{project}/code/{repo}/pull/{n} (prototype \"code\"): the pull request's conversation, commits,\n// files changed with line threads, and checks; the merge box with the gate's rows, the merge method\n// and branch deletion; a review (comment, approve, request changes).\n@Component({\n selector: 'o-code-pull',\n imports: [FormsModule, RouterLink, DiffView],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`\n .badge{padding:3px 10px;border-radius:12px;font-size:12px;font-weight:500;color:var(--o-acc-fg)}\n .anchor{position:relative;align-self:center}\n .merge{display:flex;align-items:center;position:relative}\n .merge .go{height:32px;padding:0 14px;border-radius:7px 0 0 7px;border:none;font-size:13px;font-weight:500;color:var(--o-acc-fg);background:var(--o-ok);cursor:pointer}\n .merge .mn{height:32px;padding:0 10px;border:none;border-radius:0 7px 7px 0;font-size:12px;color:var(--o-acc-fg);background:var(--o-ok);border-left:1px solid rgba(255,255,255,.25);cursor:pointer}\n .merge button:disabled{background:var(--o-line-mid);cursor:not-allowed}\n .tl{display:flex;flex-direction:column;gap:10px;padding-left:14px;border-left:2px solid var(--o-line);margin-left:14px}\n .files-split{display:grid;grid-template-columns:210px minmax(0,1fr);gap:14px;align-items:start}\n .files-split:has(> :only-child){grid-template-columns:minmax(0,1fr)}\n .files-tree{position:sticky;top:8px;max-height:calc(100vh - 120px);overflow:auto}\n @media (max-width:900px){ .files-split{grid-template-columns:minmax(0,1fr)} .files-tree{display:none} }\n `],\n template: `\n <div style=\"max-width:1180px;margin:0 auto;padding:22px 24px 40px;display:flex;flex-direction:column;gap:16px\">\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @if (note()) {<div class=\"o-note\" role=\"status\">{{ note() }}</div>}\n @if (pr(); as p) {\n <div class=\"o-col\">\n <span class=\"o-eyebrow\">{{ name() }} · pull/{{ p.number }}</span>\n <h1 class=\"o-t\">{{ p.title }} <span class=\"o-faint\" style=\"font-weight:400\">#{{ p.number }}</span></h1>\n <div class=\"o-flex o-wrap o-mut\">\n <span class=\"badge\" [style.background]=\"badgeBg()\" data-testid=\"pull-state\">{{ badge() }}</span>\n <span>{{ people().name(p.authorId) }} {{ p.state === 'merged' ? 'merged' : 'wants to merge' }} {{ p.commits }} {{ p.commits === 1 ? 'commit' : 'commits' }} into</span>\n <span class=\"o-chip o-mono\">{{ p.target }}</span><span>from</span><span class=\"o-chip o-mono\">{{ p.source }}</span>\n </div>\n </div>\n <div class=\"o-tabs\" role=\"tablist\">\n @for (t of tabs(); track t.id) {<button type=\"button\" role=\"tab\" class=\"o-tab\" [class.o-on]=\"tab() === t.id\" [attr.aria-selected]=\"tab() === t.id\" (click)=\"pick(t.id)\">{{ t.label }}@if (t.n !== undefined) {<span class=\"o-n\">{{ t.n }}</span>}</button>}\n <span class=\"o-r\"></span>\n @if (p.state === 'open' && (p.canReview || myPending().length)) {\n <div class=\"anchor\">\n <button type=\"button\" class=\"o-btn o-sm o-pri\" (click)=\"reviewOpen.set(!reviewOpen())\" [attr.aria-expanded]=\"reviewOpen()\" aria-haspopup=\"dialog\" data-testid=\"review-open\">Review changes ⌄</button>\n @if (reviewOpen()) {\n <div class=\"o-menu\" role=\"dialog\" aria-label=\"Finish your review\" style=\"right:0;top:36px;width:380px;padding:14px;display:flex;flex-direction:column;gap:10px\">\n <b>Finish your review</b>\n <span class=\"o-faint o-sm\" data-testid=\"review-pending-note\">{{ myPending().length ? myPending().length + ' pending ' + (myPending().length === 1 ? 'comment' : 'comments') + ' included' : 'No pending comments' }}</span>\n <textarea class=\"o-in\" rows=\"3\" placeholder=\"Leave a comment\" aria-label=\"Review comment\" style=\"height:auto;padding:8px 10px\" [ngModel]=\"revBody()\" (ngModelChange)=\"revBody.set($event)\"></textarea>\n @for (k of reviewKinds(); track k.id) {\n <button type=\"button\" class=\"o-opt\" style=\"padding:8px 10px\" [class.o-on]=\"revKind() === k.id\" (click)=\"revKind.set(k.id)\"><span class=\"o-rad\" [class.o-on]=\"revKind() === k.id\"></span><span class=\"o-col\" style=\"gap:1px\"><b class=\"o-b5\">{{ k.label }}</b><span class=\"o-faint o-sm\">{{ k.hint }}</span></span></button>\n }\n <div class=\"o-flex\"><button type=\"button\" class=\"o-btn o-sm o-pri o-r\" (click)=\"submitReview()\" [disabled]=\"busy() || (revKind() !== 'approved' && !revBody().trim() && !(revKind() === 'commented' && myPending().length))\" data-testid=\"review-submit\">Submit review</button></div>\n </div>\n }\n </div>\n }\n </div>\n\n <div class=\"o-split\" style=\"grid-template-columns:minmax(0,1fr) 260px;gap:24px\">\n <div class=\"o-col\" style=\"gap:14px;min-width:0\">\n @switch (tab()) {\n @case ('conversation') {\n <div class=\"o-card\">\n <div style=\"padding:9px 14px;background:var(--o-well);border-bottom:1px solid var(--o-line-soft);color:var(--o-mut);font-size:12px\"><b style=\"color:var(--o-tx);font-weight:600\">{{ people().name(p.authorId) }}</b> opened this {{ ago(p.createdAt) }}</div>\n <div class=\"o-cb o-md\" style=\"font-size:13px\" [innerHTML]=\"p.body ? md(p.body) : '<p class=&quot;o-faint&quot;>No description.</p>'\"></div>\n </div>\n <div class=\"tl\">\n @for (e of events(); track e.id) {\n @switch (e.kind) {\n @case ('comment') {\n <div class=\"o-card o-cb o-col\" style=\"gap:6px\"><span class=\"o-sm o-mut\"><b style=\"color:var(--o-tx);font-weight:600\">{{ people().name(e.who) }}</b> commented {{ ago(e.at) }}</span><div class=\"o-md\" style=\"font-size:13px\" [innerHTML]=\"md(e.body ?? '')\"></div></div>\n }\n @case ('review') {\n <span [style.color]=\"e.state === 'approved' ? 'var(--o-ok-tx)' : e.state === 'changes_requested' ? 'var(--o-bad-tx)' : 'var(--o-mut)'\">{{ people().name(e.who) }} {{ reviewVerb(e.state) }} · {{ ago(e.at) }}@if (e.body) {: “{{ e.body }}”}</span>\n }\n @case ('thread') {\n <div class=\"o-card o-cb o-col\" style=\"gap:6px\">\n <span class=\"o-sm o-mut\"><b style=\"color:var(--o-tx);font-weight:600\">{{ people().name(e.who) }}</b> commented on <button type=\"button\" class=\"o-lnk o-mono\" (click)=\"pick('files')\">{{ e.thread!.path }}</button> line {{ e.thread!.line }}@if (e.thread!.outdated) { · <span class=\"o-chip\">Outdated</span>}</span>\n @for (c of e.thread!.comments; track c.id) {<span class=\"o-sm\"><b class=\"o-b5\">{{ people().name(c.authorId) }}</b> {{ c.body }}</span>}\n <div class=\"o-flex\"><span class=\"o-faint o-sm\">{{ e.thread!.resolved ? 'Resolved' + (e.thread!.resolvedBy ? ' by ' + people().name(e.thread!.resolvedBy) : '') : 'Unresolved' }}</span>@if (p.state === 'open') {<button type=\"button\" class=\"o-lnk o-r\" (click)=\"resolve({ threadId: e.thread!.id, resolved: !e.thread!.resolved })\">{{ e.thread!.resolved ? 'Unresolve' : 'Resolve conversation' }}</button>}</div>\n </div>\n }\n }\n }\n @if (p.state === 'merged') {<span style=\"color:var(--o-vio-tx)\" data-testid=\"merged-line\">{{ people().name(p.mergedBy) }} {{ methodDone(p.mergeMethod) }} into {{ p.target }} · {{ ago(p.mergedAt) }}</span>}\n @if (p.state === 'closed') {<span class=\"o-red-t\">Closed {{ ago(p.closedAt) }}</span>}\n </div>\n\n <div class=\"o-card\" [style.border-color]=\"p.state === 'open' ? (p.gate.mergeable ? 'var(--o-ok)' : 'var(--o-line-mid)') : null\" data-testid=\"merge-box\">\n <div class=\"o-cb o-col\" style=\"gap:10px;border-bottom:1px solid var(--o-line-soft)\">\n <span style=\"font-weight:600;font-size:14px\" [style.color]=\"p.state === 'merged' ? 'var(--o-vio-tx)' : p.gate.mergeable ? 'var(--o-ok-tx)' : 'var(--o-tx)'\">{{ p.state === 'merged' ? 'Merged' : p.state === 'closed' ? 'Closed without merging' : p.gate.title }}</span>\n @if (p.state === 'open') {\n @for (r of p.gate.rows; track $index) {\n <div class=\"o-flex\"><span [class]=\"rowDot(r.status)\" aria-hidden=\"true\"></span><span>{{ r.text }}</span><span class=\"o-r o-faint o-sm\">{{ r.meta }}</span></div>\n }\n }\n </div>\n @if (p.state === 'open') {\n <div class=\"o-flex o-wrap\" style=\"padding:12px 14px;background:var(--o-well)\">\n @if (p.canReview && !approvedByMe()) {<button type=\"button\" class=\"o-btn\" (click)=\"approve()\" [disabled]=\"busy()\" data-testid=\"approve\">Approve</button>}\n @if (p.canEdit) {<button type=\"button\" class=\"o-btn o-ghost\" (click)=\"close(false)\" [disabled]=\"busy()\">Close</button>}\n @if (p.canMerge) {\n <span class=\"o-faint o-sm\">Delete branch after merge</span><button type=\"button\" class=\"o-tog\" role=\"switch\" aria-label=\"Delete branch after merge\" [class.o-on]=\"delBranch()\" [attr.aria-checked]=\"delBranch()\" (click)=\"delBranch.set(!delBranch())\"></button>\n <div class=\"merge o-r\">\n <button type=\"button\" class=\"go\" (click)=\"merge()\" [disabled]=\"!p.gate.mergeable || busy()\" data-testid=\"merge\">{{ methodLabel(method()) }}</button>\n <button type=\"button\" class=\"mn\" (click)=\"mergeMenu.set(!mergeMenu())\" [attr.aria-expanded]=\"mergeMenu()\" aria-label=\"Choose the merge method\" [disabled]=\"busy()\">⌄</button>\n @if (mergeMenu()) {\n <div class=\"o-menu\" role=\"menu\" style=\"right:0;bottom:40px;width:300px\">\n @for (m of p.mergeMethods; track m) {<button type=\"button\" role=\"menuitemradio\" [attr.aria-checked]=\"method() === m\" (click)=\"method.set(m); mergeMenu.set(false)\"><span class=\"o-col\" style=\"gap:1px\"><b class=\"o-b5\">{{ methodLabel(m) }}</b><span class=\"o-faint o-xs\">{{ methodHint(m) }}</span></span></button>}\n </div>\n }\n </div>\n }\n </div>\n } @else if (p.state === 'closed' && p.canEdit) {\n <div class=\"o-flex\" style=\"padding:12px 14px;background:var(--o-well)\"><button type=\"button\" class=\"o-btn o-r\" (click)=\"close(true)\" [disabled]=\"busy()\">Reopen</button></div>\n } @else if (p.state === 'merged') {\n <div class=\"o-flex\" style=\"padding:12px 14px;background:var(--o-well)\"><span class=\"o-mut\">{{ p.sourceDeleted ? 'Branch ' + p.source + ' deleted.' : 'Branch ' + p.source + ' can be deleted.' }}</span>@if (p.mergedSha) {<a class=\"o-btn o-r\" [routerLink]=\"link('commit/' + p.mergedSha)\">View {{ p.mergedSha.slice(0, 7) }}</a>}</div>\n }\n </div>\n\n <div class=\"o-card\">\n <label class=\"o-sr-only\" for=\"pr-cmt\">Add a comment</label>\n <textarea id=\"pr-cmt\" class=\"o-in\" style=\"border:none;box-shadow:none;min-height:70px;height:auto;padding:10px 12px\" placeholder=\"Add a comment. Markdown works.\" [ngModel]=\"draft()\" (ngModelChange)=\"draft.set($event)\" data-testid=\"pull-comment\"></textarea>\n <div class=\"o-cf\"><span>Markdown</span><button type=\"button\" class=\"o-btn o-sm o-dark o-r\" (click)=\"addComment()\" [disabled]=\"!draft().trim() || busy()\" data-testid=\"pull-comment-add\">Comment</button></div>\n </div>\n }\n @case ('commits') {\n <div class=\"o-card\">\n @for (c of cmp()?.commits ?? []; track c.oid) {\n <div class=\"o-row\"><span class=\"o-av\" aria-hidden=\"true\">{{ initials(c.author.name) }}</span><a class=\"o-ell\" style=\"flex:1;color:var(--o-tx)\" [routerLink]=\"link('commit/' + c.oid)\">{{ c.subject }}</a><a class=\"o-mono o-sm o-faint\" [routerLink]=\"link('commit/' + c.oid)\">{{ c.short }}</a></div>\n } @empty {<div class=\"o-empty\">{{ cmp() ? 'No commits.' : 'Loading…' }}</div>}\n </div>\n }\n @case ('files') {\n @if (batch().length) {\n <div class=\"o-note o-blu o-flex\" data-testid=\"suggestion-batch\"><span>{{ batch().length }} {{ batch().length === 1 ? 'suggestion' : 'suggestions' }} in a batch</span>\n <button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"batch.set([])\">Clear</button>\n <button type=\"button\" class=\"o-btn o-sm o-pri\" (click)=\"applySuggestions(batch())\" [disabled]=\"busy()\" data-testid=\"suggestion-commit\">Commit suggestions</button>\n </div>\n }\n <div class=\"o-flex o-wrap\">\n <div class=\"o-seg\" role=\"group\" aria-label=\"Diff view\"><button type=\"button\" [class.o-on]=\"mode() === 'unified'\" [attr.aria-pressed]=\"mode() === 'unified'\" (click)=\"setMode('unified')\">Unified</button><button type=\"button\" [class.o-on]=\"mode() === 'split'\" [attr.aria-pressed]=\"mode() === 'split'\" (click)=\"setMode('split')\" data-testid=\"diff-split\">Split</button></div>\n <button type=\"button\" class=\"o-btn o-sm\" [class.o-on]=\"hideWs()\" [attr.aria-pressed]=\"hideWs()\" (click)=\"hideWs.set(!hideWs())\" data-testid=\"hide-ws\">Hide whitespace</button>\n @if (myPending().length) {<span class=\"o-chip o-amb\" data-testid=\"pending-count\">{{ myPending().length }} pending {{ myPending().length === 1 ? 'comment' : 'comments' }}</span>}\n <span class=\"o-r o-faint o-sm\" data-testid=\"viewed-note\">{{ viewedCount() }} of {{ cmp()?.files?.length ?? 0 }} files viewed · {{ openThreads() }} unresolved {{ openThreads() === 1 ? 'conversation' : 'conversations' }}</span>\n </div>\n <div class=\"files-split\">\n @if ((cmp()?.files?.length ?? 0) > 1) {\n <div class=\"o-card files-tree\" role=\"navigation\" aria-label=\"Files\">\n @for (f of cmp()?.files ?? []; track f.path) {\n <button type=\"button\" class=\"o-row o-click o-sm\" style=\"width:100%;border:none;background:none;text-align:left\" (click)=\"jump(f.path)\"><span class=\"o-cbx\" [class.o-on]=\"isViewed(f.path)\" aria-hidden=\"true\"></span><span class=\"o-mono o-ell\" style=\"flex:1\">{{ f.path }}</span><span class=\"o-grn-t o-xs\">+{{ f.additions }}</span></button>\n }\n </div>\n }\n <div class=\"o-col\" style=\"gap:14px;min-width:0\">\n @for (f of cmp()?.files ?? []; track f.path) {\n <o-diff [repo]=\"name()\" [file]=\"f\" [head]=\"p.headSha\" [base]=\"p.mergeBase\" [threads]=\"threads()\" [canComment]=\"p.state === 'open'\" [mode]=\"mode()\" [ignoreSpace]=\"hideWs()\"\n [viewed]=\"isViewed(f.path)\" [reviewing]=\"myPending().length > 0\" (viewedChange)=\"setViewed(f.path, $event)\"\n [canApply]=\"p.state === 'open' && canWrite()\" [batch]=\"batch()\" (batchToggle)=\"toggleBatch($event)\" (apply)=\"applySuggestions($event)\"\n (comment)=\"lineComment($event)\" (reply)=\"reply($event)\" (resolve)=\"resolve($event)\" (discard)=\"discard($event)\" />\n } @empty {<div class=\"o-card\"><div class=\"o-empty\">{{ cmp() ? 'No changes.' : 'Loading…' }}</div></div>}\n </div>\n </div>\n }\n @case ('checks') {\n <div class=\"o-card\">\n @for (c of p.checks; track c.id) {\n <div class=\"o-row\"><span [class]=\"dot(c.state)\" aria-hidden=\"true\"></span><span class=\"o-mono o-sm\">{{ c.context }}</span><span class=\"o-faint\">{{ c.description }}</span>@if (c.url) {<a class=\"o-r o-sm\" [href]=\"c.url\" target=\"_blank\" rel=\"noopener\">Details</a>}</div>\n } @empty {<div class=\"o-empty\">No checks reported on {{ p.headSha.slice(0, 7) }}. Pipelines report here once Deploy is set up.</div>}\n </div>\n }\n }\n </div>\n\n <div class=\"o-col\" style=\"gap:18px;font-size:13px\">\n <div class=\"o-col\">\n <span class=\"o-lbl\">Reviewers</span>\n @for (r of reviewers(); track r.id) {<div class=\"o-flex\"><span class=\"o-av\" aria-hidden=\"true\">{{ people().initials(r.id) }}</span><span>{{ people().name(r.id) }}</span><span class=\"o-r o-sm\" [style.color]=\"r.colour\">{{ r.label }}</span></div>}\n @if (!reviewers().length) {<span class=\"o-faint o-sm\">No reviewers yet.</span>}\n <span class=\"o-faint o-xs\">Code owners of changed paths (CODEOWNERS) are asked automatically.</span>\n </div>\n <div class=\"o-col\"><span class=\"o-lbl\">Labels</span><div class=\"o-flex o-wrap\">@for (l of p.labels; track l) {<span class=\"o-chip o-out\">{{ l }}</span>}@if (!p.labels.length) {<span class=\"o-faint o-sm\">None</span>}</div></div>\n <div class=\"o-col\">\n <span class=\"o-lbl\">Linked issues</span>\n @for (k of p.keys; track k) {<a class=\"o-card o-cb o-click o-col\" style=\"gap:4px;padding:10px 12px;color:var(--o-tx)\" [routerLink]=\"host.link('issues/' + k)\"><span class=\"o-mono o-xs o-mut\">{{ k }}</span></a>}\n @if (!p.keys.length) {<span class=\"o-faint o-sm\">Name an issue key in the title or description to link it.</span>}\n </div>\n <div class=\"o-col\"><span class=\"o-lbl\">Deployments</span><span class=\"o-faint o-sm\">Releases that contain this pull request appear here after merge.</span></div>\n @if (canProtect()) {<div class=\"o-col\"><span class=\"o-lbl\">Branch protection · {{ p.target }}</span><a class=\"o-sm\" [routerLink]=\"link('settings')\" [queryParams]=\"{ section: 'protect' }\">Edit rules</a></div>}\n </div>\n </div>\n } @else if (!error()) {\n <div class=\"o-card\"><div class=\"o-empty\">Loading…</div></div>\n }\n </div>\n `,\n})\nexport class PullPage extends RepoPage {\n private readonly el = inject(ElementRef);\n protected readonly pr = signal<Pull | null>(null);\n protected readonly timeline = signal<Timeline>({ comments: [], reviews: [], threads: [] });\n protected readonly cmp = signal<Comparison | null>(null);\n protected readonly tab = signal<Tab>('conversation');\n protected readonly busy = signal(false);\n protected readonly draft = signal('');\n protected readonly reviewOpen = signal(false);\n protected readonly revBody = signal('');\n protected readonly revKind = signal<'commented' | 'approved' | 'changes_requested'>('commented');\n protected readonly mergeMenu = signal(false);\n protected readonly method = signal('merge');\n protected readonly delBranch = signal(false);\n private number = 0;\n\n protected readonly ago = (s?: string) => ago(s);\n protected readonly initials = initials;\n protected readonly dot = checkDot;\n protected readonly threads = computed(() => this.timeline().threads);\n protected readonly mode = signal<'unified' | 'split'>(readPref('origine.diff.mode') === 'split' ? 'split' : 'unified');\n protected readonly hideWs = signal(false);\n /** Files marked viewed, kept per pull request head in this browser (a new push resets them). */\n protected readonly viewed = signal<Record<string, boolean>>({});\n protected readonly viewedCount = computed(() => (this.cmp()?.files ?? []).filter((f) => this.viewed()[f.path]).length);\n /** The caller's pending review comments (shown only to them until the review is submitted). */\n protected readonly myPending = computed(() => {\n const me = this.host.meId();\n const t = this.timeline();\n return [...t.comments, ...t.threads.flatMap((th) => th.comments)].filter((c, i, all) => c.pending && c.authorId === me && all.findIndex((x) => x.id === c.id) === i);\n });\n protected readonly openThreads = computed(() => this.threads().filter((t) => !t.resolved && !t.outdated).length);\n protected readonly tabs = computed(() => {\n const p = this.pr();\n return [\n { id: 'conversation' as Tab, label: 'Conversation', n: undefined },\n { id: 'commits' as Tab, label: 'Commits', n: p?.commits },\n { id: 'files' as Tab, label: 'Files changed', n: this.cmp()?.files.length },\n { id: 'checks' as Tab, label: 'Checks', n: p?.checks.length },\n ];\n });\n protected readonly badge = computed(() => {\n const p = this.pr();\n return !p ? '' : p.state === 'merged' ? 'Merged' : p.state === 'closed' ? 'Closed' : p.draft ? 'Draft' : 'Open';\n });\n protected readonly badgeBg = computed(() => ({ Merged: 'var(--o-vio)', Closed: 'var(--o-bad-solid)', Draft: 'var(--o-dim)', Open: 'var(--o-ok)' } as Record<string, string>)[this.badge()] ?? 'var(--o-dim)');\n protected readonly approvedByMe = computed(() => (this.pr()?.reviews ?? []).some((r) => r.authorId === this.host.meId() && r.state === 'approved' && !r.stale));\n protected readonly reviewKinds = computed(() => {\n const need = this.pr()?.gate.rows.find((r) => /required by branch protection|requires/.test(r.text + (r.meta ?? '')));\n const comment = { id: 'commented' as const, label: 'Comment', hint: 'General feedback without approving.' };\n // the author (or a role that cannot push) still posts their pending comments as a review\n if (!this.pr()?.canReview) return [{ ...comment, hint: 'Post your pending comments.' }];\n return [\n comment,\n { id: 'approved' as const, label: 'Approve', hint: need ? `Counts toward the approvals ${this.pr()?.target} requires.` : 'Approve these changes.' },\n { id: 'changes_requested' as const, label: 'Request changes', hint: 'Blocks merge until you approve.' },\n ];\n });\n protected readonly reviewers = computed(() => {\n const p = this.pr();\n if (!p) return [];\n const ids = [...new Set([...p.reviewers, ...p.reviews.map((r) => r.authorId)])];\n return ids.map((id) => {\n const r = p.reviews.find((x) => x.authorId === id);\n const state = r ? (r.stale ? 'stale' : r.state) : 'requested';\n const label = { approved: 'Approved', changes_requested: 'Changes requested', commented: 'Commented', dismissed: 'Dismissed', stale: 'Approved an older commit', requested: 'Requested' }[state] ?? state;\n const colour = state === 'approved' ? 'var(--o-ok-tx)' : state === 'changes_requested' ? 'var(--o-bad-tx)' : 'var(--o-dim)';\n return { id, label, colour };\n });\n });\n protected readonly events = computed<Event[]>(() => {\n const t = this.timeline();\n const out: Event[] = [];\n for (const c of t.comments) if (!c.threadId) out.push({ id: 'c' + c.id, at: c.createdAt, kind: 'comment', who: c.authorId, body: c.body + (c.pending ? ' (pending)' : '') });\n for (const r of t.reviews) if (r.state !== 'pending') out.push({ id: 'r' + r.id, at: r.submittedAt ?? r.createdAt, kind: 'review', who: r.authorId, state: r.state, body: r.body });\n for (const th of t.threads) out.push({ id: 't' + th.id, at: th.createdAt, kind: 'thread', who: th.createdBy, thread: th });\n return out.sort((a, b) => a.at.localeCompare(b.at));\n });\n\n constructor() {\n super();\n this.route.paramMap.subscribe((m) => {\n this.number = Number(m.get('number') ?? 0);\n const r = this.repo();\n if (r && r.name === this.name()) this.onRepo(r);\n });\n }\n\n protected onRepo(_: Repo) {\n if (this.number) this.load(true);\n }\n\n protected md(s: string): string {\n return marked.parse(s || '', { async: false, gfm: true, breaks: true }) as string;\n }\n\n protected pick(t: Tab) {\n this.tab.set(t);\n }\n\n protected methodLabel(m: string) {\n return METHOD[m]?.label.replace('Create a merge commit', 'Merge pull request') ?? m;\n }\n\n protected methodHint(m: string) {\n return METHOD[m]?.hint ?? '';\n }\n\n protected methodDone(m?: string) {\n return METHOD[m ?? 'merge']?.done ?? 'merged';\n }\n\n protected reviewVerb(state?: string) {\n return state === 'approved' ? 'approved these changes' : state === 'changes_requested' ? 'requested changes' : state === 'dismissed' ? 'had a review dismissed' : 'reviewed';\n }\n\n protected rowDot(status: string) {\n return status === 'ok' ? 'o-dot o-grn' : status === 'failed' ? 'o-dot o-red' : 'o-dot o-amb';\n }\n\n protected approve() {\n this.sendReview('approved', '');\n }\n\n protected submitReview() {\n this.sendReview(this.revKind(), this.revBody().trim());\n }\n\n protected addComment() {\n const body = this.draft().trim();\n if (!body) return;\n this.run(this.api.comment(this.projectId(), this.name(), this.number, { body }), 'Could not add the comment.', () => this.draft.set(''));\n }\n\n protected lineComment(c: LineComment) {\n this.run(this.api.comment(this.projectId(), this.name(), this.number, { body: c.body, path: c.path, side: c.side, line: c.line, pending: c.pending }), 'Could not add the comment.',\n () => { if (c.pending) this.note.set('Added to your review. Submit it from Review changes to post your comments.'); });\n }\n\n protected readonly batch = signal<string[]>([]);\n\n protected toggleBatch(id: string) {\n const b = this.batch();\n this.batch.set(b.includes(id) ? b.filter((x) => x !== id) : [...b, id]);\n }\n\n /** Commits one suggestion, or the batch, onto the pull request's branch. */\n protected applySuggestions(ids: string[]) {\n this.run(this.api.applySuggestions(this.projectId(), this.name(), this.number, ids), 'Could not apply the suggestion.', () => {\n this.note.set(ids.length === 1 ? 'Suggestion applied.' : `${ids.length} suggestions applied in one commit.`);\n this.batch.set([]);\n });\n }\n\n protected discard(id: string) {\n this.run(this.api.discardComment(this.projectId(), this.name(), this.number, id), 'Could not discard the comment.');\n }\n\n protected setMode(m: 'unified' | 'split') {\n this.mode.set(m);\n writePref('origine.diff.mode', m);\n }\n\n private viewedKey() {\n return `origine.viewed.${this.projectId()}.${this.name()}.${this.number}.${this.pr()?.headSha ?? ''}`;\n }\n\n protected isViewed(path: string) {\n return !!this.viewed()[path];\n }\n\n protected setViewed(path: string, on: boolean) {\n const v = { ...this.viewed(), [path]: on };\n if (!on) delete v[path];\n this.viewed.set(v);\n writePref(this.viewedKey(), JSON.stringify(v));\n }\n\n protected jump(path: string) {\n const el = (this.el.nativeElement as HTMLElement).querySelector(`[id=\"file-${CSS.escape(path)}\"]`);\n el?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n\n protected reply(r: ThreadReply) {\n this.run(this.api.comment(this.projectId(), this.name(), this.number, { body: r.body, threadId: r.threadId }), 'Could not reply.');\n }\n\n protected resolve(e: { threadId: string; resolved: boolean }) {\n this.run(this.api.resolve(this.projectId(), this.name(), this.number, e.threadId, e.resolved), 'Could not change the conversation.');\n }\n\n protected merge() {\n const p = this.pr();\n if (!p) return;\n this.run(this.api.merge(this.projectId(), this.name(), this.number, { method: this.method(), deleteBranch: this.delBranch(), expectHead: p.headSha }), 'Could not merge.', () => this.note.set(`Merged into ${p.target}.`));\n }\n\n protected close(reopen: boolean) {\n this.run(this.api.closePull(this.projectId(), this.name(), this.number, reopen), reopen ? 'Could not reopen.' : 'Could not close.');\n }\n\n @HostListener('document:click', ['$event'])\n protected outside(e: MouseEvent) {\n const t = e.target as HTMLElement;\n if (this.reviewOpen() && !t.closest('.anchor')) this.reviewOpen.set(false);\n if (this.mergeMenu() && !t.closest('.merge')) this.mergeMenu.set(false);\n }\n\n private sendReview(state: 'commented' | 'approved' | 'changes_requested', body: string) {\n this.run(this.api.review(this.projectId(), this.name(), this.number, state, body), 'Could not submit the review.', () => { this.reviewOpen.set(false); this.revBody.set(''); });\n }\n\n private run(o: import('rxjs').Observable<unknown>, fallback: string, after?: () => void) {\n this.busy.set(true);\n this.error.set('');\n o.subscribe({\n next: () => { this.busy.set(false); after?.(); this.load(false); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, fallback)); this.load(false); },\n });\n }\n\n private load(first: boolean) {\n const project = this.projectId();\n this.api.pull(project, this.name(), this.number).subscribe({\n next: (p) => {\n const headChanged = this.pr()?.headSha !== p.headSha;\n this.pr.set(p);\n if (headChanged) {\n try { this.viewed.set(JSON.parse(readPref(this.viewedKey()) || '{}')); } catch { this.viewed.set({}); }\n }\n if (first) {\n this.method.set(p.mergeMethods[0] ?? 'merge');\n this.delBranch.set(p.deleteBranchOnMerge);\n }\n if (first || !this.cmp() || this.cmp()!.head !== p.headSha) {\n this.api.compare(project, this.name(), p.mergeBase || p.targetSha, p.headSha).subscribe({ next: (c) => this.cmp.set(c), error: () => this.cmp.set({ base: '', head: p.headSha, mergeBase: '', ahead: 0, behind: 0, commits: [], files: [] }) });\n }\n },\n error: (e) => this.error.set(e?.status === 404 ? `There is no pull request #${this.number} in ${this.name()}.` : apiMessage(e, 'Could not open the pull request.')),\n });\n this.api.conversation(project, this.name(), this.number).subscribe({ next: (t) => this.timeline.set(t), error: () => undefined });\n }\n}\n\n// Per-viewer conveniences (the diff view, files viewed); storage can be missing or blocked.\nfunction readPref(key: string): string {\n try {\n return localStorage.getItem(key) ?? '';\n } catch {\n return '';\n }\n}\n\nfunction writePref(key: string, value: string) {\n try {\n localStorage.setItem(key, value);\n } catch {\n /* private window or blocked storage: the setting lasts for this page only */\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { Protection, Ref, Repo, apiMessage, Collaborator } from './code.api';\nimport { RepoPage } from './repo-base';\n\ntype Section = 'general' | 'protect' | 'collab' | 'danger';\n\ninterface RuleForm {\n id: string;\n pattern: string;\n blockDirectPush: boolean;\n blockForcePush: boolean;\n blockDeletion: boolean;\n requiredApprovals: number;\n dismissStaleApprovals: boolean;\n requireUpToDate: boolean;\n requireCodeOwnerReview: boolean;\n requiredChecks: string[];\n}\n\nconst BLANK: RuleForm = { id: '', pattern: '', blockDirectPush: true, blockForcePush: true, blockDeletion: true, requiredApprovals: 1, dismissStaleApprovals: true, requireUpToDate: false, requireCodeOwnerReview: false, requiredChecks: [] };\n\n// /{org}/{project}/code/{repo}/settings?section= (prototype \"code_settings\"): general settings and\n// merge methods, branch protection rules, and the danger zone (archive, delete).\n@Component({\n selector: 'o-code-settings',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page\">\n @if (repo(); as r) {\n <div class=\"o-split o-lft\">\n <nav class=\"o-setnav\" aria-label=\"Repository settings\">\n <span class=\"o-lbl\" style=\"padding-top:0\">{{ r.name }}</span>\n <button type=\"button\" [class.o-on]=\"section() === 'general'\" (click)=\"go('general')\">General</button>\n <button type=\"button\" [class.o-on]=\"section() === 'protect'\" (click)=\"go('protect')\">Branch protection</button>\n <button type=\"button\" [class.o-on]=\"section() === 'collab'\" (click)=\"go('collab')\">Collaborators</button>\n <button type=\"button\" [class.o-on]=\"section() === 'danger'\" (click)=\"go('danger')\">Danger zone</button>\n </nav>\n <div class=\"o-col\" style=\"gap:16px;min-width:0\">\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @if (note()) {<div class=\"o-note\" role=\"status\">{{ note() }}</div>}\n @switch (section()) {\n @case ('general') {\n <h1 class=\"o-t\">General</h1>\n <form class=\"o-card o-cb o-form\" (ngSubmit)=\"saveGeneral()\">\n <div class=\"o-g2\">\n <div class=\"o-fld\"><label for=\"rs-name\">Repository name</label><input id=\"rs-name\" class=\"o-in o-mono\" name=\"name\" [(ngModel)]=\"g.name\" [disabled]=\"!canAdmin()\" /><span class=\"o-hint\">Renaming keeps the old clone URL working as a redirect.</span></div>\n <div class=\"o-fld\"><label for=\"rs-def\">Default branch</label><select id=\"rs-def\" class=\"o-in\" name=\"def\" [(ngModel)]=\"g.defaultBranch\" [disabled]=\"!canMaintain()\">@for (b of branches(); track b.name) {<option [value]=\"b.name\">{{ b.name }}</option>}@if (!branches().length) {<option [value]=\"r.defaultBranch\">{{ r.defaultBranch }}</option>}</select></div>\n </div>\n <div class=\"o-fld\"><label for=\"rs-desc\">Description</label><input id=\"rs-desc\" class=\"o-in\" name=\"desc\" [(ngModel)]=\"g.description\" [disabled]=\"!canMaintain()\" /></div>\n <div class=\"o-fld\"><span class=\"o-lbl\" style=\"padding:0\">Visibility</span>\n <div class=\"o-g2\">\n <button type=\"button\" class=\"o-opt\" [class.o-on]=\"g.visibility === 'private'\" (click)=\"g.visibility = 'private'\" [disabled]=\"!canAdmin()\"><span class=\"o-rad\" [class.o-on]=\"g.visibility === 'private'\"></span><span class=\"o-col\" style=\"gap:2px\"><b>Private</b><span class=\"o-faint o-sm\">Project members only</span></span></button>\n <button type=\"button\" class=\"o-opt\" [class.o-on]=\"g.visibility === 'internal'\" (click)=\"g.visibility = 'internal'\" [disabled]=\"!canAdmin()\"><span class=\"o-rad\" [class.o-on]=\"g.visibility === 'internal'\"></span><span class=\"o-col\" style=\"gap:2px\"><b>Org-internal</b><span class=\"o-faint o-sm\">Everyone in the organization can read</span></span></button>\n </div>\n </div>\n <div class=\"o-fld\"><span class=\"o-lbl\" style=\"padding:0\">Allowed merge methods</span>\n @for (m of methods; track m.id) {<label class=\"o-flex\"><input type=\"checkbox\" [checked]=\"g.mergeMethods.includes(m.id)\" (change)=\"flipMethod(m.id)\" [disabled]=\"!canMaintain()\" />{{ m.label }}</label>}\n </div>\n <div class=\"o-flex\"><button type=\"button\" class=\"o-tog\" role=\"switch\" aria-labelledby=\"rs-del\" [class.o-on]=\"g.deleteBranchOnMerge\" [attr.aria-checked]=\"g.deleteBranchOnMerge\" (click)=\"g.deleteBranchOnMerge = !g.deleteBranchOnMerge\" [disabled]=\"!canMaintain()\"></button><span id=\"rs-del\">Delete head branches after merge</span></div>\n <div class=\"o-flex\"><button type=\"button\" class=\"o-tog o-dis\" disabled aria-label=\"Allow auto-merge\"></button>Allow auto-merge when all requirements pass<b class=\"o-ph-tag o-ga\">GA</b></div>\n @if (canMaintain()) {<div class=\"o-flex\">@if (!canAdmin()) {<span class=\"o-faint o-sm\">As a maintain collaborator you change these settings; a project Maintainer renames the repository or changes its visibility.</span>}<button type=\"submit\" class=\"o-btn o-dark o-r\" [disabled]=\"busy() || !g.mergeMethods.length\" data-testid=\"settings-save\">Save</button></div>}\n </form>\n }\n @case ('protect') {\n <div class=\"o-flex\"><h1 class=\"o-t\">Branch protection</h1>@if (canProtect()) {<button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"edit(null)\" data-testid=\"add-rule\">+ Add rule</button>}</div>\n <div class=\"o-card\">\n @for (p of rules(); track p.id) {\n <button type=\"button\" class=\"o-row o-click\" style=\"width:100%;border:none;background:none;text-align:left\" [class.o-sel]=\"form()?.id === p.id\" (click)=\"edit(p)\"><b class=\"o-mono\">{{ p.pattern }}</b><span class=\"o-faint o-sm\">{{ summary(p) }}</span>@if (form()?.id === p.id) {<span class=\"o-r o-chip\">Editing</span>}</button>\n } @empty {<div class=\"o-empty\">No rules. Without one, anyone who can push may push to any branch.</div>}\n </div>\n @if (form(); as f) {\n <form class=\"o-card\" (ngSubmit)=\"saveRule()\" aria-label=\"Protection rule\">\n <div class=\"o-ch\"><b>Rule for</b><input class=\"o-in o-mono o-sm\" style=\"width:200px\" name=\"pattern\" aria-label=\"Branch name or pattern\" [(ngModel)]=\"f.pattern\" placeholder=\"main or release/*\" data-testid=\"rule-pattern\" /></div>\n <div class=\"o-cb o-form\">\n @for (t of toggles; track t.key) {\n <div class=\"o-flex\" style=\"align-items:flex-start\"><button type=\"button\" class=\"o-tog\" role=\"switch\" [attr.aria-label]=\"t.label\" [class.o-on]=\"f[t.key]\" [attr.aria-checked]=\"f[t.key]\" (click)=\"flip(f, t.key)\" style=\"margin-top:2px\"></button><div class=\"o-col\" style=\"gap:2px;flex:1\"><span class=\"o-b5\">{{ t.label }}</span><span class=\"o-hint\">{{ t.hint }}</span></div></div>\n }\n <div class=\"o-flex\"><span class=\"o-b5\" style=\"flex:1\">Required approvals</span><button type=\"button\" class=\"o-btn o-sm\" (click)=\"f.requiredApprovals = max0(f.requiredApprovals - 1)\" aria-label=\"One fewer\">−</button><b class=\"o-mono\" style=\"width:24px;text-align:center\" aria-live=\"polite\">{{ f.requiredApprovals }}</b><button type=\"button\" class=\"o-btn o-sm\" (click)=\"f.requiredApprovals = f.requiredApprovals + 1\" aria-label=\"One more\">+</button></div>\n <div class=\"o-fld\"><label for=\"rule-check\">Required status checks</label>\n <div class=\"o-flex o-wrap\">\n @for (c of f.requiredChecks; track c) {<span class=\"o-chip o-mono\">{{ c }} <button type=\"button\" class=\"o-lnk\" style=\"font-size:11px\" (click)=\"removeCheck(f, c)\" [attr.aria-label]=\"'Remove ' + c\">✕</button></span>}\n <input id=\"rule-check\" class=\"o-in o-sm o-mono\" style=\"width:160px\" placeholder=\"+ check name, Enter\" [ngModel]=\"check()\" (ngModelChange)=\"check.set($event)\" name=\"check\" (keydown.enter)=\"$event.preventDefault(); addCheck(f)\" />\n </div>\n </div>\n <div class=\"o-fld\"><span class=\"o-lbl\" style=\"padding:0\">Allowed to bypass <b class=\"o-ph-tag o-ga\">GA</b></span><div class=\"o-flex\"><span class=\"o-chip\">Owners</span><span class=\"o-hint\">Every bypass is written to the audit log.</span></div></div>\n <div class=\"o-fld\"><span class=\"o-lbl\" style=\"padding:0\">What a blocked push sees</span><div class=\"o-term\" style=\"font-size:11.5px\"><div>$ git push origin {{ f.pattern || 'main' }}</div><div>remote: ✕ {{ f.pattern || 'main' }} is protected by rule “{{ f.pattern || 'main' }}”: direct pushes are blocked.</div><div>remote: Open a pull request instead.</div></div></div>\n <div class=\"o-flex\">\n @if (f.id) {<button type=\"button\" class=\"o-btn o-sm o-ghost\" style=\"color:var(--o-bad-tx)\" (click)=\"removeRule(f)\">Delete rule</button>}\n <button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"form.set(null)\">Cancel</button>\n <button type=\"submit\" class=\"o-btn o-dark\" [disabled]=\"busy() || !f.pattern.trim()\" data-testid=\"rule-save\">Save rule</button>\n </div>\n </div>\n </form>\n }\n }\n @case ('collab') {\n <h1 class=\"o-t\">Collaborators</h1>\n <span class=\"o-mut\">Access beyond the project role, for this repository only.</span>\n @if (canAdmin()) {\n <div class=\"o-card\" style=\"overflow-x:auto\" data-testid=\"collaborators\">\n <div class=\"o-tbl\" role=\"table\" aria-label=\"Collaborators\" style=\"min-width:560px\">\n <div class=\"o-thead\" role=\"rowgroup\"><div class=\"o-tr\" role=\"row\"><div class=\"o-th\" role=\"columnheader\">Person</div><div class=\"o-th\" role=\"columnheader\">Project role</div><div class=\"o-th\" role=\"columnheader\">Repository access</div><div class=\"o-th\" role=\"columnheader\"></div></div></div>\n <div class=\"o-tbody\" role=\"rowgroup\">\n @for (cl of collabs(); track cl.userId) {\n <div class=\"o-tr\" role=\"row\" [attr.data-testid]=\"'collab-' + cl.userId\">\n <div class=\"o-td\" role=\"cell\"><span class=\"o-flex\"><span class=\"o-av\" aria-hidden=\"true\">{{ people().initials(cl.userId) }}</span>{{ people().name(cl.userId) }}@if (cl.projectRole === 'guest') {<span class=\"o-chip\">Guest</span>}</span></div>\n <div class=\"o-td o-mut\" role=\"cell\">{{ roleLabel(cl.projectRole) }}</div>\n <div class=\"o-td\" role=\"cell\"><select class=\"o-in o-sm\" style=\"width:auto\" [attr.aria-label]=\"'Repository access for ' + people().name(cl.userId)\" [ngModel]=\"cl.permission\" (ngModelChange)=\"setCollab(cl.userId, $event)\">@for (p of perms; track p.id) {<option [value]=\"p.id\">{{ p.label }}</option>}</select></div>\n <div class=\"o-td o-num\" role=\"cell\"><button type=\"button\" class=\"o-btn o-xs o-ghost\" (click)=\"removeCollab(cl.userId)\" [attr.aria-label]=\"'Remove ' + people().name(cl.userId)\">Remove</button></div>\n </div>\n } @empty {\n <div class=\"o-tr\" role=\"row\"><div class=\"o-td o-faint\" role=\"cell\" style=\"grid-column:1 / -1\">No collaborators. Project roles decide who reads and pushes.</div></div>\n }\n </div>\n </div>\n <div class=\"o-cf\">\n <select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Person to add\" [(ngModel)]=\"newCollab\"><option value=\"\">Add a person…</option>@for (p of addable(); track p.id) {<option [value]=\"p.id\">{{ p.name || p.email }}</option>}</select>\n <select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Access to give\" [(ngModel)]=\"newPerm\">@for (p of perms; track p.id) {<option [value]=\"p.id\">{{ p.label }}</option>}</select>\n <button type=\"button\" class=\"o-btn o-sm o-dark\" [disabled]=\"!newCollab || busy()\" (click)=\"setCollab(newCollab, newPerm, true)\" data-testid=\"collab-add\">Add</button>\n <span class=\"o-faint o-xs\">They need to be in the project (any role, Guest included). Write pushes and opens pull requests here; maintain also changes this repository's settings.</span>\n </div>\n </div>\n } @else {\n <div class=\"o-card\"><div class=\"o-empty\">{{ repo()?.collaborator ? 'You have ' + repo()?.collaborator + ' on this repository as a collaborator. ' : '' }}Project Maintainers manage collaborators.</div></div>\n }\n }\n @case ('danger') {\n <h1 class=\"o-t\">Danger zone</h1>\n <div class=\"o-card\" style=\"border-color:var(--o-bad-line)\">\n <div class=\"o-row\" style=\"padding:14px\"><div class=\"o-col\" style=\"gap:2px;flex:1\"><b>{{ r.archivedAt ? 'Unarchive' : 'Archive' }}</b><span class=\"o-hint\">{{ r.archivedAt ? 'Pushes are accepted again.' : 'Read-only. Pushes are rejected; pipelines stop triggering.' }}</span></div><button type=\"button\" class=\"o-btn o-sm\" (click)=\"archive(!r.archivedAt)\" [disabled]=\"!canAdmin() || busy()\">{{ r.archivedAt ? 'Unarchive' : 'Archive' }}</button></div>\n <div class=\"o-row\" style=\"padding:14px;flex-wrap:wrap\"><div class=\"o-col\" style=\"gap:2px;flex:1;min-width:240px\"><b>Delete this repository</b><span class=\"o-hint\">Recoverable for 7 days, then gone for good. Type <b class=\"o-mono\">{{ r.name }}</b> to confirm.</span></div>\n <input class=\"o-in o-sm o-mono\" style=\"width:180px\" aria-label=\"Type the repository name to confirm\" [ngModel]=\"confirm()\" (ngModelChange)=\"confirm.set($event)\" [disabled]=\"!canAdmin()\" />\n <button type=\"button\" class=\"o-btn o-sm o-red\" (click)=\"remove()\" [disabled]=\"!canAdmin() || confirm() !== r.name || busy()\">Delete</button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n } @else if (error()) {\n <div class=\"o-card o-empty\"><p>{{ error() }}</p></div>\n }\n </div>\n `,\n})\nexport class RepoSettingsPage extends RepoPage {\n private readonly router = inject(Router);\n protected readonly section = signal<Section>('general');\n protected readonly branches = signal<Ref[]>([]);\n protected readonly rules = signal<Protection[]>([]);\n protected readonly form = signal<RuleForm | null>(null);\n protected readonly check = signal('');\n protected readonly confirm = signal('');\n protected readonly busy = signal(false);\n protected g = { name: '', description: '', visibility: 'private', defaultBranch: '', mergeMethods: [] as string[], deleteBranchOnMerge: false };\n\n protected readonly methods = [{ id: 'merge', label: 'Merge commit' }, { id: 'squash', label: 'Squash' }, { id: 'rebase', label: 'Rebase' }];\n protected readonly toggles: { key: 'blockDirectPush' | 'blockForcePush' | 'blockDeletion' | 'dismissStaleApprovals' | 'requireUpToDate' | 'requireCodeOwnerReview'; label: string; hint: string }[] = [\n { key: 'blockDirectPush', label: 'Require a pull request before merging', hint: 'Direct pushes are blocked; changes arrive through pull requests.' },\n { key: 'blockForcePush', label: 'Block force pushes', hint: 'History on matching branches cannot be rewritten.' },\n { key: 'blockDeletion', label: 'Block deletion', hint: 'Matching branches cannot be deleted.' },\n { key: 'dismissStaleApprovals', label: 'Dismiss stale approvals', hint: 'A new commit dismisses approvals given on an older one.' },\n { key: 'requireUpToDate', label: 'Require branches to be up to date', hint: 'The branch must contain the target’s latest commit before it merges.' },\n { key: 'requireCodeOwnerReview', label: 'Require review from CODEOWNERS', hint: 'Owners of changed paths are requested automatically; one of them approves each owned file.' },\n ];\n\n constructor() {\n super();\n this.route.queryParamMap.subscribe((q) => this.section.set((q.get('section') as Section) || 'general'));\n }\n\n protected readonly collabs = signal<Collaborator[]>([]);\n protected readonly perms = [{ id: 'read', label: 'Read' }, { id: 'write', label: 'Write' }, { id: 'maintain', label: 'Maintain' }];\n protected readonly addable = computed(() => this.host.people().filter((p) => !this.collabs().some((c) => c.userId === p.id)));\n protected newCollab = '';\n protected newPerm = 'write';\n\n protected roleLabel(r: string) {\n return r ? r[0].toUpperCase() + r.slice(1) : 'Not in the project';\n }\n\n private loadCollabs(r: Repo) {\n if (!this.canAdmin()) return;\n this.api.collaborators(this.projectId(), r.name).subscribe({ next: (l) => this.collabs.set(l), error: () => undefined });\n }\n\n protected setCollab(userId: string, permission: string, adding = false) {\n const r = this.repo();\n if (!r || !userId) return;\n this.busy.set(true);\n this.error.set('');\n this.api.setCollaborator(this.projectId(), r.name, userId, permission).subscribe({\n next: () => { this.busy.set(false); if (adding) { this.newCollab = ''; this.note.set(`${this.people().name(userId)} now has ${permission} on ${r.name}.`); } this.loadCollabs(r); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not change the access.')); this.loadCollabs(r); },\n });\n }\n\n protected removeCollab(userId: string) {\n const r = this.repo();\n if (!r) return;\n this.api.removeCollaborator(this.projectId(), r.name, userId).subscribe({\n next: () => { this.note.set(`${this.people().name(userId)} is no longer a collaborator.`); this.loadCollabs(r); },\n error: (e) => this.error.set(apiMessage(e, 'Could not remove the collaborator.')),\n });\n }\n\n protected onRepo(r: Repo) {\n this.loadCollabs(r);\n this.g = { name: r.name, description: r.description, visibility: r.visibility, defaultBranch: r.defaultBranch, mergeMethods: [...(r.mergeMethods ?? [])], deleteBranchOnMerge: r.deleteBranchOnMerge };\n if (!r.empty) this.api.refs(this.projectId(), r.name, 'branch').subscribe({ next: (b) => this.branches.set(b), error: () => undefined });\n this.api.protections(this.projectId(), r.name).subscribe({ next: (p) => this.rules.set(p), error: () => undefined });\n }\n\n protected go(s: Section) {\n void this.router.navigate([], { relativeTo: this.route, queryParams: { section: s === 'general' ? null : s }, replaceUrl: true });\n }\n\n protected max0(n: number) {\n return Math.max(0, n);\n }\n\n protected flipMethod(id: string) {\n this.g.mergeMethods = this.g.mergeMethods.includes(id) ? this.g.mergeMethods.filter((m) => m !== id) : [...this.g.mergeMethods, id];\n }\n\n protected summary(p: Protection) {\n const parts: string[] = [];\n if (p.requiredApprovals) parts.push(`${p.requiredApprovals} ${p.requiredApprovals === 1 ? 'approval' : 'approvals'}`);\n if (p.requiredChecks?.length) parts.push(`checks ${p.requiredChecks.join(', ')}`);\n if (p.blockDirectPush) parts.push('no direct push');\n if (p.requireUpToDate) parts.push('up to date');\n if (p.requireCodeOwnerReview) parts.push('code owners');\n if (p.blockDeletion) parts.push('no deletion');\n return parts.join(' · ') || 'no restrictions';\n }\n\n protected edit(p: Protection | null) {\n this.form.set(p ? { ...BLANK, ...p, requiredChecks: [...(p.requiredChecks ?? [])] } : { ...BLANK, pattern: this.rules().length ? '' : this.repo()?.defaultBranch ?? 'main', requiredChecks: [] });\n }\n\n protected flip(f: RuleForm, k: (typeof this.toggles)[number]['key']) {\n f[k] = !f[k];\n this.form.set({ ...f });\n }\n\n protected addCheck(f: RuleForm) {\n const c = this.check().trim();\n if (c && !f.requiredChecks.includes(c)) f.requiredChecks = [...f.requiredChecks, c];\n this.check.set('');\n this.form.set({ ...f });\n }\n\n protected removeCheck(f: RuleForm, c: string) {\n f.requiredChecks = f.requiredChecks.filter((x) => x !== c);\n this.form.set({ ...f });\n }\n\n protected saveGeneral() {\n const r = this.repo();\n if (!r) return;\n this.busy.set(true);\n const renamed = this.g.name.trim() !== r.name;\n // a maintain collaborator sends what they may change; the name and visibility stay a Maintainer's\n const body = this.canAdmin()\n ? { name: this.g.name.trim(), description: this.g.description, visibility: this.g.visibility, defaultBranch: this.g.defaultBranch, mergeMethods: this.g.mergeMethods, deleteBranchOnMerge: this.g.deleteBranchOnMerge }\n : { description: this.g.description, defaultBranch: this.g.defaultBranch, mergeMethods: this.g.mergeMethods, deleteBranchOnMerge: this.g.deleteBranchOnMerge };\n this.api.update(this.projectId(), r.name, body).subscribe({\n next: (n) => {\n this.busy.set(false);\n this.note.set('Saved.');\n if (renamed) void this.router.navigate(this.host.link(`code/${n.name}/settings`));\n else { this.repo.set(n); this.onRepo(n); }\n },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not save.')); },\n });\n }\n\n protected saveRule() {\n const r = this.repo();\n const f = this.form();\n if (!r || !f) return;\n const { id, ...body } = f;\n this.busy.set(true);\n const req = id ? this.api.updateProtection(this.projectId(), r.name, id, body) : this.api.addProtection(this.projectId(), r.name, body);\n req.subscribe({\n next: () => { this.busy.set(false); this.form.set(null); this.note.set(`Rule “${f.pattern}” saved.`); this.onRepo(r); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not save the rule.')); },\n });\n }\n\n protected removeRule(f: RuleForm) {\n const r = this.repo();\n if (!r || !f.id) return;\n this.api.removeProtection(this.projectId(), r.name, f.id).subscribe({\n next: () => { this.form.set(null); this.note.set(`Rule “${f.pattern}” deleted.`); this.onRepo(r); },\n error: (e) => this.error.set(apiMessage(e, 'Could not delete the rule.')),\n });\n }\n\n protected archive(on: boolean) {\n const r = this.repo();\n if (!r) return;\n this.busy.set(true);\n this.api.setArchived(this.projectId(), r.name, on).subscribe({\n next: (n) => { this.busy.set(false); this.repo.set(n); this.note.set(on ? 'Archived: the repository is read-only.' : 'Unarchived.'); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not change the archive state.')); },\n });\n }\n\n protected remove() {\n const r = this.repo();\n if (!r) return;\n this.busy.set(true);\n this.api.remove(this.projectId(), r.name).subscribe({\n next: () => { this.busy.set(false); void this.router.navigate(this.host.link('code')); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not delete the repository.')); },\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { marked } from 'marked';\nimport { forkJoin } from 'rxjs';\nimport { Ref, Release, Repo, apiMessage } from './code.api';\nimport { RepoPage } from './repo-base';\nimport { ago } from './look';\n\ninterface Draft {\n id?: string;\n version?: number;\n tag: string;\n newTag: boolean;\n target: string;\n title: string;\n notes: string;\n prerelease: boolean;\n draft: boolean;\n}\n\n// /{org}/{project}/code/{repo}/releases (prototype code_tags): releases newest first with their\n// notes, files and source archives, the latest marked; drafts for those who can push; a release\n// drafted on a new or existing tag with notes generated from the done issues since the previous\n// one; and the repository's tags.\n@Component({\n selector: 'o-code-releases',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`\n .rel h4{margin:0 0 6px;font-size:15px}\n .rel .o-md ul{margin:0;padding-left:20px}\n .assets{display:flex;gap:12px;flex-wrap:wrap;align-items:center}\n `],\n template: `\n <div class=\"o-page o-narrow\">\n <div class=\"o-ph\">\n <div class=\"o-col\"><span class=\"o-eyebrow\">{{ name() }}</span><h1 class=\"o-t\">Releases and tags</h1></div>\n @if (canWrite()) {\n <div class=\"o-acts\">\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"tagging.set(!tagging()); draft.set(null)\" data-testid=\"tag-new\">New tag</button>\n <button type=\"button\" class=\"o-btn o-sm o-dark\" (click)=\"startRelease()\" data-testid=\"release-new\">Draft release</button>\n </div>\n }\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @if (note()) {<div class=\"o-note\" role=\"status\">{{ note() }}</div>}\n\n @if (tagging()) {\n <form class=\"o-card\" (ngSubmit)=\"createTag()\" data-testid=\"tag-form\">\n <div class=\"o-ch\"><b>New tag</b></div>\n <div class=\"o-cb o-flex o-wrap\" style=\"align-items:flex-end\">\n <div class=\"o-fld\"><label for=\"tg-name\">Tag</label><input id=\"tg-name\" class=\"o-in o-mono\" name=\"tag\" placeholder=\"v1.8.0\" [(ngModel)]=\"tagName\" /></div>\n <div class=\"o-fld\"><label for=\"tg-from\">At</label><input id=\"tg-from\" class=\"o-in o-mono\" name=\"from\" [(ngModel)]=\"tagFrom\" placeholder=\"main or a commit\" /></div>\n <button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"tagging.set(false)\">Cancel</button>\n <button type=\"submit\" class=\"o-btn o-sm o-dark\" [disabled]=\"busy() || !tagName.trim()\">Create tag</button>\n </div>\n </form>\n }\n\n @if (draft(); as d) {\n <div class=\"o-card\" data-testid=\"release-form\">\n <div class=\"o-ch\"><b>{{ d.id ? 'Edit ' + d.tag : 'Draft a release' }}</b></div>\n <div class=\"o-cb o-col\" style=\"gap:12px\">\n @if (!d.id) {\n <div class=\"o-flex o-wrap\" style=\"align-items:flex-end\">\n <div class=\"o-fld\"><label for=\"rl-tag\">Tag</label>\n <input id=\"rl-tag\" class=\"o-in o-mono\" list=\"rl-tags\" placeholder=\"v1.8.0\" [ngModel]=\"d.tag\" (ngModelChange)=\"setTag(d, $event)\" data-testid=\"release-tag\" />\n <datalist id=\"rl-tags\">@for (t of freeTags(); track t.name) {<option [value]=\"t.name\"></option>}</datalist>\n </div>\n @if (d.newTag) {<div class=\"o-fld\"><label for=\"rl-target\">New tag at</label><input id=\"rl-target\" class=\"o-in o-mono\" [(ngModel)]=\"d.target\" placeholder=\"main\" /></div>}\n <span class=\"o-hint\" style=\"padding-bottom:8px\">{{ d.tag ? (d.newTag ? 'A new tag, made when you save.' : 'An existing tag.') : '' }}</span>\n </div>\n }\n <div class=\"o-fld\"><label for=\"rl-title\">Title</label><input id=\"rl-title\" class=\"o-in\" maxlength=\"255\" [(ngModel)]=\"d.title\" placeholder=\"Defaults to the tag\" data-testid=\"release-title\" /></div>\n <div class=\"o-fld\">\n <div class=\"o-flex\"><label for=\"rl-notes\">Notes</label>\n @if (!d.id) {<button type=\"button\" class=\"o-lnk o-r o-sm\" [disabled]=\"busy() || !d.tag\" (click)=\"generate(d)\" data-testid=\"release-generate\">Generate from done issues</button>}\n </div>\n <textarea id=\"rl-notes\" class=\"o-in\" rows=\"7\" style=\"height:auto;padding:8px 10px\" [(ngModel)]=\"d.notes\" placeholder=\"Markdown works.\" data-testid=\"release-notes\"></textarea>\n <span class=\"o-hint\">Generated notes list the done issues and merged pull requests since the previous release.</span>\n </div>\n <label class=\"o-flex o-sm\"><input type=\"checkbox\" [(ngModel)]=\"d.prerelease\" /> Pre-release (never marked Latest)</label>\n </div>\n <div class=\"o-cf\">\n <button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"draft.set(null)\">Cancel</button>\n @if (!d.id || d.draft) {<button type=\"button\" class=\"o-btn o-sm\" [disabled]=\"busy() || !d.tag\" (click)=\"save(d, true)\" data-testid=\"release-save-draft\">Save draft</button>}\n <button type=\"button\" class=\"o-btn o-sm o-dark\" [disabled]=\"busy() || !d.tag\" (click)=\"save(d, false)\" data-testid=\"release-publish\">{{ d.id && !d.draft ? 'Save' : 'Publish release' }}</button>\n </div>\n </div>\n }\n\n @for (r of releases(); track r.id) {\n <div class=\"o-card rel\" [attr.data-testid]=\"'release-' + r.tag\">\n <div class=\"o-ch\">\n <b class=\"o-md\">{{ r.tag }}</b>\n @if (r.latest) {<span class=\"o-chip o-grn\">Latest</span>}\n @if (r.draft) {<span class=\"o-chip o-amb\">Draft</span>}\n @if (r.prerelease) {<span class=\"o-chip\">Pre-release</span>}\n <span class=\"o-r o-mono o-sm o-faint\">{{ r.short }} · {{ ago(r.publishedAt || r.createdAt) }} · {{ people().name(r.createdBy) }}</span>\n </div>\n <div class=\"o-cb\">\n @if (r.title && r.title !== r.tag) {<h4>{{ r.title }}</h4>}\n <div class=\"o-md\" style=\"font-size:13px\" [innerHTML]=\"r.notes ? md(r.notes) : '<p class=&quot;o-faint&quot;>No notes.</p>'\"></div>\n </div>\n <div class=\"o-cf assets\">\n <span>Assets</span>\n @for (a of r.assets; track a.id) {\n <button type=\"button\" class=\"o-lnk o-mono\" (click)=\"download(r, a.id, a.name)\" [attr.aria-label]=\"'Download ' + a.name\">{{ a.name }}</button>\n @if (canWrite()) {<button type=\"button\" class=\"o-lnk\" style=\"color:var(--o-mut)\" (click)=\"removeAsset(r, a.id)\" [attr.aria-label]=\"'Remove ' + a.name\">×</button>}\n }\n <button type=\"button\" class=\"o-lnk\" (click)=\"archive(r, 'zip')\">Source (zip)</button>\n <button type=\"button\" class=\"o-lnk\" (click)=\"archive(r, 'tar.gz')\">Source (tar.gz)</button>\n @if (canWrite()) {\n <span class=\"o-r o-flex\" style=\"gap:10px\">\n <label class=\"o-lnk\" style=\"cursor:pointer\">Add file<input type=\"file\" class=\"o-sr-only\" (change)=\"upload(r, $event)\" [attr.aria-label]=\"'Add a file to ' + r.tag\" /></label>\n <button type=\"button\" class=\"o-lnk\" (click)=\"edit(r)\" [attr.aria-label]=\"'Edit ' + r.tag\">Edit</button>\n @if (confirming() === r.id) {\n <label class=\"o-flex o-xs\"><input type=\"checkbox\" [(ngModel)]=\"alsoTag\" /> and the tag</label>\n <button type=\"button\" class=\"o-lnk o-red-t\" (click)=\"remove(r)\">Delete</button><button type=\"button\" class=\"o-lnk\" (click)=\"confirming.set('')\">Keep</button>\n } @else {\n <button type=\"button\" class=\"o-lnk\" style=\"color:var(--o-mut)\" (click)=\"confirming.set(r.id); alsoTag = false\" [attr.aria-label]=\"'Delete ' + r.tag\">Delete</button>\n }\n </span>\n }\n </div>\n </div>\n } @empty {\n <div class=\"o-card\"><div class=\"o-empty\">{{ loaded() ? 'No releases yet.' + (canWrite() ? ' Draft one from a tag; its notes can come from the issues it finishes.' : '') : 'Loading…' }}</div></div>\n }\n\n <div class=\"o-card\" data-testid=\"tags\">\n <div class=\"o-ch\"><b>Tags</b><span class=\"o-r o-faint o-sm\">{{ tags().length }}</span></div>\n @for (t of tags(); track t.name) {\n <div class=\"o-row\" [attr.data-testid]=\"'tag-' + t.name\">\n <span class=\"o-mono o-sm o-b5\">{{ t.name }}</span><span class=\"o-faint o-sm o-mono\">{{ t.commit?.short }}</span>\n <span class=\"o-r o-faint o-sm\">{{ ago(t.commit?.committer?.when) }}</span>\n @if (canWrite() && !used(t.name)) {<button type=\"button\" class=\"o-lnk\" style=\"color:var(--o-mut)\" (click)=\"removeTag(t)\" [attr.aria-label]=\"'Delete tag ' + t.name\">Delete</button>}\n </div>\n } @empty {<div class=\"o-empty o-sm\">No tags yet.</div>}\n </div>\n </div>\n `,\n})\nexport class ReleasesPage extends RepoPage {\n protected readonly releases = signal<Release[]>([]);\n protected readonly tags = signal<Ref[]>([]);\n protected readonly loaded = signal(false);\n protected readonly tagging = signal(false);\n protected readonly draft = signal<Draft | null>(null);\n protected readonly busy = signal(false);\n protected readonly confirming = signal('');\n protected readonly freeTags = computed(() => this.tags().filter((t) => !this.used(t.name)));\n protected readonly ago = (s?: string) => ago(s);\n protected tagName = '';\n protected tagFrom = '';\n protected alsoTag = false;\n\n protected onRepo(r: Repo) {\n this.tagFrom = r.defaultBranch;\n this.load();\n }\n\n protected md(s: string): string {\n return marked.parse(s || '', { async: false, gfm: true, breaks: true }) as string;\n }\n\n protected used(tag: string) {\n return this.releases().some((r) => r.tag === tag);\n }\n\n private load() {\n const r = this.repo();\n if (!r) return;\n forkJoin({ rel: this.api.releases(this.projectId(), r.name), tags: this.api.refs(this.projectId(), r.name, 'tag') }).subscribe({\n next: ({ rel, tags }) => { this.releases.set(rel); this.tags.set(sortTags(tags)); this.loaded.set(true); },\n error: (e) => { this.loaded.set(true); this.error.set(apiMessage(e, 'Could not load the releases.')); },\n });\n }\n\n private run(o: import('rxjs').Observable<unknown>, fallback: string, done?: () => void) {\n this.busy.set(true);\n this.error.set('');\n this.note.set('');\n o.subscribe({\n next: () => { this.busy.set(false); done?.(); this.load(); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, fallback)); },\n });\n }\n\n protected createTag() {\n const r = this.repo();\n const t = this.tagName.trim();\n if (!r || !t) return;\n this.run(this.api.createTag(this.projectId(), r.name, t, this.tagFrom.trim() || r.defaultBranch), 'Could not create the tag.', () => {\n this.tagging.set(false);\n this.note.set(`Tag ${t} created.`);\n this.tagName = '';\n });\n }\n\n protected removeTag(t: Ref) {\n const r = this.repo();\n if (!r) return;\n this.run(this.api.deleteTag(this.projectId(), r.name, t.name), `Could not delete ${t.name}.`, () => this.note.set(`Tag ${t.name} deleted.`));\n }\n\n protected startRelease() {\n const r = this.repo();\n this.tagging.set(false);\n this.draft.set({ tag: '', newTag: true, target: r?.defaultBranch ?? 'main', title: '', notes: '', prerelease: false, draft: true });\n }\n\n protected setTag(d: Draft, tag: string) {\n d.tag = tag.trim();\n d.newTag = !this.tags().some((t) => t.name === d.tag);\n }\n\n protected generate(d: Draft) {\n const r = this.repo();\n if (!r) return;\n this.busy.set(true);\n const target = d.newTag ? d.target || r.defaultBranch : 'refs/tags/' + d.tag;\n this.api.releaseNotes(this.projectId(), r.name, target).subscribe({\n next: (n) => { this.busy.set(false); d.notes = n; this.draft.set({ ...d }); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not generate the notes.')); },\n });\n }\n\n protected edit(r: Release) {\n this.tagging.set(false);\n this.draft.set({ id: r.id, version: r.version, tag: r.tag, newTag: false, target: '', title: r.title === r.tag ? '' : r.title, notes: r.notes, prerelease: r.prerelease, draft: r.draft });\n }\n\n protected save(d: Draft, asDraft: boolean) {\n const r = this.repo();\n if (!r) return;\n if (d.id) {\n this.run(this.api.updateRelease(this.projectId(), r.name, d.id, { title: d.title, notes: d.notes, prerelease: d.prerelease, draft: d.draft && asDraft, version: d.version }),\n 'Could not save the release.', () => { this.draft.set(null); this.note.set(asDraft ? 'Draft saved.' : `${d.tag} saved.`); });\n return;\n }\n this.run(this.api.createRelease(this.projectId(), r.name, { tag: d.tag, target: d.newTag ? d.target || r.defaultBranch : undefined, title: d.title, notes: d.notes, prerelease: d.prerelease, draft: asDraft }),\n 'Could not create the release.', () => { this.draft.set(null); this.note.set(asDraft ? `Draft ${d.tag} saved.` : `${d.tag} published.`); });\n }\n\n protected remove(rel: Release) {\n const r = this.repo();\n if (!r) return;\n this.confirming.set('');\n this.run(this.api.deleteRelease(this.projectId(), r.name, rel.id, this.alsoTag), `Could not delete ${rel.tag}.`, () => this.note.set(`Release ${rel.tag} deleted${this.alsoTag ? ' with its tag' : ''}.`));\n }\n\n protected upload(rel: Release, ev: Event) {\n const r = this.repo();\n const input = ev.target as HTMLInputElement;\n const file = input.files?.[0];\n if (!r || !file) return;\n if (file.size > 25 * 1024 * 1024) {\n this.error.set('A release file is at most 25 MB.');\n return;\n }\n this.run(this.api.addAsset(this.projectId(), r.name, rel.id, file), 'Could not add the file.', () => { input.value = ''; this.note.set(`${file.name} added to ${rel.tag}.`); });\n }\n\n protected removeAsset(rel: Release, id: string) {\n const r = this.repo();\n if (!r) return;\n this.run(this.api.deleteAsset(this.projectId(), r.name, rel.id, id), 'Could not remove the file.');\n }\n\n protected download(rel: Release, id: string, filename: string) {\n const r = this.repo();\n if (!r) return;\n this.api.assetBlob(this.projectId(), r.name, rel.id, id).subscribe({\n next: (b) => this.save_(b, filename),\n error: (e) => this.error.set(apiMessage(e, 'Could not download the file.')),\n });\n }\n\n protected archive(rel: Release, format: 'zip' | 'tar.gz') {\n const r = this.repo();\n if (!r) return;\n this.api.archiveUrl(this.projectId(), r.name, 'refs/tags/' + rel.tag, format).subscribe({\n next: (url) => { if (url) window.location.assign(url); },\n error: (e) => this.error.set(apiMessage(e, 'Could not prepare the archive.')),\n });\n }\n\n private save_(b: globalThis.Blob, filename: string) {\n const url = URL.createObjectURL(b);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.click();\n setTimeout(() => URL.revokeObjectURL(url), 10_000);\n }\n}\n\n/** Newest commit first; tags on commits of the same second by version, highest first (v1.10 after v1.9). */\nfunction sortTags(tags: Ref[]): Ref[] {\n const when = (t: Ref) => Date.parse(t.commit?.committer?.when ?? '') || 0;\n return [...tags].sort((a, b) => when(b) - when(a) || b.name.localeCompare(a.name, undefined, { numeric: true }));\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router, RouterLink } from '@angular/router';\nimport { CommitRequest, Repo, apiMessage } from './code.api';\nimport { CommitBox, CommitChoice } from './commit.box';\nimport { RepoPage } from './repo-base';\nimport { size } from './look';\n\ninterface Upload {\n name: string;\n size: number;\n b64: string;\n}\n\n/** Uploads in one commit stay under the server's 25 MB request limit (base64 grows them by a third). */\nconst MAX_UPLOAD = 18 * 1024 * 1024;\n\n// /{org}/{project}/code/{repo}/new?ref=&path= and /upload (DEV-13): a new file written in the\n// browser, or files uploaded from the computer, committed to the branch or to a new branch with a\n// pull request (protection applies).\n@Component({\n selector: 'o-code-new-file',\n imports: [FormsModule, RouterLink, CommitBox],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page o-wide\">\n @if (repo(); as r) {\n <div class=\"o-ph\"><div class=\"o-col\"><span class=\"o-eyebrow\">{{ r.name }} · {{ branch() }}</span><h1 class=\"o-t\">{{ upload() ? 'Upload files' : 'Create a file' }}</h1></div></div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @if (!canWrite()) {\n <div class=\"o-card\"><div class=\"o-empty\">Your role cannot change this repository.</div></div>\n } @else {\n <div class=\"o-card\">\n <div class=\"o-cb o-col\" style=\"gap:12px\">\n @if (upload()) {\n <div class=\"o-fld\"><label for=\"nf-dir\">Into folder</label><input id=\"nf-dir\" class=\"o-in o-mono\" [(ngModel)]=\"dir\" placeholder=\"(the repository root)\" /></div>\n <div class=\"o-fld\"><label for=\"nf-files\">Files</label><input id=\"nf-files\" type=\"file\" multiple class=\"o-in\" (change)=\"pick($event)\" data-testid=\"upload-files\" /></div>\n @for (u of uploads(); track u.name) {<div class=\"o-row o-sm\"><span class=\"o-mono\">{{ shown(u.name) }}</span><span class=\"o-r o-faint\">{{ fmt(u.size) }}</span><button type=\"button\" class=\"o-lnk\" (click)=\"drop(u.name)\" [attr.aria-label]=\"'Remove ' + u.name\">×</button></div>}\n } @else {\n <div class=\"o-fld\"><label for=\"nf-path\">File path</label><input id=\"nf-path\" class=\"o-in o-mono\" [(ngModel)]=\"filePath\" placeholder=\"docs/notes.md\" data-testid=\"new-file-path\" /></div>\n <textarea class=\"o-in o-mono\" rows=\"16\" style=\"font-size:12px;height:auto;padding:8px 10px\" aria-label=\"File contents\" [(ngModel)]=\"content\" data-testid=\"new-file-text\"></textarea>\n }\n </div>\n <div class=\"o-cb\" style=\"border-top:1px solid var(--o-line-soft)\">\n <o-commit-box [repo]=\"r.name\" [branch]=\"branch()\" [defaultMessage]=\"defaultMessage()\" [busy]=\"busy()\" (commit)=\"save($event)\" (cancel)=\"back()\" />\n </div>\n </div>\n }\n } @else if (error()) {\n <div class=\"o-card o-empty\"><p>{{ error() }}</p><a class=\"o-btn\" [routerLink]=\"host.link('code')\">All repositories</a></div>\n }\n </div>\n `,\n})\nexport class NewFilePage extends RepoPage {\n private readonly router = inject(Router);\n protected readonly upload = signal(false);\n protected readonly ref = signal('');\n protected readonly uploads = signal<Upload[]>([]);\n protected readonly busy = signal(false);\n protected filePath = '';\n protected content = '';\n protected dir = '';\n protected readonly branch = computed(() => this.ref() || this.repo()?.defaultBranch || 'main');\n protected readonly defaultMessage = computed(() => (this.upload() ? 'Add files via upload' : 'Create a file'));\n protected readonly fmt = size;\n\n constructor() {\n super();\n this.upload.set(this.route.snapshot.url.at(-1)?.path === 'upload');\n this.route.queryParamMap.subscribe((q) => {\n this.ref.set(q.get('ref') ?? '');\n const p = q.get('path') ?? '';\n this.dir = p;\n this.filePath = p ? p.replace(/\\/+$/, '') + '/' : '';\n });\n }\n\n protected onRepo(_: Repo) {}\n\n protected async pick(ev: Event) {\n const files = Array.from((ev.target as HTMLInputElement).files ?? []);\n const out: Upload[] = [...this.uploads()];\n for (const f of files) {\n const buf = new Uint8Array(await f.arrayBuffer());\n let bin = '';\n for (let i = 0; i < buf.length; i += 0x8000) bin += String.fromCharCode(...buf.subarray(i, i + 0x8000));\n out.push({ name: f.name, size: f.size, b64: btoa(bin) });\n }\n if (out.reduce((a, u) => a + u.size, 0) > MAX_UPLOAD) {\n this.error.set('One upload is at most 18 MB; commit large files with Git.');\n return;\n }\n this.error.set('');\n this.uploads.set(out);\n }\n\n protected shown(name: string) {\n const prefix = this.dir.trim().replace(/^\\/+|\\/+$/g, '');\n return (prefix ? prefix + '/' : '') + name;\n }\n\n protected drop(name: string) {\n this.uploads.set(this.uploads().filter((u) => u.name !== name));\n }\n\n protected back() {\n void this.router.navigate(this.link(), { queryParams: { ref: this.ref() || null, path: this.dir || null } });\n }\n\n protected save(c: CommitChoice) {\n const r = this.repo();\n if (!r) return;\n const body: CommitRequest = c.newBranch ? { branch: c.newBranch, from: this.branch(), message: c.message, pull: {} } : { branch: this.branch(), message: c.message };\n if (this.upload()) {\n if (!this.uploads().length) { this.error.set('Choose files to upload.'); return; }\n const prefix = this.dir.trim().replace(/^\\/+|\\/+$/g, '');\n body.uploads = Object.fromEntries(this.uploads().map((u) => [(prefix ? prefix + '/' : '') + u.name, u.b64]));\n } else {\n const p = this.filePath.trim().replace(/^\\/+/, '');\n if (!p || p.endsWith('/')) { this.error.set('Name the file.'); return; }\n body.files = { [p]: this.content };\n }\n this.busy.set(true);\n this.error.set('');\n this.api.commitFiles(this.projectId(), r.name, body).subscribe({\n next: (res) => {\n this.busy.set(false);\n if (res.pull) { void this.router.navigate(this.link('pull/' + res.pull)); return; }\n if (!this.upload()) { void this.router.navigate(this.link('blob'), { queryParams: { ref: res.branch, path: this.filePath.trim().replace(/^\\/+/, '') } }); return; }\n void this.router.navigate(this.link(), { queryParams: { ref: res.branch, path: this.dir.trim() || null } });\n },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not commit.')); },\n });\n }\n}\n","/*\n * @chisquare-tech/origine-ngx-apps-code: the Code module's screens (TRD §6.10). The host app provides\n * CodeHost and mounts the pages at /{org}/{project}/code, /code/new, /code/pulls and\n * /code/{repo}[/blob|/commits|/commit/:sha|/branches|/pulls|/pull/:number|/settings].\n */\nexport * from './lib/host';\nexport * from './lib/code.api';\nexport * from './lib/look';\nexport * from './lib/repo-base';\nexport * from './lib/diff.view';\nexport * from './lib/repos.page';\nexport * from './lib/repo.page';\nexport * from './lib/file.page';\nexport * from './lib/history.pages';\nexport * from './lib/pulls.page';\nexport * from './lib/pull.page';\nexport * from './lib/settings.page';\nexport * from './lib/releases.page';\nexport * from './lib/commit.box';\nexport * from './lib/new-file.page';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["map"],"mappings":"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"}
1
+ {"version":3,"file":"chisquare-tech-origine-ngx-apps-code.mjs","sources":["../../../projects/code/src/lib/host.ts","../../../projects/code/src/lib/code.api.ts","../../../projects/code/src/lib/look.ts","../../../projects/code/src/lib/repo-base.ts","../../../projects/code/src/lib/diff.view.ts","../../../projects/code/src/lib/repos.page.ts","../../../projects/code/src/lib/repo.page.ts","../../../projects/code/src/lib/commit.box.ts","../../../projects/code/src/lib/file.page.ts","../../../projects/code/src/lib/history.pages.ts","../../../projects/code/src/lib/pulls.page.ts","../../../projects/code/src/lib/pull.page.ts","../../../projects/code/src/lib/settings.page.ts","../../../projects/code/src/lib/releases.page.ts","../../../projects/code/src/lib/new-file.page.ts","../../../projects/code/src/public-api.ts","../../../projects/code/src/chisquare-tech-origine-ngx-apps-code.ts"],"sourcesContent":["import { Signal } from '@angular/core';\n\n/** A person in the organization, as the host knows them (identity's members). */\nexport interface CodePerson {\n id: string;\n name: string;\n email?: string;\n}\n\n/** The project the screens are on. */\nexport interface CodeProject {\n id: string;\n key: string;\n name: string;\n /** The caller's capabilities on the project: code.write, protection.manage, resources.manage… */\n capabilities: string[];\n archivedAt?: string;\n}\n\n/**\n * What the Code screens need from the app that mounts them (cloud/web provides it, as it provides\n * DesignHost): where the person is, who is in the organization, and links inside the project.\n */\nexport abstract class CodeHost {\n abstract readonly project: Signal<CodeProject | null>;\n abstract readonly projectLoaded: Signal<boolean>;\n abstract readonly people: Signal<CodePerson[]>;\n abstract meId(): string;\n /** A router link to a path inside the current project ('' is its overview). */\n abstract link(path?: string): string[];\n}\n","import { Injectable, inject } from '@angular/core';\nimport { ApiService } from '@thescaffold/ngx-core';\nimport { Observable, map } from 'rxjs';\n\n// The code app's API (gox-apps/libs/code, mounted at /api/v1/code). Shapes mirror the Go JSON.\n\nexport interface Repo {\n projectId: string;\n projectKey: string;\n name: string;\n slug: string;\n description: string;\n visibility: 'private' | 'internal';\n defaultBranch: string;\n mergeMethods: string[];\n deleteBranchOnMerge: boolean;\n archivedAt?: string;\n createdBy: string;\n pushedAt?: string;\n sizeBytes: number;\n importState?: string;\n importSource?: string;\n importError?: string;\n cloneHttps: string;\n cloneSsh: string;\n empty: boolean;\n capabilities: string[];\n readOnly?: boolean;\n /** Pull requests can be armed to merge once the gate passes (DEV-25). */\n allowAutoMerge?: boolean;\n /** The caller's collaborator permission on this repository (read, write or maintain), if any. */\n collaborator?: string;\n createdAt?: string;\n}\n\nexport interface GitPerson {\n name: string;\n email: string;\n when: string;\n}\n\nexport interface Commit {\n oid: string;\n short: string;\n subject: string;\n body?: string;\n author: GitPerson;\n committer: GitPerson;\n parents: string[];\n keys: string[];\n}\n\nexport interface FileChange {\n status: string;\n path: string;\n oldPath?: string;\n additions: number;\n deletions: number;\n binary: boolean;\n}\n\nexport interface CommitDetail extends Commit {\n files: FileChange[];\n additions: number;\n deletions: number;\n}\n\nexport interface DiffLine {\n kind: 'context' | 'add' | 'delete';\n old?: number;\n new?: number;\n text: string;\n html: string;\n}\n\nexport interface DiffHunk {\n header: string;\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n lines: DiffLine[];\n}\n\nexport interface FileDiff {\n path: string;\n binary: boolean;\n truncated: boolean;\n hunks: DiffHunk[];\n}\n\nexport interface Comparison {\n base: string;\n head: string;\n mergeBase: string;\n ahead: number;\n behind: number;\n commits: Commit[];\n files: FileChange[];\n}\n\nexport interface Entry {\n name: string;\n path: string;\n type: 'tree' | 'blob' | 'commit';\n size?: number;\n lastCommit?: Commit;\n}\n\nexport interface Tree {\n ref: string;\n commit: string;\n path: string;\n entries: Entry[];\n lastCommit?: Commit;\n readme?: { path: string; html: string };\n}\n\nexport interface Blob {\n ref: string;\n commit: string;\n path: string;\n name: string;\n oid: string;\n size: number;\n language?: string;\n binary: boolean;\n image: boolean;\n truncated: boolean;\n lineCount: number;\n lines: string[];\n markdown?: string;\n rawUrl?: string;\n downloadUrl?: string;\n lastCommit?: Commit;\n /** The file as it is (asked for by the editor; UTF-8 text shown in full). */\n text?: string;\n}\n\nexport interface CommitRequest {\n branch: string;\n from?: string;\n expect?: string;\n files?: Record<string, string>;\n uploads?: Record<string, string>;\n deletes?: string[];\n pull?: { title?: string; body?: string };\n message: string;\n}\n\nexport interface CommitResult {\n branch: string;\n commit: Commit;\n created: boolean;\n pull?: number;\n}\n\nexport interface BlameHunk {\n commit: string;\n author: string;\n when: string;\n summary: string;\n startLine: number;\n lines: number;\n}\n\nexport interface Language {\n name: string;\n bytes: number;\n percent: number;\n}\n\nexport interface Ref {\n name: string;\n kind: 'branch' | 'tag';\n commit?: Commit;\n default?: boolean;\n protected?: boolean;\n rule?: string;\n ahead: number;\n behind: number;\n merged: boolean;\n canDelete: boolean;\n}\n\n/** A repository collaborator (DEV-06): access beyond the project role, for one repository. */\nexport interface Collaborator {\n repoId: string;\n userId: string;\n permission: 'read' | 'write' | 'maintain';\n projectRole: string;\n addedBy: string;\n createdAt: string;\n}\n\n/** A file on a release (DEV-15). */\nexport interface ReleaseAsset {\n id: string;\n releaseId: string;\n name: string;\n size: number;\n mediaType: string;\n createdBy: string;\n createdAt: string;\n}\n\n/** A release: a tag with a title, Markdown notes and files; a draft until published. */\nexport interface Release {\n id: string;\n repoId: string;\n tag: string;\n targetSha: string;\n short: string;\n title: string;\n notes: string;\n draft: boolean;\n prerelease: boolean;\n latest: boolean;\n createdBy: string;\n createdAt: string;\n publishedAt: string | null;\n version: number;\n assets: ReleaseAsset[];\n}\n\nexport interface ReleaseInput {\n tag?: string;\n target?: string;\n title?: string;\n notes?: string;\n draft?: boolean;\n prerelease?: boolean;\n version?: number;\n}\n\nexport interface Protection {\n id: string;\n repoId: string;\n pattern: string;\n blockDirectPush: boolean;\n blockForcePush: boolean;\n blockDeletion: boolean;\n requiredApprovals: number;\n dismissStaleApprovals: boolean;\n requireUpToDate: boolean;\n requireCodeOwnerReview?: boolean;\n requiredChecks: string[];\n}\n\nexport interface PullBrief {\n number: number;\n title: string;\n state: 'open' | 'closed' | 'merged';\n draft: boolean;\n authorId: string;\n source: string;\n target: string;\n labels: string[];\n review: string;\n checks: string;\n comments: number;\n keys: string[];\n updatedAt?: string;\n createdAt?: string;\n}\n\nexport interface GateRow {\n text: string;\n meta?: string;\n status: string;\n blocking: boolean;\n users?: string[];\n}\n\nexport interface Gate {\n mergeable: boolean;\n title: string;\n reasons: string[];\n rows: GateRow[];\n conflicts?: string[];\n}\n\nexport interface ReviewBrief {\n authorId: string;\n state: string;\n commitSha: string;\n stale: boolean;\n at: string;\n}\n\nexport interface CheckStatus {\n id: string;\n sha: string;\n context: string;\n state: string;\n url?: string;\n description?: string;\n}\n\nexport interface Pull {\n /** Armed to merge with autoMergeMethod once the gate passes, by autoMergeBy (DEV-25). */\n autoMergeBy?: string;\n autoMergeMethod?: string;\n number: number;\n title: string;\n body: string;\n authorId: string;\n source: string;\n target: string;\n headSha: string;\n state: 'open' | 'closed' | 'merged';\n draft: boolean;\n labels: string[];\n reviewers: string[];\n assignees: string[];\n keys: string[];\n mergeBase: string;\n targetSha: string;\n commits: number;\n gate: Gate;\n reviews: ReviewBrief[];\n checks: CheckStatus[];\n mergeMethods: string[];\n deleteBranchOnMerge: boolean;\n canMerge: boolean;\n canReview: boolean;\n canEdit: boolean;\n sourceDeleted: boolean;\n mergedSha?: string;\n mergedBy?: string;\n mergeMethod?: string;\n mergedAt?: string;\n closedAt?: string;\n createdAt: string;\n updatedAt?: string;\n version: number;\n}\n\nexport interface PRComment {\n id: string;\n threadId?: string;\n reviewId?: string;\n authorId: string;\n body: string;\n pending: boolean;\n createdAt: string;\n editedAt?: string;\n /** The commit that applied this comment's suggested change. */\n appliedSha?: string;\n}\n\nexport interface Review {\n id: string;\n authorId: string;\n state: string;\n body: string;\n commitSha: string;\n createdAt: string;\n submittedAt?: string;\n}\n\nexport interface Thread {\n id: string;\n path: string;\n side: 'old' | 'new';\n line: number;\n startLine: number;\n commitSha: string;\n outdated: boolean;\n resolved: boolean;\n resolvedBy?: string;\n createdBy: string;\n createdAt: string;\n comments: PRComment[];\n}\n\nexport interface Timeline {\n comments: PRComment[];\n reviews: Review[];\n threads: Thread[];\n}\n\nexport interface NewComment {\n body: string;\n path?: string;\n side?: 'old' | 'new';\n line?: number;\n startLine?: number;\n threadId?: string;\n pending?: boolean;\n}\n\nconst C = 'v1/code';\nconst enc = encodeURIComponent;\nconst data = <T>(r: any): T => r?.data as T;\n\nexport function apiMessage(err: any, fallback = 'Something went wrong. Try again.'): string {\n return err?.error?.message || err?.body?.message || err?.message || fallback;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CodeApi {\n private readonly api = inject(ApiService);\n\n private repoPath(project: string, name: string) {\n return `${C}/project/${enc(project)}/repo/${enc(name)}`;\n }\n\n repos(project: string): Observable<Repo[]> {\n return this.api.get(`${C}/project/${enc(project)}/repo`).pipe(map((r) => data<Repo[]>(r) ?? []));\n }\n\n create(project: string, body: { name: string; description?: string; visibility?: string; defaultBranch?: string; readme?: boolean; gitignore?: string; licence?: string }): Observable<Repo> {\n return this.api.post(`${C}/project/${enc(project)}/repo`, body).pipe(map((r) => data<Repo>(r)));\n }\n\n import(project: string, body: { name: string; url: string; username?: string; token?: string; description?: string; visibility?: string }): Observable<Repo> {\n return this.api.post(`${C}/project/${enc(project)}/repo/import`, body).pipe(map((r) => data<Repo>(r)));\n }\n\n repo(project: string, name: string): Observable<Repo> {\n return this.api.get(this.repoPath(project, name)).pipe(map((r) => data<Repo>(r)));\n }\n\n update(project: string, name: string, body: Partial<{ name: string; description: string; visibility: string; defaultBranch: string; mergeMethods: string[]; deleteBranchOnMerge: boolean; allowAutoMerge: boolean }>): Observable<Repo> {\n return this.api.patch(this.repoPath(project, name), body).pipe(map((r) => data<Repo>(r)));\n }\n\n remove(project: string, name: string): Observable<unknown> {\n return this.api.delete(`${this.repoPath(project, name)}?confirm=${enc(name)}`);\n }\n\n setArchived(project: string, name: string, on: boolean): Observable<Repo> {\n return this.api.post(`${this.repoPath(project, name)}/${on ? 'archive' : 'unarchive'}`, {}).pipe(map((r) => data<Repo>(r)));\n }\n\n protections(project: string, name: string): Observable<Protection[]> {\n return this.api.get(`${this.repoPath(project, name)}/protection`).pipe(map((r) => data<Protection[]>(r) ?? []));\n }\n\n addProtection(project: string, name: string, p: Partial<Protection>): Observable<Protection> {\n return this.api.post(`${this.repoPath(project, name)}/protection`, p).pipe(map((r) => data<Protection>(r)));\n }\n\n updateProtection(project: string, name: string, id: string, p: Partial<Protection>): Observable<Protection> {\n return this.api.patch(`${this.repoPath(project, name)}/protection/${enc(id)}`, p).pipe(map((r) => data<Protection>(r)));\n }\n\n removeProtection(project: string, name: string, id: string): Observable<unknown> {\n return this.api.delete(`${this.repoPath(project, name)}/protection/${enc(id)}`);\n }\n\n tree(project: string, name: string, ref: string, path: string): Observable<Tree> {\n return this.api.get(`${this.repoPath(project, name)}/tree`, { ref, path }).pipe(map((r) => data<Tree>(r)));\n }\n\n blob(project: string, name: string, ref: string, path: string, withText = false): Observable<Blob> {\n const p: Record<string, string> = { ref, path };\n if (withText) p['format'] = 'text';\n return this.api.get(`${this.repoPath(project, name)}/blob`, p).pipe(map((r) => data<Blob>(r)));\n }\n\n /** A commit from the browser (DEV-13): files, base64 uploads and deletes; from a new branch it can open a pull request. */\n commitFiles(project: string, name: string, body: CommitRequest): Observable<CommitResult> {\n return this.api.post(`${this.repoPath(project, name)}/commits`, body).pipe(map((r) => data<CommitResult>(r)));\n }\n\n blame(project: string, name: string, ref: string, path: string): Observable<BlameHunk[]> {\n return this.api.get(`${this.repoPath(project, name)}/blame`, { ref, path }).pipe(map((r) => data<BlameHunk[]>(r) ?? []));\n }\n\n files(project: string, name: string, ref: string): Observable<{ files: string[]; truncated: boolean }> {\n return this.api.get(`${this.repoPath(project, name)}/files`, { ref }).pipe(map((r) => data<{ files: string[]; truncated: boolean }>(r) ?? { files: [], truncated: false }));\n }\n\n languages(project: string, name: string, ref: string): Observable<Language[]> {\n return this.api.get(`${this.repoPath(project, name)}/languages`, { ref }).pipe(map((r) => data<Language[]>(r) ?? []));\n }\n\n archiveUrl(project: string, name: string, ref: string, format: 'zip' | 'tar.gz'): Observable<string> {\n return this.api.get(`${this.repoPath(project, name)}/archive`, { ref, format }).pipe(map((r) => data<{ url: string }>(r)?.url ?? ''));\n }\n\n commits(project: string, name: string, q: { ref?: string; path?: string; limit?: number; skip?: number }): Observable<Commit[]> {\n const p: Record<string, string> = {};\n if (q.ref) p['ref'] = q.ref;\n if (q.path) p['path'] = q.path;\n if (q.limit) p['limit'] = String(q.limit);\n if (q.skip) p['skip'] = String(q.skip);\n return this.api.get(`${this.repoPath(project, name)}/commits`, p).pipe(map((r) => data<Commit[]>(r) ?? []));\n }\n\n commit(project: string, name: string, sha: string): Observable<CommitDetail> {\n return this.api.get(`${this.repoPath(project, name)}/commit/${enc(sha)}`).pipe(map((r) => data<CommitDetail>(r)));\n }\n\n /** One file's hunks from base to head (\"\" base: the head's first parent). */\n diff(project: string, name: string, head: string, path: string, base = '', opts: { context?: number; ignoreSpace?: boolean } = {}): Observable<FileDiff> {\n const p: Record<string, string> = { head, path };\n if (base) p['base'] = base;\n if (opts.context) p['context'] = String(opts.context);\n if (opts.ignoreSpace) p['w'] = 'ignore';\n return this.api.get(`${this.repoPath(project, name)}/diff`, p).pipe(map((r) => data<FileDiff>(r)));\n }\n\n compare(project: string, name: string, base: string, head: string): Observable<Comparison> {\n return this.api.get(`${this.repoPath(project, name)}/compare`, { base, head }).pipe(map((r) => data<Comparison>(r)));\n }\n\n refs(project: string, name: string, kind: 'branch' | 'tag' = 'branch', q = ''): Observable<Ref[]> {\n const p: Record<string, string> = { kind };\n if (q) p['q'] = q;\n return this.api.get(`${this.repoPath(project, name)}/refs`, p).pipe(map((r) => data<Ref[]>(r) ?? []));\n }\n\n collaborators(project: string, name: string): Observable<Collaborator[]> {\n return this.api.get(`${this.repoPath(project, name)}/collaborators`).pipe(map((r) => data<Collaborator[]>(r) ?? []));\n }\n\n setCollaborator(project: string, name: string, userId: string, permission: string): Observable<Collaborator> {\n return this.api.put(`${this.repoPath(project, name)}/collaborators/${enc(userId)}`, { permission }).pipe(map((r) => data<Collaborator>(r)));\n }\n\n removeCollaborator(project: string, name: string, userId: string): Observable<unknown> {\n return this.api.delete(`${this.repoPath(project, name)}/collaborators/${enc(userId)}`);\n }\n\n createTag(project: string, name: string, tag: string, target: string): Observable<Ref> {\n return this.api.post(`${this.repoPath(project, name)}/tags`, { tag, target }).pipe(map((r) => data<Ref>(r)));\n }\n\n deleteTag(project: string, name: string, tag: string): Observable<unknown> {\n return this.api.delete(`${this.repoPath(project, name)}/tags/${enc(tag)}`);\n }\n\n releases(project: string, name: string): Observable<Release[]> {\n return this.api.get(`${this.repoPath(project, name)}/releases`).pipe(map((r) => data<Release[]>(r) ?? []));\n }\n\n createRelease(project: string, name: string, r: ReleaseInput): Observable<Release> {\n return this.api.post(`${this.repoPath(project, name)}/releases`, r).pipe(map((x) => data<Release>(x)));\n }\n\n updateRelease(project: string, name: string, id: string, r: ReleaseInput): Observable<Release> {\n return this.api.patch(`${this.repoPath(project, name)}/releases/${enc(id)}`, r).pipe(map((x) => data<Release>(x)));\n }\n\n deleteRelease(project: string, name: string, id: string, deleteTag: boolean): Observable<unknown> {\n return this.api.delete(`${this.repoPath(project, name)}/releases/${enc(id)}${deleteTag ? '?deleteTag=true' : ''}`);\n }\n\n /** Notes drafted from the done issues and merged pull requests since the previous release. */\n releaseNotes(project: string, name: string, target: string, tag = ''): Observable<string> {\n return this.api.post(`${this.repoPath(project, name)}/releases/notes`, { target, tag: tag || undefined }).pipe(map((r) => data<{ notes: string }>(r)?.notes ?? ''));\n }\n\n addAsset(project: string, name: string, id: string, file: File): Observable<ReleaseAsset> {\n return this.api\n .post(`${this.repoPath(project, name)}/releases/${enc(id)}/assets?filename=${encodeURIComponent(file.name)}`, null, {\n body: file, headers: { 'Content-Type': file.type || 'application/octet-stream' },\n })\n .pipe(map((r) => data<ReleaseAsset>(r)));\n }\n\n /** A release file's bytes (the download needs the session, so no plain link works). */\n assetBlob(project: string, name: string, id: string, asset: string): Observable<globalThis.Blob> {\n return this.api.get(`${this.repoPath(project, name)}/releases/${enc(id)}/assets/${enc(asset)}`, null, { responseType: 'blob' }).pipe(map((b: unknown) => b as globalThis.Blob));\n }\n\n deleteAsset(project: string, name: string, id: string, asset: string): Observable<unknown> {\n return this.api.delete(`${this.repoPath(project, name)}/releases/${enc(id)}/assets/${enc(asset)}`);\n }\n\n createBranch(project: string, name: string, branch: string, from: string): Observable<unknown> {\n return this.api.post(`${this.repoPath(project, name)}/branches`, { name: branch, from });\n }\n\n deleteBranch(project: string, name: string, branch: string): Observable<unknown> {\n return this.api.delete(`${this.repoPath(project, name)}/branches?branch=${enc(branch)}`);\n }\n\n deleteMerged(project: string, name: string): Observable<{ deleted?: string[] } | unknown> {\n return this.api.post(`${this.repoPath(project, name)}/branches/delete-merged`, {}).pipe(map((r) => data<any>(r)));\n }\n\n pulls(project: string, name: string, q: { state?: string; author?: string; reviewer?: string; needsMyReview?: boolean; label?: string; q?: string } = {}): Observable<PullBrief[]> {\n const p: Record<string, string> = {};\n for (const [k, v] of Object.entries(q)) if (v !== undefined && v !== '' && v !== false) p[k] = String(v);\n return this.api.get(`${this.repoPath(project, name)}/pulls`, p).pipe(map((r) => data<PullBrief[]>(r) ?? []));\n }\n\n template(project: string, name: string, target: string): Observable<string> {\n return this.api.get(`${this.repoPath(project, name)}/pull-template`, { target }).pipe(map((r) => {\n const d = data<any>(r);\n return typeof d === 'string' ? d : d?.body ?? '';\n }));\n }\n\n openPull(project: string, name: string, body: { source: string; target: string; title: string; body?: string; draft?: boolean; reviewers?: string[]; labels?: string[] }): Observable<Pull> {\n return this.api.post(`${this.repoPath(project, name)}/pulls`, body).pipe(map((r) => data<Pull>(r)));\n }\n\n pull(project: string, name: string, n: number): Observable<Pull> {\n return this.api.get(`${this.repoPath(project, name)}/pulls/${n}`).pipe(map((r) => data<Pull>(r)));\n }\n\n updatePull(project: string, name: string, n: number, body: Partial<{ title: string; body: string; draft: boolean; target: string; reviewers: string[]; assignees: string[]; labels: string[] }>): Observable<Pull> {\n return this.api.patch(`${this.repoPath(project, name)}/pulls/${n}`, body).pipe(map((r) => data<Pull>(r)));\n }\n\n closePull(project: string, name: string, n: number, reopen = false): Observable<Pull> {\n return this.api.post(`${this.repoPath(project, name)}/pulls/${n}/${reopen ? 'reopen' : 'close'}`, {}).pipe(map((r) => data<Pull>(r)));\n }\n\n merge(project: string, name: string, n: number, body: { method: string; message?: string; deleteBranch?: boolean; expectHead?: string }): Observable<Pull> {\n return this.api.post(`${this.repoPath(project, name)}/pulls/${n}/merge`, body).pipe(map((r) => data<Pull>(r)));\n }\n\n conversation(project: string, name: string, n: number): Observable<Timeline> {\n return this.api.get(`${this.repoPath(project, name)}/pulls/${n}/conversation`).pipe(map((r) => data<Timeline>(r) ?? { comments: [], reviews: [], threads: [] }));\n }\n\n comment(project: string, name: string, n: number, c: NewComment): Observable<PRComment> {\n return this.api.post(`${this.repoPath(project, name)}/pulls/${n}/comments`, c).pipe(map((r) => data<PRComment>(r)));\n }\n\n /** Arms (method) or disarms (null) auto-merge on a pull request (DEV-25). */\n autoMerge(project: string, name: string, n: number, method: string | null): Observable<Pull> {\n const url = `${this.repoPath(project, name)}/pulls/${n}/auto-merge`;\n return (method === null ? this.api.delete(url) : this.api.post(url, { method })).pipe(map((r) => data<Pull>(r)));\n }\n\n /** Commits suggested changes of line comments onto the pull request's branch (DEV-20). */\n applySuggestions(project: string, name: string, n: number, comments: string[], message = ''): Observable<CommitResult> {\n return this.api.post(`${this.repoPath(project, name)}/pulls/${n}/suggestions`, { comments, message }).pipe(map((r) => data<CommitResult>(r)));\n }\n\n /** Discards one of the caller's pending review comments. */\n discardComment(project: string, name: string, n: number, id: string): Observable<unknown> {\n return this.api.delete(`${this.repoPath(project, name)}/pulls/${n}/comments/${enc(id)}`);\n }\n\n review(project: string, name: string, n: number, state: 'commented' | 'approved' | 'changes_requested', body = ''): Observable<Review> {\n return this.api.post(`${this.repoPath(project, name)}/pulls/${n}/reviews`, { state, body }).pipe(map((r) => data<Review>(r)));\n }\n\n resolve(project: string, name: string, n: number, thread: string, on: boolean): Observable<unknown> {\n return this.api.post(`${this.repoPath(project, name)}/pulls/${n}/threads/${enc(thread)}/${on ? 'resolve' : 'unresolve'}`, {});\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CodePerson } from './host';\n\n// Small helpers the Code screens share.\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nexport function shortDate(d?: string): string {\n if (!d) return '';\n const t = new Date(d);\n return Number.isNaN(t.getTime()) ? '' : `${MONTHS[t.getMonth()]} ${t.getDate()}`;\n}\n\n/** \"Nov 7, 2026\" for a day heading. */\nexport function dayLabel(d?: string): string {\n if (!d) return '';\n const t = new Date(d);\n return Number.isNaN(t.getTime()) ? '' : `${MONTHS[t.getMonth()]} ${t.getDate()}, ${t.getFullYear()}`;\n}\n\nexport function ago(iso?: string, now = Date.now()): string {\n if (!iso) return '';\n const t = Date.parse(iso);\n if (Number.isNaN(t)) return '';\n const s = Math.max(0, Math.round((now - t) / 1000));\n if (s < 60) return 'just now';\n if (s < 3600) return `${Math.floor(s / 60)} min ago`;\n if (s < 86400) return `${Math.floor(s / 3600)} h ago`;\n if (s < 172800) return 'Yesterday';\n return shortDate(iso);\n}\n\nexport function initials(name: string): string {\n const w = (name || '').split(/[\\s@._-]+/).filter(Boolean);\n return ((w[0]?.[0] ?? '?') + (w[1]?.[0] ?? '')).toUpperCase();\n}\n\nexport function size(bytes?: number): string {\n if (!bytes) return '0 B';\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n}\n\n/** Names and initials by user id, from the host's people. */\nexport class People {\n private readonly byId: Map<string, CodePerson>;\n constructor(people: CodePerson[]) {\n this.byId = new Map(people.map((p) => [p.id, p]));\n }\n name(id?: string | null): string {\n if (!id) return 'Someone';\n return this.byId.get(id)?.name || this.byId.get(id)?.email || 'Someone';\n }\n initials(id?: string | null): string {\n return initials(this.name(id));\n }\n}\n\nconst LANG_COLOURS = ['var(--o-acc)', 'var(--o-ok)', 'var(--o-run)', 'var(--o-vio)', 'var(--o-bad-solid)', 'var(--o-line-mid)'];\nexport function langColour(i: number): string {\n return LANG_COLOURS[Math.min(i, LANG_COLOURS.length - 1)];\n}\n\n/** The state of checks as a dot class: success green, failure red, pending amber, none grey. */\nexport function checkDot(state: string): string {\n return state === 'success' ? 'o-dot o-grn' : state === 'failure' || state === 'error' ? 'o-dot o-red' : state === 'pending' ? 'o-dot o-amb' : 'o-dot o-gry';\n}\n\nexport function copy(text: string): Promise<void> {\n return navigator.clipboard?.writeText(text) ?? Promise.resolve();\n}\n\n/**\n * The repository the person was last in, per project, so the project-level tabs (Files, Commits,\n * Branches, Settings) open it. Browser storage is a convenience: without it the first repository is used.\n */\n@Injectable({ providedIn: 'root' })\nexport class CurrentRepo {\n get(project: string): string {\n try {\n return localStorage.getItem(`origine.code.repo.${project}`) ?? '';\n } catch {\n return '';\n }\n }\n set(project: string, repo: string) {\n try {\n localStorage.setItem(`origine.code.repo.${project}`, repo);\n } catch {\n /* storage blocked: the first repository is used */\n }\n }\n}\n\n/**\n * Highlighted code from the server: spans with Chroma's short token classes behind \"tk-\" (tk-k a\n * keyword, tk-s a string…), coloured with the theme's syntax tokens. Server HTML is not under the\n * component's encapsulation, hence ::ng-deep.\n */\nexport const TOKEN_CSS = `\n :host ::ng-deep [class^=\"tk-k\"]{color:var(--o-tk-k)}\n :host ::ng-deep [class^=\"tk-s\"], :host ::ng-deep [class^=\"tk-l\"]{color:var(--o-tk-s)}\n :host ::ng-deep [class^=\"tk-c\"]{color:var(--o-tk-c);font-style:italic}\n :host ::ng-deep [class^=\"tk-m\"]{color:var(--o-tk-n)}\n :host ::ng-deep .tk-nf, :host ::ng-deep .tk-nx, :host ::ng-deep .tk-fm{color:var(--o-tk-f)}\n :host ::ng-deep .tk-nb, :host ::ng-deep .tk-nt, :host ::ng-deep .tk-bp{color:var(--o-tk-p)}\n :host ::ng-deep .tk-gi{color:var(--o-add)} :host ::ng-deep .tk-gd{color:var(--o-bad-tx)}\n`;\n","import { ChangeDetectionStrategy, Component, Directive, ElementRef, HostListener, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute } from '@angular/router';\nimport { CodeApi, Ref, Repo, apiMessage } from './code.api';\nimport { CodeHost } from './host';\nimport { CurrentRepo, People } from './look';\n\n/**\n * What every page under /code/:repo shares: the project, the repository named in the URL (loaded\n * once per name), the person's people and permissions, and an error line. Pages extend it and load\n * their own data in onRepo().\n */\n@Directive()\nexport abstract class RepoPage {\n protected readonly host = inject(CodeHost);\n protected readonly api = inject(CodeApi);\n protected readonly route = inject(ActivatedRoute);\n private readonly current = inject(CurrentRepo);\n\n protected readonly name = signal('');\n protected readonly repo = signal<Repo | null>(null);\n protected readonly error = signal('');\n protected readonly note = signal('');\n protected readonly people = computed(() => new People(this.host.people()));\n protected readonly canWrite = computed(() => !this.repo()?.archivedAt && (this.repo()?.capabilities ?? []).includes('code.write'));\n protected readonly canAdmin = computed(() => (this.repo()?.capabilities ?? []).includes('resources.manage'));\n /** Repository settings short of a rename, the visibility and deletion: Maintainers, and maintain collaborators. */\n protected readonly canMaintain = computed(() => this.canAdmin() || (this.repo()?.capabilities ?? []).includes('repo.maintain'));\n protected readonly canProtect = computed(() => (this.repo()?.capabilities ?? []).includes('protection.manage'));\n\n constructor() {\n this.route.paramMap.subscribe((m) => this.name.set(m.get('repo') ?? ''));\n effect(() => {\n const name = this.name();\n const p = this.host.project();\n if (name && p) untracked(() => this.loadRepo(p.id, name));\n });\n }\n\n /** Called with the repository once it has loaded (and again after it changes). */\n protected abstract onRepo(repo: Repo): void;\n\n protected projectId(): string {\n return this.host.project()?.id ?? '';\n }\n\n protected link(path = ''): string[] {\n return this.host.link(`code/${this.name()}${path ? '/' + path : ''}`);\n }\n\n protected reloadRepo() {\n const p = this.host.project();\n if (p && this.name()) this.loadRepo(p.id, this.name());\n }\n\n private loadRepo(project: string, name: string) {\n this.error.set('');\n this.api.repo(project, name).subscribe({\n next: (r) => {\n this.repo.set(r);\n this.current.set(project, r.name);\n this.onRepo(r);\n },\n error: (e) => this.error.set(e?.status === 404 ? `There is no repository ${name} you can see in this project.` : apiMessage(e, `Could not open ${name}.`)),\n });\n }\n}\n\n// The branch and tag picker (prototype brOpen): a filterable menu of branches, then tags.\n@Component({\n selector: 'o-ref-picker',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`:host{position:relative;display:inline-block}`],\n template: `\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"toggle()\" [attr.aria-expanded]=\"open()\" aria-haspopup=\"menu\" data-testid=\"ref-picker\">\n <span class=\"o-faint\">{{ kindOf() }}</span><b class=\"o-mono\">{{ current() }}</b><span aria-hidden=\"true\">⌄</span>\n </button>\n @if (open()) {\n <div class=\"o-menu\" role=\"menu\" style=\"left:0;top:34px;width:280px;max-height:360px;overflow:auto\">\n <input class=\"o-in o-sm\" placeholder=\"Find a branch or tag\" aria-label=\"Find a branch or tag\" style=\"margin:4px 0 6px\" [ngModel]=\"q()\" (ngModelChange)=\"q.set($event)\" />\n <div class=\"o-lbl\" style=\"padding:4px 10px\">Branches</div>\n @for (b of shown('branch'); track b.name) {\n <button type=\"button\" role=\"menuitem\" (click)=\"pick(b.name)\"><span class=\"o-mono o-sm o-ell\">{{ b.name }}</span>@if (b.name === current()) {<span class=\"o-k o-grn-t\" aria-label=\"current\">✓</span>}</button>\n } @empty {<span class=\"o-faint o-sm\" style=\"padding:4px 10px\">No branches match.</span>}\n @if (shown('tag').length) {\n <div class=\"o-lbl\" style=\"padding:4px 10px\">Tags</div>\n @for (t of shown('tag'); track t.name) {<button type=\"button\" role=\"menuitem\" (click)=\"pick(t.name)\"><span class=\"o-mono o-sm o-ell\">{{ t.name }}</span></button>}\n }\n </div>\n }\n `,\n})\nexport class RefPicker {\n private readonly api = inject(CodeApi);\n private readonly host = inject(CodeHost);\n private readonly el = inject(ElementRef);\n\n readonly repo = input.required<string>();\n readonly current = input.required<string>();\n readonly picked = output<string>();\n\n protected readonly open = signal(false);\n protected readonly q = signal('');\n private readonly refs = signal<Ref[]>([]);\n protected readonly kindOf = computed(() => (this.refs().some((r) => r.kind === 'tag' && r.name === this.current()) ? 'tag' : 'branch'));\n\n protected shown(kind: 'branch' | 'tag') {\n const q = this.q().toLowerCase();\n return this.refs().filter((r) => r.kind === kind && (!q || r.name.toLowerCase().includes(q))).slice(0, 50);\n }\n\n protected toggle() {\n this.open.set(!this.open());\n const p = this.host.project();\n if (this.open() && p) {\n this.api.refs(p.id, this.repo(), 'branch').subscribe({ next: (b) => this.refs.set([...b, ...this.refs().filter((r) => r.kind === 'tag')]), error: () => undefined });\n this.api.refs(p.id, this.repo(), 'tag').subscribe({ next: (t) => this.refs.set([...this.refs().filter((r) => r.kind === 'branch'), ...t]), error: () => undefined });\n }\n }\n\n protected pick(name: string) {\n this.open.set(false);\n this.picked.emit(name);\n }\n\n @HostListener('document:click', ['$event'])\n protected outside(e: MouseEvent) {\n if (this.open() && !this.el.nativeElement.contains(e.target)) this.open.set(false);\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { AfterViewInit, ChangeDetectionStrategy, Component, DestroyRef, ElementRef, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CodeApi, DiffLine, FileChange, FileDiff, Thread, apiMessage } from './code.api';\nimport { CodeHost } from './host';\nimport { People, TOKEN_CSS, ago } from './look';\n\nexport interface LineComment {\n path: string;\n side: 'old' | 'new';\n line: number;\n body: string;\n /** Part of the caller's review, posted when it is submitted. */\n pending: boolean;\n}\n\nexport interface ThreadReply {\n threadId: string;\n body: string;\n}\n\n/** One row of the split view: the old side and the new side. */\nexport interface SplitRow {\n left?: DiffLine;\n right?: DiffLine;\n}\n\n/** Past this many changed lines a file waits for \"Load diff\" (DEV-19 large diffs). */\nconst LARGE = 600;\n/** Context steps for \"Show more context\". */\nconst CONTEXT = [3, 25, 100];\n\n// One file of a diff (prototype prDiffs): its header with +/− and Viewed, the hunks highlighted,\n// unified or split, and, on a pull request, the review threads on its lines and a comment form on\n// any line number (\"Add single comment\" or part of a review). The diff loads when the file scrolls\n// near the screen; a very large one waits to be asked for.\n@Component({\n selector: 'o-diff',\n imports: [FormsModule, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [TOKEN_CSS, `\n .o-ln .o-n{cursor:default;width:44px}\n .o-ln .o-n.cmt{cursor:pointer}\n .o-ln .o-n.cmt:hover{color:var(--o-acc-tx)}\n .hunk{color:var(--o-dim);background:var(--o-well);padding:2px 12px;font-size:11px}\n .split{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr)}\n .split .side-l{border-right:1px solid var(--o-line-soft)}\n .split .full{grid-column:1 / -1}\n .split .o-ln .o-t{white-space:pre-wrap;word-break:break-all}\n .empty-side{background:var(--o-well)}\n .viewed{display:inline-flex;align-items:center;gap:6px}\n .sugg{border:1px solid var(--o-line);border-radius:6px;overflow:hidden;margin-top:2px}\n .sugg-h{display:flex;align-items:center;gap:8px;padding:6px 10px;background:var(--o-well);font-size:12px}\n `],\n template: `\n <div class=\"o-card\" [attr.id]=\"'file-' + file().path\" [attr.data-testid]=\"'diff-' + file().path\">\n <div class=\"o-ch\" style=\"background:var(--o-well)\">\n <button type=\"button\" class=\"o-btn o-ghost o-xs\" (click)=\"toggleOpen()\" [attr.aria-expanded]=\"open()\" [attr.aria-label]=\"(open() ? 'Collapse ' : 'Expand ') + file().path\">{{ open() ? '▾' : '▸' }}</button>\n <span class=\"o-mono o-sm o-ell\">{{ file().oldPath && file().oldPath !== file().path ? file().oldPath + ' → ' : '' }}{{ file().path }}</span>\n <span class=\"o-grn-t o-sm\">+{{ file().additions }}</span><span class=\"o-red-t o-sm\">−{{ file().deletions }}</span>\n @if (threadsHere().length) {<span class=\"o-faint o-sm\">💬 {{ threadsHere().length }}</span>}\n <span class=\"o-r o-flex\" style=\"gap:6px\">\n @if (open() && diff() && context() < 100 && !file().binary) {<button type=\"button\" class=\"o-btn o-xs\" (click)=\"moreContext()\" [attr.aria-label]=\"'Show more context in ' + file().path\">More context</button>}\n <ng-content />\n @if (viewable()) {\n <button type=\"button\" class=\"o-btn o-xs viewed\" role=\"checkbox\" [attr.aria-checked]=\"viewed()\" [attr.aria-label]=\"'Viewed ' + file().path\" (click)=\"viewedChange.emit(!viewed())\"><span class=\"o-cbx\" [class.o-on]=\"viewed()\" style=\"width:12px;height:12px\"></span>Viewed</button>\n }\n </span>\n </div>\n @if (open()) {\n @if (file().binary) {\n <div class=\"o-empty o-sm\">A binary file.</div>\n } @else if (waiting()) {\n <div class=\"o-empty o-sm o-col\" style=\"gap:8px;align-items:center\">\n <span>{{ file().additions + file().deletions }} changed lines.</span>\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"waiting.set(false); load()\">Load diff</button>\n </div>\n } @else if (error()) {\n <div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>\n } @else if (diff(); as d) {\n @if (d.truncated) {<div class=\"o-note\">This diff is too large to show in full.</div>}\n @if (mode() === 'split') {\n <div class=\"o-code split\" style=\"overflow-x:auto\" role=\"table\" [attr.aria-label]=\"'Changes to ' + file().path + ', side by side'\">\n @for (h of d.hunks; track $index; let hi = $index) {\n <div class=\"hunk o-mono full\" role=\"row\">{{ h.header }}</div>\n @for (r of splitRows()[hi]; track $index) {\n @if (r.left; as l) {\n <div class=\"o-ln side-l\" role=\"row\" [class.o-del]=\"l.kind === 'delete'\" [attr.data-testid]=\"'split-old-' + l.old\">\n <span class=\"o-n\" role=\"rowheader\" [class.cmt]=\"canComment()\" (click)=\"startComment(l)\" [attr.title]=\"canComment() ? 'Comment on this line' : null\">{{ l.old }}</span>\n <span class=\"o-sr-only\">{{ l.kind === 'delete' ? 'removed' : '' }}</span>\n <span class=\"o-t\" role=\"cell\" [innerHTML]=\"l.html || l.text\"></span>\n </div>\n } @else {<div class=\"o-ln side-l empty-side\" aria-hidden=\"true\"><span class=\"o-n\"></span><span class=\"o-t\"></span></div>}\n @if (r.right; as l) {\n <div class=\"o-ln\" role=\"row\" [class.o-add]=\"l.kind === 'add'\" [attr.data-testid]=\"'split-new-' + l.new\">\n <span class=\"o-n\" role=\"rowheader\" [class.cmt]=\"canComment()\" (click)=\"startComment(l)\" [attr.title]=\"canComment() ? 'Comment on this line' : null\">{{ l.new }}</span>\n <span class=\"o-sr-only\">{{ l.kind === 'add' ? 'added' : '' }}</span>\n <span class=\"o-t\" role=\"cell\" [innerHTML]=\"l.html || l.text\"></span>\n </div>\n } @else {<div class=\"o-ln empty-side\" aria-hidden=\"true\"><span class=\"o-n\"></span><span class=\"o-t\"></span></div>}\n @for (l of rowLines(r); track $index) {\n @for (t of threadsAt(l); track t.id) {<div class=\"full\"><ng-container *ngTemplateOutlet=\"threadTpl; context: { $implicit: t }\" /></div>}\n @if (drafting() === key(l)) {<div class=\"full\"><ng-container *ngTemplateOutlet=\"draftTpl; context: { $implicit: l }\" /></div>}\n }\n }\n } @empty {<div class=\"o-empty o-sm full\">{{ ignoreSpace() ? 'Only whitespace changed.' : 'No changes to show.' }}</div>}\n </div>\n } @else {\n <div class=\"o-code\" style=\"overflow-x:auto\" role=\"table\" [attr.aria-label]=\"'Changes to ' + file().path\">\n @for (h of d.hunks; track $index) {\n <div class=\"hunk o-mono\" role=\"row\">{{ h.header }}</div>\n @for (l of h.lines; track $index) {\n <div class=\"o-ln\" role=\"row\" [class.o-add]=\"l.kind === 'add'\" [class.o-del]=\"l.kind === 'delete'\">\n <span class=\"o-n\" role=\"rowheader\" [class.cmt]=\"canComment()\" (click)=\"startComment(l)\" [attr.title]=\"canComment() ? 'Comment on this line' : null\">{{ l.kind === 'delete' ? l.old : l.new }}</span>\n <span class=\"o-s\" aria-hidden=\"true\">{{ l.kind === 'add' ? '+' : l.kind === 'delete' ? '−' : ' ' }}</span>\n <span class=\"o-sr-only\">{{ l.kind === 'add' ? 'added' : l.kind === 'delete' ? 'removed' : '' }}</span>\n <span class=\"o-t\" role=\"cell\" [innerHTML]=\"l.html || l.text\"></span>\n </div>\n @for (t of threadsAt(l); track t.id) {<ng-container *ngTemplateOutlet=\"threadTpl; context: { $implicit: t }\" />}\n @if (drafting() === key(l)) {<ng-container *ngTemplateOutlet=\"draftTpl; context: { $implicit: l }\" />}\n }\n } @empty {\n <div class=\"o-empty o-sm\">{{ ignoreSpace() ? 'Only whitespace changed.' : 'No changes to show.' }}</div>\n }\n </div>\n }\n } @else {\n <div class=\"o-empty o-sm\">Loading…</div>\n }\n }\n </div>\n\n <ng-template #threadTpl let-t>\n <div class=\"o-thread\" [attr.data-testid]=\"'thread-' + t.id\">\n <div class=\"o-cb o-col\" style=\"gap:6px;padding:10px 12px\">\n @for (c of t.comments; track c.id) {\n <span class=\"o-sm\"><b>{{ people().name(c.authorId) }}</b><span class=\"o-faint\"> · {{ ago(c.createdAt) }}</span>\n @if (c.pending) {<span class=\"o-chip o-amb\" style=\"margin-left:6px\">Pending</span>\n @if (c.authorId === me()) {<button type=\"button\" class=\"o-lnk\" style=\"margin-left:6px;color:var(--o-mut)\" (click)=\"discard.emit(c.id)\" [attr.aria-label]=\"'Discard pending comment: ' + c.body\">Discard</button>}\n }\n </span>\n @if (suggestionOf(c.body); as sg) {\n @if (sg.before) {<span style=\"white-space:pre-wrap\">{{ sg.before }}</span>}\n <div class=\"sugg\" [attr.data-testid]=\"'suggestion-' + c.id\">\n <div class=\"sugg-h\"><b>Suggested change</b>\n @if (c.appliedSha) {<span class=\"o-chip o-grn\">Applied in {{ c.appliedSha.slice(0, 7) }}</span>}\n @else if (t.outdated) {<span class=\"o-chip\">Outdated</span>}\n @else if (canApply() && !c.pending) {\n <span class=\"o-r o-flex\" style=\"gap:6px\">\n <button type=\"button\" class=\"o-btn o-xs\" (click)=\"batchToggle.emit(c.id)\" [attr.aria-pressed]=\"batch().includes(c.id)\">{{ batch().includes(c.id) ? 'Remove from batch' : 'Add to batch' }}</button>\n <button type=\"button\" class=\"o-btn o-xs o-pri\" (click)=\"apply.emit([c.id])\" data-testid=\"suggestion-apply\">Apply suggestion</button>\n </span>\n }\n </div>\n @for (l of sg.lines; track $index) {<div class=\"o-ln o-add\"><span class=\"o-s\" aria-hidden=\"true\">+</span><span class=\"o-t\">{{ l }}</span></div>}\n @if (!sg.lines.length) {<div class=\"o-faint o-sm\" style=\"padding:4px 10px\">Delete the line(s).</div>}\n </div>\n } @else {\n <span style=\"white-space:pre-wrap\">{{ c.body }}</span>\n }\n }\n </div>\n @if (canComment()) {\n <div class=\"o-cf\">\n <input class=\"o-in o-sm\" placeholder=\"Reply…\" aria-label=\"Reply\" [ngModel]=\"replies()[t.id] ?? ''\" (ngModelChange)=\"setReply(t.id, $event)\" (keydown.enter)=\"sendReply(t.id)\" />\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"sendReply(t.id)\">Reply</button>\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"resolve.emit({ threadId: t.id, resolved: !t.resolved })\">{{ t.resolved ? 'Unresolve' : 'Resolve' }}</button>\n </div>\n }\n </div>\n </ng-template>\n\n <ng-template #draftTpl let-l>\n <div class=\"o-thread\"><div class=\"o-cb o-col\" style=\"gap:8px;padding:10px 12px\">\n <textarea class=\"o-in\" rows=\"2\" [placeholder]=\"'Leave a comment on line ' + lineOf(l)\" [attr.aria-label]=\"'Comment on line ' + lineOf(l)\" [ngModel]=\"draftBody()\" (ngModelChange)=\"draftBody.set($event)\" data-testid=\"line-comment\"></textarea>\n <div class=\"o-flex o-wrap\"><button type=\"button\" class=\"o-btn o-xs\" (click)=\"insertSuggestion(l)\" data-testid=\"insert-suggestion\">Insert suggestion</button><span class=\"o-faint o-xs\">Markdown works.</span>\n <button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"drafting.set('')\">Cancel</button>\n <button type=\"button\" class=\"o-btn o-sm\" [disabled]=\"!draftBody().trim()\" (click)=\"send(l, false)\" data-testid=\"line-comment-add\">Add single comment</button>\n <button type=\"button\" class=\"o-btn o-sm o-pri\" [disabled]=\"!draftBody().trim()\" (click)=\"send(l, true)\" data-testid=\"line-comment-review\">{{ reviewing() ? 'Add review comment' : 'Start a review' }}</button>\n </div>\n </div></div>\n </ng-template>\n `,\n})\nexport class DiffView implements AfterViewInit {\n private readonly api = inject(CodeApi);\n private readonly host = inject(CodeHost);\n private readonly el = inject(ElementRef<HTMLElement>);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly repo = input.required<string>();\n readonly file = input.required<FileChange>();\n readonly head = input.required<string>();\n readonly base = input('');\n readonly threads = input<Thread[]>([]);\n readonly canComment = input(false);\n readonly mode = input<'unified' | 'split'>('unified');\n readonly ignoreSpace = input(false);\n /** The file is marked viewed (pull requests); null hides the Viewed button. */\n readonly viewed = input<boolean | null>(null);\n /** The caller has a pending review on this pull request. */\n readonly reviewing = input(false);\n readonly comment = output<LineComment>();\n readonly reply = output<ThreadReply>();\n readonly resolve = output<{ threadId: string; resolved: boolean }>();\n readonly discard = output<string>();\n /** The caller can push to the pull request's branch, so may apply suggestions. */\n readonly canApply = input(false);\n /** Suggestions batched to apply together. */\n readonly batch = input<string[]>([]);\n readonly apply = output<string[]>();\n readonly batchToggle = output<string>();\n readonly viewedChange = output<boolean>();\n\n protected readonly open = signal(true);\n protected readonly visible = signal(false);\n protected readonly waiting = signal(false);\n protected readonly context = signal(CONTEXT[0]);\n protected readonly diff = signal<FileDiff | null>(null);\n protected readonly error = signal('');\n protected readonly drafting = signal('');\n protected readonly draftBody = signal('');\n protected readonly replies = signal<Record<string, string>>({});\n protected readonly people = computed(() => new People(this.host.people()));\n protected readonly threadsHere = computed(() => this.threads().filter((t) => t.path === this.file().path));\n protected readonly viewable = computed(() => this.viewed() !== null);\n protected readonly me = computed(() => this.host.meId());\n protected readonly splitRows = computed(() => (this.diff()?.hunks ?? []).map((h) => pair(h.lines)));\n protected readonly ago = (s?: string) => ago(s);\n private asked = false;\n\n constructor() {\n effect(() => {\n // viewed files fold away (and unfold when unmarked)\n const v = this.viewed();\n if (v !== null) untracked(() => this.open.set(!v));\n });\n effect(() => {\n // what the diff depends on; it loads once the file is near the screen and open\n this.head();\n this.base();\n this.ignoreSpace();\n this.context();\n const f = this.file();\n if (!this.visible() || !this.open() || f.binary) return;\n untracked(() => {\n if (!this.asked && f.additions + f.deletions > LARGE) {\n this.waiting.set(true);\n return;\n }\n this.load();\n });\n });\n }\n\n ngAfterViewInit() {\n if (typeof IntersectionObserver === 'undefined') {\n this.visible.set(true);\n return;\n }\n const io = new IntersectionObserver((entries) => {\n if (entries.some((e) => e.isIntersecting)) {\n this.visible.set(true);\n io.disconnect();\n }\n }, { rootMargin: '600px 0px' });\n io.observe(this.el.nativeElement);\n this.destroyRef.onDestroy(() => io.disconnect());\n }\n\n protected load() {\n const p = this.host.project();\n const f = this.file();\n if (!p || !this.head() || f.binary) return;\n this.asked = true;\n this.waiting.set(false);\n this.error.set('');\n this.api.diff(p.id, this.repo(), this.head(), f.path, this.base(), { context: this.context(), ignoreSpace: this.ignoreSpace() }).subscribe({\n next: (d) => this.diff.set(d),\n error: (e) => this.error.set(apiMessage(e, 'Could not load this diff.')),\n });\n }\n\n protected toggleOpen() {\n this.open.set(!this.open());\n }\n\n protected moreContext() {\n const next = CONTEXT.find((c) => c > this.context());\n if (next) this.context.set(next);\n }\n\n protected key(l: DiffLine) {\n return `${l.kind === 'delete' ? 'old' : 'new'}:${this.lineOf(l)}`;\n }\n\n protected lineOf(l: DiffLine) {\n return (l.kind === 'delete' ? l.old : l.new) ?? 0;\n }\n\n /** The lines of a split row that threads and drafts hang from (a context line once). */\n protected rowLines(r: SplitRow): DiffLine[] {\n if (r.left && r.right && r.left === r.right) return [r.left];\n return [r.left, r.right].filter((l): l is DiffLine => !!l);\n }\n\n protected threadsAt(l: DiffLine): Thread[] {\n const side = l.kind === 'delete' ? 'old' : 'new';\n const n = this.lineOf(l);\n return this.threadsHere().filter((t) => !t.outdated && t.side === side && t.line === n);\n }\n\n protected startComment(l: DiffLine) {\n if (!this.canComment()) return;\n this.drafting.set(this.key(l));\n this.draftBody.set('');\n }\n\n protected send(l: DiffLine, pending: boolean) {\n const body = this.draftBody().trim();\n if (!body) return;\n this.comment.emit({ path: this.file().path, side: l.kind === 'delete' ? 'old' : 'new', line: this.lineOf(l), body, pending });\n this.drafting.set('');\n this.draftBody.set('');\n }\n\n /** A comment's ```suggestion block, split into the text before it and the suggested lines. */\n protected suggestionOf(body: string): { before: string; lines: string[] } | null {\n const m = /```suggestion[^\\n]*\\n([\\s\\S]*?)```/.exec(body);\n if (!m) return null;\n const text = m[1].replace(/\\n$/, '');\n return { before: body.slice(0, m.index).trim(), lines: text === '' ? [] : text.split('\\n') };\n }\n\n protected insertSuggestion(l: DiffLine) {\n const cur = this.draftBody();\n this.draftBody.set((cur ? cur.trimEnd() + '\\n' : '') + '```suggestion\\n' + l.text + '\\n```');\n }\n\n protected setReply(id: string, v: string) {\n this.replies.set({ ...this.replies(), [id]: v });\n }\n\n protected sendReply(id: string) {\n const body = (this.replies()[id] ?? '').trim();\n if (!body) return;\n this.reply.emit({ threadId: id, body });\n this.setReply(id, '');\n }\n}\n\n/** Pairs a hunk's lines side by side: context on both sides, a run of removals beside the run of additions that follows it. */\nexport function pair(lines: DiffLine[]): SplitRow[] {\n const rows: SplitRow[] = [];\n let i = 0;\n while (i < lines.length) {\n const l = lines[i];\n if (l.kind === 'context') {\n rows.push({ left: l, right: l });\n i++;\n continue;\n }\n const dels: DiffLine[] = [];\n const adds: DiffLine[] = [];\n while (i < lines.length && lines[i].kind === 'delete') dels.push(lines[i++]);\n while (i < lines.length && lines[i].kind === 'add') adds.push(lines[i++]);\n for (let k = 0; k < Math.max(dels.length, adds.length); k++) rows.push({ left: dels[k], right: adds[k] });\n }\n return rows;\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { CodeApi, Repo, apiMessage } from './code.api';\nimport { CodeHost } from './host';\nimport { CurrentRepo, People, ago, copy } from './look';\n\n// /{org}/{project}/code (prototype \"code_repos\"): the project's repositories.\n@Component({\n selector: 'o-code-repos',\n imports: [RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page\">\n <div class=\"o-ph\">\n <div class=\"o-col\"><span class=\"o-eyebrow\">{{ host.project()?.key }} · {{ repos().length }} {{ repos().length === 1 ? 'repository' : 'repositories' }}</span><h1 class=\"o-t\">Repositories</h1></div>\n @if (canWrite()) {\n <div class=\"o-acts\">\n <a class=\"o-btn\" [routerLink]=\"host.link('code/new')\" [queryParams]=\"{ import: 1 }\">Import repository</a>\n <a class=\"o-btn o-dark\" [routerLink]=\"host.link('code/new')\" data-testid=\"new-repo\">+ New repository</a>\n </div>\n }\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n <div class=\"o-card\" style=\"overflow-x:auto\">\n <div class=\"o-tbl\" role=\"table\" aria-label=\"Repositories\" style=\"min-width:640px\">\n <div class=\"o-thead\" role=\"rowgroup\"><div class=\"o-tr\" role=\"row\"><div class=\"o-th\" role=\"columnheader\">Name</div><div class=\"o-th\" role=\"columnheader\">Default branch</div><div class=\"o-th\" role=\"columnheader\">Last push</div><div class=\"o-th\" role=\"columnheader\">Size</div><div class=\"o-th\" role=\"columnheader\">Visibility</div></div></div>\n <div class=\"o-tbody\" role=\"rowgroup\">\n @for (r of repos(); track r.name) {\n <a class=\"o-tr o-click\" role=\"row\" [routerLink]=\"host.link('code/' + r.name)\" [attr.data-testid]=\"'repo-' + r.name\">\n <div class=\"o-td\" role=\"cell\"><div class=\"o-col\" style=\"gap:2px\"><b class=\"o-mono o-b5\">{{ r.name }}</b>@if (r.description) {<span class=\"o-faint o-sm\">{{ r.description }}</span>}</div></div>\n <div class=\"o-td o-mono o-sm\" role=\"cell\">{{ r.defaultBranch }}</div>\n <div class=\"o-td o-mut\" role=\"cell\">{{ r.importState === 'running' || r.importState === 'queued' ? 'Importing…' : r.empty ? 'Empty' : ago(r.pushedAt) }}</div>\n <div class=\"o-td o-mut o-sm\" role=\"cell\">{{ sizeOf(r.sizeBytes) }}</div>\n <div class=\"o-td\" role=\"cell\"><span class=\"o-chip\">{{ r.visibility === 'private' ? 'Private' : 'Org-internal' }}</span>@if (r.archivedAt) {<span class=\"o-chip o-amb\" style=\"margin-left:4px\">Archived</span>}</div>\n </a>\n } @empty {\n <div class=\"o-empty\">{{ loaded() ? 'No repositories yet. Create one, or import from GitHub, GitLab, Bitbucket or any Git server.' : 'Loading…' }}</div>\n }\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class ReposPage {\n protected readonly host = inject(CodeHost);\n private readonly api = inject(CodeApi);\n protected readonly repos = signal<Repo[]>([]);\n protected readonly loaded = signal(false);\n protected readonly error = signal('');\n protected readonly ago = (s?: string) => ago(s);\n protected readonly canWrite = computed(() => {\n const p = this.host.project();\n return !!p && !p.archivedAt && p.capabilities.includes('code.write');\n });\n\n constructor() {\n effect(() => {\n const p = this.host.project();\n if (p) untracked(() => this.api.repos(p.id).subscribe({\n next: (r) => { this.repos.set(r); this.loaded.set(true); },\n error: (e) => { this.loaded.set(true); this.error.set(apiMessage(e, 'Could not load the repositories.')); },\n }));\n });\n }\n\n protected sizeOf(b: number) {\n return b < 1024 * 1024 ? `${Math.max(1, Math.round(b / 1024))} KB` : `${(b / 1024 / 1024).toFixed(1)} MB`;\n }\n}\n\n// /{org}/{project}/code/new (prototype \"code_new\"): create an empty repository with optional\n// README, .gitignore and licence, or import one from a URL; then the quick-setup commands.\n@Component({\n selector: 'o-code-new',\n imports: [FormsModule, RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page o-narrow\">\n <div class=\"o-ph\"><div class=\"o-col\"><span class=\"o-eyebrow\">{{ host.project()?.key }}</span><h1 class=\"o-t\">Add a repository</h1></div></div>\n <div class=\"o-tabs\" role=\"tablist\">\n <button type=\"button\" role=\"tab\" class=\"o-tab\" [class.o-on]=\"mode() === 'create'\" [attr.aria-selected]=\"mode() === 'create'\" (click)=\"mode.set('create')\">Create</button>\n <button type=\"button\" role=\"tab\" class=\"o-tab\" [class.o-on]=\"mode() === 'import'\" [attr.aria-selected]=\"mode() === 'import'\" (click)=\"mode.set('import')\">Import from URL</button>\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n\n @if (made(); as r) {\n <div class=\"o-card\">\n <div class=\"o-ch\"><b class=\"o-mono\">{{ r.name }}</b><span class=\"o-chip\">{{ r.empty ? 'empty' : r.importState ? 'importing' : 'ready' }}</span><span class=\"o-r\">Quick setup</span></div>\n <div class=\"o-cb o-col\" style=\"gap:14px\">\n <div class=\"o-flex\">\n <div class=\"o-seg\" role=\"group\" aria-label=\"Protocol\"><button type=\"button\" [class.o-on]=\"proto() === 'https'\" (click)=\"proto.set('https')\">HTTPS</button><button type=\"button\" [class.o-on]=\"proto() === 'ssh'\" (click)=\"proto.set('ssh')\">SSH</button></div>\n <div class=\"o-copy\" style=\"flex:1\"><span data-testid=\"clone-url\">{{ url() }}</span><button type=\"button\" class=\"o-btn o-xs\" (click)=\"copyUrl()\">{{ copied() ? 'Copied' : 'Copy' }}</button></div>\n </div>\n @if (r.empty) {\n <b class=\"o-sm\">Create a new repository on the command line</b>\n <div class=\"o-term\"><div>echo \"# {{ r.name }}\" &gt;&gt; README.md</div><div>git init &amp;&amp; git add README.md</div><div>git commit -m \"first commit\"</div><div>git branch -M {{ r.defaultBranch }}</div><div>git remote add origin {{ url() }}</div><div>git push -u origin {{ r.defaultBranch }}</div></div>\n <b class=\"o-sm\">…or push an existing repository</b>\n <div class=\"o-term\"><div>git remote add origin {{ url() }}</div><div>git branch -M {{ r.defaultBranch }}</div><div>git push -u origin {{ r.defaultBranch }}</div></div>\n }\n <a class=\"o-btn o-dark\" style=\"align-self:flex-start\" [routerLink]=\"host.link('code/' + r.name)\">Open {{ r.name }}</a>\n </div>\n </div>\n } @else if (mode() === 'create') {\n <form class=\"o-card o-cb o-form\" (ngSubmit)=\"create()\">\n <div class=\"o-fld\"><label for=\"nr-name\">Repository name</label><input id=\"nr-name\" class=\"o-in o-mono\" name=\"name\" [(ngModel)]=\"repoName\" placeholder=\"payments-api\" autocomplete=\"off\" data-testid=\"repo-name\" /><span class=\"o-hint\">Letters, digits, dots, dashes and underscores.</span></div>\n <div class=\"o-fld\"><label for=\"nr-desc\">Description <span class=\"o-faint\">(optional)</span></label><input id=\"nr-desc\" class=\"o-in\" name=\"desc\" [(ngModel)]=\"desc\" placeholder=\"What lives here?\" /></div>\n <div class=\"o-fld\"><span class=\"o-lbl\" style=\"padding:0\">Visibility</span>\n <div class=\"o-g2\">\n <button type=\"button\" class=\"o-opt\" [class.o-on]=\"vis === 'private'\" (click)=\"vis = 'private'\"><span class=\"o-rad\" [class.o-on]=\"vis === 'private'\"></span><span class=\"o-col\" style=\"gap:2px\"><b>Private</b><span class=\"o-faint o-sm\">Project members only</span></span></button>\n <button type=\"button\" class=\"o-opt\" [class.o-on]=\"vis === 'internal'\" (click)=\"vis = 'internal'\"><span class=\"o-rad\" [class.o-on]=\"vis === 'internal'\"></span><span class=\"o-col\" style=\"gap:2px\"><b>Org-internal</b><span class=\"o-faint o-sm\">Everyone in the organization can read</span></span></button>\n </div>\n </div>\n <div class=\"o-g4\">\n <div class=\"o-fld\"><label for=\"nr-br\">Default branch</label><input id=\"nr-br\" class=\"o-in o-mono\" name=\"branch\" [(ngModel)]=\"branch\" /></div>\n <div class=\"o-fld\"><span class=\"o-lbl\" style=\"padding:0\" id=\"nr-readme\">README</span><button type=\"button\" class=\"o-tog\" role=\"switch\" aria-labelledby=\"nr-readme\" [class.o-on]=\"readme\" [attr.aria-checked]=\"readme\" (click)=\"readme = !readme\" data-testid=\"repo-readme\"></button></div>\n <div class=\"o-fld\"><label for=\"nr-gi\">.gitignore</label><select id=\"nr-gi\" class=\"o-in\" name=\"gi\" [(ngModel)]=\"gitignore\"><option value=\"\">None</option><option value=\"node\">Node</option><option value=\"go\">Go</option><option value=\"python\">Python</option></select></div>\n <div class=\"o-fld\"><label for=\"nr-lic\">Licence</label><select id=\"nr-lic\" class=\"o-in\" name=\"lic\" [(ngModel)]=\"licence\"><option value=\"\">None</option><option value=\"MIT\">MIT</option><option value=\"Apache-2.0\">Apache 2.0</option></select></div>\n </div>\n <div class=\"o-flex\"><span class=\"o-faint o-sm\">Push limits: 2 GB per push, 100 MB per file.</span><button type=\"submit\" class=\"o-btn o-dark o-r\" [disabled]=\"busy() || !repoName.trim()\" data-testid=\"repo-create\">Create repository</button></div>\n </form>\n } @else {\n <form class=\"o-card o-cb o-form\" (ngSubmit)=\"importRepo()\">\n <div class=\"o-fld\"><label for=\"ir-url\">Git URL</label><input id=\"ir-url\" class=\"o-in o-mono\" name=\"url\" [(ngModel)]=\"url_\" placeholder=\"https://github.com/acme/payments-api.git\" (blur)=\"nameFromUrl()\" /><span class=\"o-hint\">GitHub, GitLab, Bitbucket or any Git server over HTTPS. All branches and tags are copied.</span></div>\n <div class=\"o-fld\"><label for=\"ir-name\">Repository name</label><input id=\"ir-name\" class=\"o-in o-mono\" name=\"iname\" [(ngModel)]=\"repoName\" /></div>\n <div class=\"o-g2\">\n <div class=\"o-fld\"><label for=\"ir-user\">Username <span class=\"o-faint\">(private repos)</span></label><input id=\"ir-user\" class=\"o-in\" name=\"user\" [(ngModel)]=\"user\" autocomplete=\"off\" /></div>\n <div class=\"o-fld\"><label for=\"ir-tok\">Access token</label><input id=\"ir-tok\" class=\"o-in\" type=\"password\" name=\"token\" [(ngModel)]=\"token\" autocomplete=\"off\" /></div>\n </div>\n <div class=\"o-flex\"><button type=\"button\" class=\"o-tog o-dis\" disabled aria-label=\"Keep as a pull mirror\"></button><span class=\"o-sm\">Keep as a pull mirror</span><b class=\"o-ph-tag o-later\">Later</b></div>\n <div class=\"o-flex\"><span class=\"o-faint o-sm\">Imports run in the background; you'll get an inbox message when done.</span><button type=\"submit\" class=\"o-btn o-dark o-r\" [disabled]=\"busy() || !url_.trim() || !repoName.trim()\">Import</button></div>\n </form>\n }\n </div>\n `,\n})\nexport class NewRepoPage {\n protected readonly host = inject(CodeHost);\n private readonly api = inject(CodeApi);\n private readonly route = inject(ActivatedRoute);\n\n protected readonly mode = signal<'create' | 'import'>('create');\n protected readonly made = signal<Repo | null>(null);\n protected readonly proto = signal<'https' | 'ssh'>('https');\n protected readonly busy = signal(false);\n protected readonly error = signal('');\n protected readonly copied = signal(false);\n protected readonly url = computed(() => (this.proto() === 'ssh' ? this.made()?.cloneSsh : this.made()?.cloneHttps) || '');\n protected repoName = '';\n protected desc = '';\n protected vis: 'private' | 'internal' = 'private';\n protected branch = 'main';\n protected readme = true;\n protected gitignore = '';\n protected licence = '';\n protected url_ = '';\n protected user = '';\n protected token = '';\n\n constructor() {\n this.route.queryParamMap.subscribe((q) => this.mode.set(q.get('import') ? 'import' : 'create'));\n }\n\n protected nameFromUrl() {\n if (this.repoName.trim()) return;\n const m = this.url_.trim().match(/([^/:]+?)(\\.git)?\\/?$/);\n if (m) this.repoName = m[1];\n }\n\n protected copyUrl() {\n void copy(this.url()).then(() => { this.copied.set(true); setTimeout(() => this.copied.set(false), 1500); });\n }\n\n protected create() {\n const p = this.host.project();\n if (!p) return;\n this.busy.set(true);\n this.error.set('');\n this.api.create(p.id, { name: this.repoName.trim(), description: this.desc.trim(), visibility: this.vis, defaultBranch: this.branch.trim() || 'main', readme: this.readme, gitignore: this.gitignore, licence: this.licence }).subscribe({\n next: (r) => { this.busy.set(false); this.made.set(r); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not create the repository.')); },\n });\n }\n\n protected importRepo() {\n const p = this.host.project();\n if (!p) return;\n this.busy.set(true);\n this.error.set('');\n this.api.import(p.id, { name: this.repoName.trim(), url: this.url_.trim(), username: this.user.trim() || undefined, token: this.token || undefined, visibility: this.vis }).subscribe({\n next: (r) => { this.busy.set(false); this.token = ''; this.made.set(r); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not start the import.')); },\n });\n }\n}\n\n// /{org}/{project}/code/{files,commits,branches,settings}: the project-level tabs open the repository\n// the person was last in (else the first one) at that tab.\n@Component({\n selector: 'o-code-current',\n imports: [RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page o-narrow\">\n @if (none()) {\n <div class=\"o-card o-empty\"><p>No repositories yet.</p><a class=\"o-btn\" style=\"margin-top:14px\" [routerLink]=\"host.link('code/new')\">+ New repository</a></div>\n } @else if (error()) {\n <div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>\n } @else {\n <div class=\"o-card\"><div class=\"o-empty\">Opening the repository…</div></div>\n }\n </div>\n `,\n})\nexport class CurrentRepoPage {\n protected readonly host = inject(CodeHost);\n private readonly api = inject(CodeApi);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly current = inject(CurrentRepo);\n protected readonly none = signal(false);\n protected readonly error = signal('');\n\n constructor() {\n effect(() => {\n const p = this.host.project();\n if (!p) return;\n untracked(() => {\n const tab = String(this.route.snapshot.data['codeTab'] ?? '');\n this.api.repos(p.id).subscribe({\n next: (rs) => {\n if (!rs.length) return this.none.set(true);\n const last = this.current.get(p.id);\n const repo = rs.find((r) => r.name === last)?.name ?? rs[0].name;\n void this.router.navigate(this.host.link(`code/${repo}${tab ? '/' + tab : ''}`), { replaceUrl: true });\n },\n error: (e) => this.error.set(apiMessage(e, 'Could not load the repositories.')),\n });\n });\n });\n }\n}\n\n","import { ChangeDetectionStrategy, Component, ElementRef, HostListener, computed, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router, RouterLink } from '@angular/router';\nimport { Language, Repo, Tree, apiMessage } from './code.api';\nimport { RefPicker, RepoPage } from './repo-base';\nimport { ago, copy, initials, langColour } from './look';\n\n// /{org}/{project}/code/{repo}?ref=&path= (prototype \"code_repo\"): the repository's files at a\n// branch, tag or commit, the last commit of each entry, the README, the clone menu and languages.\n@Component({\n selector: 'o-code-repo',\n imports: [FormsModule, RouterLink, RefPicker],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`.anchor{position:relative} .ic{width:18px;flex:none;color:var(--o-dim);text-align:center}`],\n template: `\n <div class=\"o-page\">\n @if (repo(); as r) {\n <div class=\"o-ph\">\n <div class=\"o-col\">\n <span class=\"o-eyebrow\">{{ r.projectKey }}</span>\n <div class=\"o-flex\"><h1 class=\"o-t o-mono\" style=\"font-size:19px\">{{ r.name }}</h1><span class=\"o-chip\">{{ r.visibility === 'private' ? 'Private' : 'Org-internal' }}</span>@if (r.archivedAt) {<span class=\"o-chip o-amb\">Archived</span>}</div>\n @if (r.description) {<span class=\"o-mut\">{{ r.description }}</span>}\n </div>\n @if (!r.empty) {<div class=\"o-acts\"><button type=\"button\" class=\"o-btn o-sm\" (click)=\"archive('zip')\">Download ZIP</button></div>}\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n\n @if (r.importState && r.importState !== 'done') {\n <div class=\"o-card o-cb o-col\" style=\"gap:6px\">\n <b>{{ r.importState === 'failed' ? 'The import failed' : 'Importing from ' + r.importSource }}</b>\n <span class=\"o-mut o-sm\">{{ r.importState === 'failed' ? r.importError : 'This runs in the background; the inbox tells you when it is done.' }}</span>\n </div>\n } @else if (r.empty) {\n <div class=\"o-card\">\n <div class=\"o-ch\"><b>This repository is empty</b><span class=\"o-r\">Quick setup</span></div>\n <div class=\"o-cb o-col\" style=\"gap:14px\">\n <div class=\"o-flex\">\n <div class=\"o-seg\" role=\"group\" aria-label=\"Protocol\"><button type=\"button\" [class.o-on]=\"proto() === 'https'\" (click)=\"proto.set('https')\">HTTPS</button><button type=\"button\" [class.o-on]=\"proto() === 'ssh'\" (click)=\"proto.set('ssh')\">SSH</button></div>\n <div class=\"o-copy\" style=\"flex:1\"><span data-testid=\"clone-url\">{{ cloneUrl() }}</span><button type=\"button\" class=\"o-btn o-xs\" (click)=\"copyClone()\">{{ copied() ? 'Copied' : 'Copy' }}</button></div>\n </div>\n <b class=\"o-sm\">Push an existing repository</b>\n <div class=\"o-term\"><div>git remote add origin {{ cloneUrl() }}</div><div>git branch -M {{ r.defaultBranch }}</div><div>git push -u origin {{ r.defaultBranch }}</div></div>\n </div>\n </div>\n } @else {\n <div class=\"o-flex o-wrap\">\n <o-ref-picker [repo]=\"r.name\" [current]=\"ref() || r.defaultBranch\" (picked)=\"go($event, '')\" />\n <nav class=\"o-flex o-sm o-mono\" aria-label=\"Path\">\n <a [routerLink]=\"link()\" [queryParams]=\"qp('')\">{{ r.name }}</a>\n @for (c of crumbs(); track c.path) {<span class=\"o-faint\">/</span><a [routerLink]=\"link()\" [queryParams]=\"qp(c.path)\">{{ c.name }}</a>}\n </nav>\n <span class=\"o-r\"></span>\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"openFinder()\">Go to file <span class=\"o-kbd\">T</span></button>\n @if (canWrite()) {\n <span class=\"anchor add\">\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"addOpen.set(!addOpen())\" [attr.aria-expanded]=\"addOpen()\" aria-haspopup=\"menu\" data-testid=\"add-file\">Add file ⌄</button>\n @if (addOpen()) {\n <div class=\"o-menu\" role=\"menu\" style=\"right:0;top:34px;width:200px\">\n <a role=\"menuitem\" [routerLink]=\"link('new')\" [queryParams]=\"{ ref: ref() || null, path: path() || null }\" data-testid=\"add-new\">Create new file</a>\n <a role=\"menuitem\" [routerLink]=\"link('upload')\" [queryParams]=\"{ ref: ref() || null, path: path() || null }\" data-testid=\"add-upload\">Upload files</a>\n </div>\n }\n </span>\n }\n <span class=\"anchor\">\n <button type=\"button\" class=\"o-btn o-sm o-pri\" (click)=\"cloneOpen.set(!cloneOpen())\" [attr.aria-expanded]=\"cloneOpen()\" aria-haspopup=\"dialog\" data-testid=\"clone-menu\">Code ⌄</button>\n @if (cloneOpen()) {\n <div class=\"o-menu\" role=\"dialog\" aria-label=\"Clone\" style=\"right:0;top:34px;width:380px;padding:12px;display:flex;flex-direction:column;gap:10px\">\n <b>Clone</b>\n <div class=\"o-seg\" role=\"group\" aria-label=\"Protocol\" style=\"align-self:flex-start\"><button type=\"button\" [class.o-on]=\"proto() === 'https'\" (click)=\"proto.set('https')\">HTTPS</button><button type=\"button\" [class.o-on]=\"proto() === 'ssh'\" (click)=\"proto.set('ssh')\">SSH</button></div>\n <div class=\"o-copy\"><span data-testid=\"clone-url\">{{ cloneUrl() }}</span><button type=\"button\" class=\"o-btn o-xs\" (click)=\"copyClone()\">{{ copied() ? 'Copied' : 'Copy' }}</button></div>\n <span class=\"o-hint\">{{ proto() === 'https' ? 'Use a personal access token as the password.' : 'Add your SSH key under Account › SSH and signing keys.' }}</span>\n <hr style=\"border:none;border-top:1px solid var(--o-line-soft);margin:0;width:100%\">\n <div class=\"o-flex\"><button type=\"button\" class=\"o-btn o-sm\" (click)=\"archive('zip')\">Download ZIP</button><button type=\"button\" class=\"o-btn o-sm\" (click)=\"archive('tar.gz')\">Download tar.gz</button></div>\n </div>\n }\n </span>\n </div>\n <div class=\"o-split\">\n <div class=\"o-col\" style=\"gap:14px;min-width:0\">\n <div class=\"o-card\">\n @if (tree()?.lastCommit; as lc) {\n <div class=\"o-ch\" style=\"background:var(--o-well)\">\n <span class=\"o-av\" aria-hidden=\"true\">{{ initials(lc.author.name) }}</span><b class=\"o-b5\">{{ lc.author.name }}</b>\n <a class=\"o-ell o-mut\" style=\"min-width:0\" [routerLink]=\"link('commit/' + lc.oid)\">{{ lc.subject }}</a>\n <span class=\"o-r o-flex o-sm\"><a class=\"o-mono\" [routerLink]=\"link('commit/' + lc.oid)\">{{ lc.short }}</a><span class=\"o-faint\">{{ ago(lc.committer.when) }}</span><a [routerLink]=\"link('commits')\" [queryParams]=\"{ ref: ref() }\">History</a></span>\n </div>\n }\n @if (path()) {<a class=\"o-row o-click\" [routerLink]=\"link()\" [queryParams]=\"qp(parent())\"><span class=\"o-faint o-mono ic\">..</span></a>}\n @for (e of tree()?.entries ?? []; track e.path) {\n <a class=\"o-row o-click\" [routerLink]=\"e.type === 'tree' ? link() : link('blob')\" [queryParams]=\"qp(e.path)\" [attr.data-testid]=\"'entry-' + e.name\">\n <span class=\"ic\" aria-hidden=\"true\">{{ e.type === 'tree' ? '▸' : '·' }}</span>\n <span class=\"o-mono o-sm\" style=\"width:200px;flex:none\" [class.o-b5]=\"e.type === 'tree'\">{{ e.name }}</span>\n <span class=\"o-ell o-faint o-sm\" style=\"flex:1\">{{ e.lastCommit?.subject }}</span>\n <span class=\"o-faint o-sm\">{{ ago(e.lastCommit?.committer?.when) }}</span>\n </a>\n } @empty {\n @if (!tree()) {<div class=\"o-empty\">Loading…</div>}\n }\n </div>\n @if (tree()?.readme; as rd) {\n <div class=\"o-card\">\n <div class=\"o-ch\"><b class=\"o-mono o-sm\">{{ rd.path }}</b></div>\n <div class=\"o-cb o-md readme\" style=\"font-size:14px;padding:18px 22px\" [innerHTML]=\"rd.html\"></div>\n </div>\n }\n </div>\n <div class=\"o-col\" style=\"gap:14px\">\n <div class=\"o-card o-cb o-col\"><b>About</b><span class=\"o-mut o-lh\">{{ r.description || 'No description.' }}</span><span class=\"o-faint o-sm\">Default branch <span class=\"o-mono\">{{ r.defaultBranch }}</span></span></div>\n <div class=\"o-card o-cb o-col\"><b>Releases</b><a class=\"o-sm\" [routerLink]=\"link('releases')\" data-testid=\"repo-releases\">Releases and tags</a></div>\n <div class=\"o-card o-cb o-col\"><b>Deployments</b><span class=\"o-faint o-sm\">Environments show here once Deploy is set up.</span></div>\n @if (langs().length) {\n <div class=\"o-card o-cb o-col\">\n <b>Languages</b>\n <div style=\"display:flex;height:8px;border-radius:4px;overflow:hidden\" role=\"img\" [attr.aria-label]=\"langLabel()\">@for (l of langs(); track l.name; let i = $index) {<i [style.width.%]=\"l.percent\" [style.background]=\"colour(i)\"></i>}</div>\n <div class=\"o-legend\">@for (l of langs(); track l.name; let i = $index) {<span><span class=\"o-dot\" [style.background]=\"colour(i)\"></span>{{ l.name }} {{ l.percent.toFixed(0) }}%</span>}</div>\n </div>\n }\n </div>\n </div>\n }\n } @else if (error()) {\n <div class=\"o-card o-empty\"><p>{{ error() }}</p><a class=\"o-btn\" style=\"margin-top:14px\" [routerLink]=\"host.link('code')\">All repositories</a></div>\n } @else {\n <div class=\"o-card\"><div class=\"o-empty\">Loading…</div></div>\n }\n </div>\n\n @if (finding()) {\n <div class=\"o-overlay\" (click)=\"finding.set(false)\">\n <div class=\"o-dlg o-wide\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Go to file\" (click)=\"$event.stopPropagation()\" (keydown.escape)=\"finding.set(false)\">\n <div class=\"o-dlg-b\">\n <input class=\"o-in o-mono\" placeholder=\"Find a file\" aria-label=\"Find a file\" [ngModel]=\"fq()\" (ngModelChange)=\"fq.set($event)\" (keydown.enter)=\"openFirst()\" />\n <div class=\"o-col\" style=\"gap:0;max-height:50vh;overflow:auto\">\n @for (f of found(); track f) {<a class=\"o-row o-click o-mono o-sm\" [routerLink]=\"link('blob')\" [queryParams]=\"qp(f)\" (click)=\"finding.set(false)\">{{ f }}</a>}\n @if (!found().length) {<span class=\"o-faint o-sm\" style=\"padding:8px\">{{ files().length ? 'No files match.' : 'Loading files…' }}</span>}\n </div>\n </div>\n </div>\n </div>\n }\n `,\n})\nexport class RepoHomePage extends RepoPage {\n private readonly router = inject(Router);\n private readonly el = inject(ElementRef);\n\n protected readonly tree = signal<Tree | null>(null);\n protected readonly langs = signal<Language[]>([]);\n protected readonly ref = signal('');\n protected readonly path = signal('');\n protected readonly proto = signal<'https' | 'ssh'>('https');\n protected readonly cloneOpen = signal(false);\n protected readonly addOpen = signal(false);\n protected readonly copied = signal(false);\n protected readonly finding = signal(false);\n protected readonly fq = signal('');\n protected readonly files = signal<string[]>([]);\n protected readonly ago = (s?: string) => ago(s);\n protected readonly initials = initials;\n protected readonly colour = langColour;\n protected readonly cloneUrl = computed(() => (this.proto() === 'ssh' ? this.repo()?.cloneSsh : this.repo()?.cloneHttps) || '');\n protected readonly crumbs = computed(() => {\n const parts = this.path().split('/').filter(Boolean);\n return parts.map((name, i) => ({ name, path: parts.slice(0, i + 1).join('/') }));\n });\n protected readonly parent = computed(() => this.path().split('/').slice(0, -1).join('/'));\n protected readonly found = computed(() => {\n const q = this.fq().toLowerCase();\n return this.files().filter((f) => !q || f.toLowerCase().includes(q)).slice(0, 50);\n });\n protected readonly langLabel = computed(() => this.langs().map((l) => `${l.name} ${l.percent.toFixed(0)}%`).join(', '));\n\n constructor() {\n super();\n this.route.queryParamMap.subscribe((q) => {\n this.ref.set(q.get('ref') ?? '');\n this.path.set(q.get('path') ?? '');\n const r = this.repo();\n if (r && r.name === this.name()) this.load(r);\n });\n }\n\n protected onRepo(r: Repo) {\n this.load(r);\n if (!r.empty) this.api.languages(this.projectId(), r.name, this.ref() || r.defaultBranch).subscribe({ next: (l) => this.langs.set(l), error: () => undefined });\n }\n\n protected qp(path: string) {\n return { ref: this.ref() || null, path: path || null };\n }\n\n protected go(ref: string, path: string) {\n void this.router.navigate(this.link(), { queryParams: { ref, path: path || null } });\n }\n\n protected copyClone() {\n void copy(this.cloneUrl()).then(() => { this.copied.set(true); setTimeout(() => this.copied.set(false), 1500); });\n }\n\n protected archive(format: 'zip' | 'tar.gz') {\n const r = this.repo();\n if (!r) return;\n this.api.archiveUrl(this.projectId(), r.name, this.ref() || r.defaultBranch, format).subscribe({\n next: (u) => { if (u) location.assign(u); },\n error: (e) => this.error.set(apiMessage(e, 'Could not prepare the download.')),\n });\n }\n\n protected openFirst() {\n const f = this.found()[0];\n if (f) { this.finding.set(false); void this.router.navigate(this.link('blob'), { queryParams: this.qp(f) }); }\n }\n\n /** T opens Go to file (prototype). */\n @HostListener('document:keydown', ['$event'])\n protected key(e: KeyboardEvent) {\n const t = e.target as HTMLElement | null;\n if (e.key !== 't' || e.metaKey || e.ctrlKey || e.altKey || t?.closest('input,textarea,select,[contenteditable]')) return;\n if (this.repo() && !this.repo()!.empty && !this.finding()) { e.preventDefault(); this.openFinder(); }\n }\n\n private load(r: Repo) {\n if (r.empty || (r.importState && r.importState !== 'done')) return;\n const ref = this.ref() || r.defaultBranch;\n this.tree.set(null);\n this.api.tree(this.projectId(), r.name, ref, this.path()).subscribe({\n next: (t) => this.tree.set(t),\n error: (e) => this.error.set(apiMessage(e, 'Could not read the files.')),\n });\n this.files.set([]);\n }\n\n protected openFinder() {\n const r = this.repo();\n if (!r || r.empty) return;\n this.finding.set(true);\n this.fq.set('');\n if (!this.files().length) this.api.files(this.projectId(), r.name, this.ref() || r.defaultBranch).subscribe({ next: (f) => this.files.set(f.files), error: () => undefined });\n setTimeout(() => (this.el.nativeElement as HTMLElement).querySelector<HTMLInputElement>('input[aria-label=\"Find a file\"]')?.focus());\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CodeApi, Protection } from './code.api';\nimport { CodeHost } from './host';\n\n/** Where a web commit goes: onto the branch, or onto a new branch with a pull request. */\nexport interface CommitChoice {\n message: string;\n /** Set for a new branch (with a pull request into the current one). */\n newBranch?: string;\n}\n\n/** Whether a branch protection pattern names the branch (as code's protect.Match: * within a segment, ** across). */\nexport function matchesPattern(pattern: string, branch: string): boolean {\n const seg = (p: string) => '^' + p.split('*').map((x) => x.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('[^/]*') + '$';\n const pat = pattern.split('/');\n const name = branch.split('/');\n const go = (i: number, j: number): boolean => {\n if (i === pat.length) return j === name.length;\n if (pat[i] === '**') {\n if (i === pat.length - 1) return j < name.length;\n for (let k = j; k <= name.length; k++) if (go(i + 1, k)) return true;\n return false;\n }\n return j < name.length && new RegExp(seg(pat[i])).test(name[j]) && go(i + 1, j + 1);\n };\n return go(0, 0);\n}\n\n// The web editor's commit box (prototype code_file \"Commit and open PR\", DEV-13): a message, and\n// either the branch itself or a new branch with a pull request. A branch whose rules block direct\n// pushes only offers the second.\n@Component({\n selector: 'o-commit-box',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-col\" style=\"gap:10px\" data-testid=\"commit-box\">\n @if (blocked()) {<div class=\"o-note o-blu\">Your change is committed to a new branch with a pull request because <b>{{ branch() }}</b> is protected.</div>}\n <div class=\"o-fld\"><label for=\"cb-msg\">Commit message</label><input id=\"cb-msg\" class=\"o-in\" [ngModel]=\"message()\" (ngModelChange)=\"message.set($event)\" data-testid=\"commit-message\" /></div>\n @if (!blocked()) {\n <label class=\"o-flex o-sm\"><input type=\"radio\" name=\"cb-where\" [checked]=\"!toNew()\" (change)=\"toNew.set(false)\" /> Commit directly to <b class=\"o-mono\">{{ branch() }}</b></label>\n <label class=\"o-flex o-sm\"><input type=\"radio\" name=\"cb-where\" [checked]=\"toNew()\" (change)=\"toNew.set(true)\" data-testid=\"commit-new-branch\" /> Create a new branch and open a pull request</label>\n }\n @if (toNew() || blocked()) {\n <div class=\"o-flex o-sm\"><span class=\"o-faint\">→ new branch</span><input class=\"o-in o-sm o-mono\" style=\"max-width:260px\" aria-label=\"New branch\" [ngModel]=\"newBranch()\" (ngModelChange)=\"newBranch.set($event)\" data-testid=\"commit-branch\" /></div>\n }\n <div class=\"o-flex\">\n <button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"cancel.emit()\">Cancel</button>\n <button type=\"button\" class=\"o-btn o-sm o-pri\" [disabled]=\"busy() || !message().trim() || ((toNew() || blocked()) && !newBranch().trim())\" (click)=\"send()\" data-testid=\"commit-submit\">{{ toNew() || blocked() ? 'Commit and open PR' : 'Commit changes' }}</button>\n </div>\n </div>\n `,\n})\nexport class CommitBox {\n private readonly api = inject(CodeApi);\n private readonly host = inject(CodeHost);\n\n readonly repo = input.required<string>();\n readonly branch = input.required<string>();\n readonly defaultMessage = input('');\n readonly busy = input(false);\n readonly commit = output<CommitChoice>();\n readonly cancel = output<void>();\n\n protected readonly message = signal('');\n protected readonly toNew = signal(false);\n protected readonly newBranch = signal('');\n private readonly rules = signal<Protection[]>([]);\n protected readonly blocked = computed(() => this.rules().some((r) => r.blockDirectPush && matchesPattern(r.pattern, this.branch())));\n\n constructor() {\n effect(() => {\n const m = this.defaultMessage();\n untracked(() => this.message.set(m));\n });\n effect(() => {\n const repo = this.repo();\n const p = this.host.project();\n if (!p || !repo) return;\n untracked(() => {\n this.api.protections(p.id, repo).subscribe({ next: (r) => this.rules.set(r), error: () => undefined });\n const me = (this.host.people().find((x) => x.id === this.host.meId())?.name || 'patch').toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'patch';\n this.newBranch.set(`${me}/patch-${Math.floor(Date.now() / 1000) % 100000}`);\n });\n });\n }\n\n protected send() {\n const toNew = this.toNew() || this.blocked();\n this.commit.emit({ message: this.message().trim(), newBranch: toNew ? this.newBranch().trim() : undefined });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { Router, RouterLink } from '@angular/router';\nimport { FormsModule } from '@angular/forms';\nimport { BlameHunk, Blob, CommitRequest, Repo, apiMessage } from './code.api';\nimport { CommitBox, CommitChoice } from './commit.box';\nimport { RefPicker, RepoPage } from './repo-base';\nimport { TOKEN_CSS, ago, copy, initials, size } from './look';\n\n// /{org}/{project}/code/{repo}/blob?ref=&path= (prototype \"code_file\"): one file, highlighted, with\n// Markdown preview, blame, raw, copy and download; a line number links to that line (#L12).\n@Component({\n selector: 'o-code-file',\n imports: [RouterLink, RefPicker, FormsModule, CommitBox],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [TOKEN_CSS, `.o-ln .o-n{text-decoration:none} .o-btn.o-on{background:var(--o-tx);border-color:var(--o-tx);color:var(--o-acc-fg)}`],\n template: `\n <div class=\"o-page o-wide\">\n @if (repo(); as r) {\n <div class=\"o-flex o-wrap\">\n <o-ref-picker [repo]=\"r.name\" [current]=\"ref() || r.defaultBranch\" (picked)=\"pickRef($event)\" />\n <nav class=\"o-flex o-sm o-mono\" aria-label=\"Path\">\n <a [routerLink]=\"link()\" [queryParams]=\"{ ref: ref() || null }\">{{ r.name }}</a>\n @for (c of crumbs(); track c.path; let last = $last) {\n <span class=\"o-faint\">/</span>\n @if (last) {<b aria-current=\"page\">{{ c.name }}</b>} @else {<a [routerLink]=\"link()\" [queryParams]=\"{ ref: ref() || null, path: c.path }\">{{ c.name }}</a>}\n }\n </nav>\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @if (note()) {<div class=\"o-note\" role=\"status\">{{ note() }}</div>}\n @if (blob(); as b) {\n <div class=\"o-card\">\n @if (b.lastCommit; as lc) {\n <div class=\"o-ch\" style=\"background:var(--o-well)\">\n <span class=\"o-av\" aria-hidden=\"true\">{{ initials(lc.author.name) }}</span><b class=\"o-b5\">{{ lc.author.name }}</b>\n <span class=\"o-ell o-mut\" style=\"min-width:0\">{{ lc.subject }}</span>\n <span class=\"o-r o-sm\"><a class=\"o-mono\" [routerLink]=\"link('commit/' + lc.oid)\">{{ lc.short }}</a> · {{ ago(lc.committer.when) }} · <a [routerLink]=\"link('commits')\" [queryParams]=\"{ ref: ref() || null, path: b.path }\">History</a></span>\n </div>\n }\n <div class=\"o-ch\">\n <span class=\"o-faint o-sm\">{{ meta() }}</span>\n <span class=\"o-r o-flex\" style=\"gap:6px\">\n @if (b.markdown) {\n <div class=\"o-seg\" role=\"group\" aria-label=\"View\"><button type=\"button\" [class.o-on]=\"view() === 'preview'\" (click)=\"view.set('preview')\">Preview</button><button type=\"button\" [class.o-on]=\"view() === 'code'\" (click)=\"view.set('code')\">Code</button></div>\n }\n @if (!b.binary && !b.truncated) {<button type=\"button\" class=\"o-btn o-xs\" [class.o-on]=\"blaming()\" [attr.aria-pressed]=\"blaming()\" (click)=\"toggleBlame()\">Blame</button>}\n @if (b.rawUrl) {<a class=\"o-btn o-xs\" [href]=\"b.rawUrl\" target=\"_blank\" rel=\"noopener\">Raw</a>}\n @if (!b.binary) {<button type=\"button\" class=\"o-btn o-xs\" (click)=\"copyText()\">{{ copied() ? 'Copied' : 'Copy' }}</button>}\n @if (b.downloadUrl) {<a class=\"o-btn o-xs\" [href]=\"b.downloadUrl\">Download</a>}\n @if (editable()) {\n @if (!b.binary && !b.truncated) {<button type=\"button\" class=\"o-btn o-xs\" (click)=\"startEdit()\" [disabled]=\"mode() !== ''\" data-testid=\"file-edit\">Edit</button>}\n <button type=\"button\" class=\"o-btn o-xs\" (click)=\"mode.set('delete')\" [disabled]=\"mode() !== ''\" data-testid=\"file-delete\">Delete</button>\n }\n </span>\n </div>\n @if (mode() === 'edit') {\n <div class=\"o-cb o-col\" style=\"gap:10px;background:var(--o-well);border-bottom:1px solid var(--o-line-soft)\">\n @if (text() === null) {<span class=\"o-faint o-sm\">Loading the file…</span>} @else {\n <textarea class=\"o-in o-mono\" rows=\"16\" style=\"font-size:12px;height:auto;padding:8px 10px\" aria-label=\"File contents\" [ngModel]=\"text()\" (ngModelChange)=\"text.set($event)\" data-testid=\"file-text\"></textarea>\n <o-commit-box [repo]=\"r.name\" [branch]=\"branch()\" [defaultMessage]=\"'Update ' + b.name\" [busy]=\"busy()\" (commit)=\"save($event)\" (cancel)=\"mode.set('')\" />\n }\n </div>\n }\n @if (mode() === 'delete') {\n <div class=\"o-cb o-col\" style=\"gap:10px;background:var(--o-well);border-bottom:1px solid var(--o-line-soft)\">\n <span class=\"o-sm\">Delete <b class=\"o-mono\">{{ b.path }}</b> from <b class=\"o-mono\">{{ branch() }}</b>?</span>\n <o-commit-box [repo]=\"r.name\" [branch]=\"branch()\" [defaultMessage]=\"'Delete ' + b.name\" [busy]=\"busy()\" (commit)=\"save($event, true)\" (cancel)=\"mode.set('')\" />\n </div>\n }\n @if (b.image && b.rawUrl) {\n <div class=\"o-cb\" style=\"text-align:center\"><img [src]=\"b.rawUrl\" [alt]=\"b.name\" style=\"max-width:100%\" /></div>\n } @else if (b.binary || b.truncated) {\n <div class=\"o-empty\">{{ b.binary ? 'A binary file.' : 'Too large to show here.' }} @if (b.rawUrl) {<a [href]=\"b.rawUrl\" target=\"_blank\" rel=\"noopener\">View raw</a>}</div>\n } @else if (b.markdown && view() === 'preview') {\n <div class=\"o-cb o-md\" style=\"font-size:14px;padding:18px 22px\" [innerHTML]=\"b.markdown\"></div>\n } @else {\n <div class=\"o-code\" style=\"padding:8px 0;overflow-x:auto\" role=\"table\" [attr.aria-label]=\"b.path\">\n @for (l of b.lines; track $index; let i = $index) {\n <div class=\"o-ln\" [class.o-hl]=\"line() === i + 1\" role=\"row\" [attr.id]=\"'L' + (i + 1)\">\n @if (blaming()) {<span class=\"o-bl\" role=\"cell\" [attr.title]=\"blameAt(i + 1)?.summary\">{{ blameLabel(i + 1) }}</span>}\n <a class=\"o-n\" role=\"rowheader\" [routerLink]=\"[]\" [queryParamsHandling]=\"'preserve'\" [fragment]=\"'L' + (i + 1)\" (click)=\"pickLine(i + 1)\" [attr.aria-label]=\"'Line ' + (i + 1)\">{{ i + 1 }}</a>\n <span class=\"o-t\" role=\"cell\" [innerHTML]=\"l\"></span>\n </div>\n }\n </div>\n }\n </div>\n <span class=\"o-faint o-sm\">Click a line number to link to that line.</span>\n } @else if (!error()) {\n <div class=\"o-card\"><div class=\"o-empty\">Loading…</div></div>\n }\n } @else if (error()) {\n <div class=\"o-card o-empty\"><p>{{ error() }}</p></div>\n }\n </div>\n `,\n})\nexport class FilePage extends RepoPage {\n private readonly router = inject(Router);\n protected readonly blob = signal<Blob | null>(null);\n protected readonly blame = signal<BlameHunk[]>([]);\n protected readonly blaming = signal(false);\n protected readonly ref = signal('');\n protected readonly path = signal('');\n protected readonly line = signal(0);\n protected readonly view = signal<'preview' | 'code'>('preview');\n protected readonly copied = signal(false);\n protected readonly ago = (s?: string) => ago(s);\n protected readonly initials = initials;\n protected readonly crumbs = computed(() => {\n const parts = this.path().split('/').filter(Boolean);\n return parts.map((name, i) => ({ name, path: parts.slice(0, i + 1).join('/') }));\n });\n protected readonly meta = computed(() => {\n const b = this.blob();\n if (!b) return '';\n return [b.binary ? '' : `${b.lineCount} lines`, size(b.size), b.language ?? ''].filter(Boolean).join(' · ');\n });\n\n protected readonly mode = signal<'' | 'edit' | 'delete'>('');\n protected readonly text = signal<string | null>(null);\n protected readonly busy = signal(false);\n private readonly branches = signal<string[]>([]);\n /** The branch the view is on ('' for a tag or a commit, which cannot take commits). */\n protected readonly branch = computed(() => {\n const r = this.repo();\n const ref = this.ref() || r?.defaultBranch || '';\n return this.branches().includes(ref) ? ref : '';\n });\n protected readonly editable = computed(() => this.canWrite() && !!this.branch());\n\n constructor() {\n super();\n this.route.queryParamMap.subscribe((q) => {\n this.ref.set(q.get('ref') ?? '');\n this.path.set(q.get('path') ?? '');\n const r = this.repo();\n if (r && r.name === this.name()) this.load(r);\n });\n this.route.fragment.subscribe((f) => this.line.set(f?.startsWith('L') ? Number(f.slice(1)) || 0 : 0));\n }\n\n protected onRepo(r: Repo) {\n this.load(r);\n this.api.refs(this.projectId(), r.name, 'branch').subscribe({ next: (b) => this.branches.set(b.map((x) => x.name)), error: () => undefined });\n }\n\n protected startEdit() {\n const r = this.repo();\n if (!r) return;\n this.mode.set('edit');\n this.text.set(null);\n this.api.blob(this.projectId(), r.name, this.branch(), this.path(), true).subscribe({\n next: (b) => {\n if (b.text === undefined) { this.mode.set(''); this.error.set('This file cannot be edited in the browser.'); return; }\n this.blob.set(b);\n this.text.set(b.text);\n },\n error: (e) => { this.mode.set(''); this.error.set(apiMessage(e, 'Could not open the file.')); },\n });\n }\n\n /** Commits the edit (or the delete), onto the branch or onto a new branch with a pull request. */\n protected save(c: CommitChoice, del = false) {\n const r = this.repo();\n const b = this.blob();\n if (!r || !b) return;\n const body: CommitRequest = c.newBranch\n ? { branch: c.newBranch, from: this.branch(), message: c.message, pull: {} }\n : { branch: this.branch(), expect: b.commit, message: c.message };\n if (del) body.deletes = [b.path];\n else body.files = { [b.path]: this.text() ?? '' };\n this.busy.set(true);\n this.error.set('');\n this.api.commitFiles(this.projectId(), r.name, body).subscribe({\n next: (res) => {\n this.busy.set(false);\n this.mode.set('');\n if (res.pull) { void this.router.navigate(this.link('pull/' + res.pull)); return; }\n if (del) { void this.router.navigate(this.link(), { queryParams: { ref: res.branch, path: b.path.split('/').slice(0, -1).join('/') || null } }); return; }\n this.note.set(`Committed ${res.commit.short} to ${res.branch}.`);\n void this.router.navigate(this.link('blob'), { queryParams: { ref: res.branch, path: b.path } });\n this.load(r);\n },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not commit.')); },\n });\n }\n\n protected pickRef(ref: string) {\n void this.router.navigate(this.link('blob'), { queryParams: { ref, path: this.path() } });\n }\n\n protected pickLine(n: number) {\n this.line.set(n);\n }\n\n protected copyText() {\n const b = this.blob();\n if (!b) return;\n const div = document.createElement('div');\n const text = b.lines.map((l) => { div.innerHTML = l; return div.textContent ?? ''; }).join('\\n');\n void copy(text).then(() => { this.copied.set(true); setTimeout(() => this.copied.set(false), 1500); });\n }\n\n protected toggleBlame() {\n this.blaming.set(!this.blaming());\n const r = this.repo();\n if (this.blaming() && r && !this.blame().length) {\n this.api.blame(this.projectId(), r.name, this.ref() || r.defaultBranch, this.path()).subscribe({ next: (b) => this.blame.set(b), error: (e) => this.error.set(apiMessage(e, 'Could not load the blame.')) });\n }\n }\n\n protected blameAt(n: number): BlameHunk | undefined {\n return this.blame().find((h) => n >= h.startLine && n < h.startLine + h.lines);\n }\n\n /** The hunk's commit and author on its first line only. */\n protected blameLabel(n: number): string {\n const h = this.blameAt(n);\n return h && h.startLine === n ? `${h.commit.slice(0, 7)} ${h.author} · ${ago(h.when)}` : '';\n }\n\n private load(r: Repo) {\n if (!this.path()) return;\n this.blob.set(null);\n this.blame.set([]);\n this.blaming.set(false);\n this.api.blob(this.projectId(), r.name, this.ref() || r.defaultBranch, this.path()).subscribe({\n next: (b) => { this.blob.set(b); this.view.set(b.markdown ? 'preview' : 'code'); if (this.line()) setTimeout(() => document.getElementById('L' + this.line())?.scrollIntoView({ block: 'center' })); },\n error: (e) => this.error.set(apiMessage(e, `Could not open ${this.path()}.`)),\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router, RouterLink } from '@angular/router';\nimport { Commit, CommitDetail, Ref, Repo, apiMessage } from './code.api';\nimport { DiffView } from './diff.view';\nimport { RefPicker, RepoPage } from './repo-base';\nimport { ago, dayLabel, initials } from './look';\n\nconst PAGE = 30;\n\n// /{org}/{project}/code/{repo}/commits?ref=&path= (prototype \"code_commits\"): history grouped by\n// day, with the issue keys each message names.\n@Component({\n selector: 'o-code-commits',\n imports: [RouterLink, RefPicker],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page\">\n @if (repo(); as r) {\n <div class=\"o-ph\">\n <div class=\"o-col\"><span class=\"o-eyebrow\">{{ r.name }}{{ path() ? ' · ' + path() : '' }}</span><h1 class=\"o-t\">Commits</h1></div>\n <div class=\"o-acts\"><o-ref-picker [repo]=\"r.name\" [current]=\"ref() || r.defaultBranch\" (picked)=\"pickRef($event)\" /></div>\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @for (g of groups(); track g.day) {\n <span class=\"o-lbl\" style=\"margin-top:4px\">Commits on {{ g.day }}</span>\n <div class=\"o-card\">\n @for (c of g.items; track c.oid) {\n <div class=\"o-row\" [attr.data-testid]=\"'commit-' + c.short\">\n <div class=\"o-col\" style=\"gap:4px;flex:1;min-width:0\">\n <a class=\"o-b5 o-ell\" style=\"color:var(--o-tx)\" [routerLink]=\"link('commit/' + c.oid)\">{{ c.subject }}</a>\n <span class=\"o-flex o-faint o-sm o-wrap\"><span class=\"o-av\" aria-hidden=\"true\">{{ initials(c.author.name) }}</span>{{ c.author.name }} committed {{ ago(c.committer.when) }}\n @for (k of c.keys; track k) {<a class=\"o-chip o-blu\" [routerLink]=\"host.link('issues/' + k)\">{{ k }}</a>}\n </span>\n </div>\n <a class=\"o-btn o-sm o-mono\" [routerLink]=\"link('commit/' + c.oid)\">{{ c.short }}</a>\n <a class=\"o-btn o-sm\" [routerLink]=\"link()\" [queryParams]=\"{ ref: c.oid }\" title=\"Browse files at this commit\" [attr.aria-label]=\"'Browse files at ' + c.short\">‹›</a>\n </div>\n }\n </div>\n } @empty {\n <div class=\"o-card\"><div class=\"o-empty\">{{ loading() ? 'Loading…' : r.empty ? 'No commits yet: push to ' + r.defaultBranch + '.' : 'No commits.' }}</div></div>\n }\n @if (more()) {<button type=\"button\" class=\"o-btn o-sm\" style=\"align-self:center\" (click)=\"next()\" [disabled]=\"loading()\">Older commits</button>}\n } @else if (error()) {\n <div class=\"o-card o-empty\"><p>{{ error() }}</p></div>\n }\n </div>\n `,\n})\nexport class CommitsPage extends RepoPage {\n private readonly router = inject(Router);\n protected readonly commits = signal<Commit[]>([]);\n protected readonly ref = signal('');\n protected readonly path = signal('');\n protected readonly loading = signal(false);\n protected readonly more = signal(false);\n protected readonly ago = (s?: string) => ago(s);\n protected readonly initials = initials;\n protected readonly groups = computed(() => {\n const out: { day: string; items: Commit[] }[] = [];\n for (const c of this.commits()) {\n const d = dayLabel(c.committer.when);\n const last = out[out.length - 1];\n if (last?.day === d) last.items.push(c);\n else out.push({ day: d, items: [c] });\n }\n return out;\n });\n\n constructor() {\n super();\n this.route.queryParamMap.subscribe((q) => {\n this.ref.set(q.get('ref') ?? '');\n this.path.set(q.get('path') ?? '');\n const r = this.repo();\n if (r && r.name === this.name()) this.load(r, 0);\n });\n }\n\n protected onRepo(r: Repo) {\n this.load(r, 0);\n }\n\n protected pickRef(ref: string) {\n void this.router.navigate(this.link('commits'), { queryParams: { ref, path: this.path() || null } });\n }\n\n protected next() {\n const r = this.repo();\n if (r) this.load(r, this.commits().length);\n }\n\n private load(r: Repo, skip: number) {\n if (r.empty) return;\n this.loading.set(true);\n this.api.commits(this.projectId(), r.name, { ref: this.ref() || r.defaultBranch, path: this.path() || undefined, limit: PAGE, skip }).subscribe({\n next: (cs) => { this.loading.set(false); this.commits.set(skip ? [...this.commits(), ...cs] : cs); this.more.set(cs.length === PAGE); },\n error: (e) => { this.loading.set(false); this.error.set(apiMessage(e, 'Could not load the history.')); },\n });\n }\n}\n\n// /{org}/{project}/code/{repo}/commit/{sha} (prototype \"code_commit\"): the message, author, keys,\n// parents and every changed file's diff.\n@Component({\n selector: 'o-code-commit',\n imports: [RouterLink, DiffView],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page\">\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @if (commit(); as c) {\n <div class=\"o-card\">\n <div class=\"o-cb o-col\" style=\"gap:10px\">\n <h1 class=\"o-t\">{{ c.subject }}</h1>\n @if (c.body) {<span class=\"o-mut o-lh\" style=\"white-space:pre-wrap\">{{ c.body }}</span>}\n <div class=\"o-flex o-wrap o-sm\">\n <span class=\"o-av\" aria-hidden=\"true\">{{ initials(c.author.name) }}</span><b class=\"o-b5\">{{ c.author.name }}</b><span class=\"o-faint\">committed {{ ago(c.committer.when) }}</span>\n @for (k of c.keys; track k) {<a class=\"o-chip o-blu\" [routerLink]=\"host.link('issues/' + k)\">{{ k }}</a>}\n <span class=\"o-r o-mono o-faint\">commit {{ c.oid.slice(0, 10) }}@for (p of c.parents; track p) { · parent <a [routerLink]=\"link('commit/' + p)\">{{ p.slice(0, 7) }}</a>}</span>\n </div>\n </div>\n <div class=\"o-cf\"><a [routerLink]=\"link()\" [queryParams]=\"{ ref: c.oid }\">Browse files</a><span class=\"o-r\">{{ c.files.length }} {{ c.files.length === 1 ? 'file' : 'files' }} changed · <span class=\"o-grn-t\">+{{ c.additions }}</span> <span class=\"o-red-t\">−{{ c.deletions }}</span></span></div>\n </div>\n @for (f of c.files; track f.path) {\n <o-diff [repo]=\"name()\" [file]=\"f\" [head]=\"c.oid\" />\n }\n } @else if (!error()) {\n <div class=\"o-card\"><div class=\"o-empty\">Loading…</div></div>\n }\n </div>\n `,\n})\nexport class CommitPage extends RepoPage {\n protected readonly commit = signal<CommitDetail | null>(null);\n protected readonly ago = (s?: string) => ago(s);\n protected readonly initials = initials;\n private sha = '';\n\n constructor() {\n super();\n this.route.paramMap.subscribe((m) => {\n this.sha = m.get('sha') ?? '';\n const r = this.repo();\n if (r && r.name === this.name()) this.onRepo(r);\n });\n }\n\n protected onRepo(r: Repo) {\n if (!this.sha) return;\n this.commit.set(null);\n this.api.commit(this.projectId(), r.name, this.sha).subscribe({ next: (c) => this.commit.set(c), error: (e) => this.error.set(apiMessage(e, `Could not open commit ${this.sha.slice(0, 7)}.`)) });\n }\n}\n\n// /{org}/{project}/code/{repo}/branches (prototype \"code_branches\"): each branch with its last\n// commit, how far behind and ahead of the default branch it is, protection, its pull request, and\n// create, delete and delete-merged.\n@Component({\n selector: 'o-code-branches',\n imports: [FormsModule, RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`.ab{display:flex;align-items:center;gap:0;width:200px} .ab i{display:block;height:6px} .ab .l{flex:1;display:flex;justify-content:flex-end;border-right:1px solid var(--o-line-mid)} .ab .rr{flex:1}`],\n template: `\n <div class=\"o-page\">\n @if (repo(); as r) {\n <div class=\"o-ph\">\n <div class=\"o-col\"><span class=\"o-eyebrow\">{{ r.name }}</span><h1 class=\"o-t\">Branches</h1></div>\n @if (canWrite()) {\n <div class=\"o-acts\">\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"deleteMerged()\" [disabled]=\"busy()\">Delete merged</button>\n <button type=\"button\" class=\"o-btn o-sm o-dark\" (click)=\"adding.set(!adding())\" data-testid=\"new-branch\">+ New branch</button>\n </div>\n }\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @if (note()) {<div class=\"o-note\" role=\"status\">{{ note() }}</div>}\n @if (adding()) {\n <form class=\"o-card o-cb o-flex o-wrap\" (ngSubmit)=\"create()\">\n <div class=\"o-fld\" style=\"flex:1\"><label for=\"nb-name\">Branch name</label><input id=\"nb-name\" class=\"o-in o-mono\" name=\"name\" [(ngModel)]=\"newName\" data-testid=\"branch-name\" /></div>\n <div class=\"o-fld\"><label for=\"nb-from\">From</label><select id=\"nb-from\" class=\"o-in\" name=\"from\" [(ngModel)]=\"from\">@for (b of refs(); track b.name) {<option [value]=\"b.name\">{{ b.name }}</option>}</select></div>\n <button type=\"submit\" class=\"o-btn o-dark\" style=\"align-self:flex-end\" [disabled]=\"!newName.trim() || busy()\" data-testid=\"branch-create\">Create branch</button>\n </form>\n }\n <div class=\"o-card\" style=\"overflow-x:auto\">\n <div class=\"o-tbl\" role=\"table\" aria-label=\"Branches\" style=\"min-width:720px\">\n <div class=\"o-thead\" role=\"rowgroup\"><div class=\"o-tr\" role=\"row\"><div class=\"o-th\" role=\"columnheader\">Branch</div><div class=\"o-th\" role=\"columnheader\">Updated</div><div class=\"o-th\" role=\"columnheader\" style=\"width:220px\">Behind | Ahead of {{ r.defaultBranch }}</div><div class=\"o-th\" role=\"columnheader\">Pull request</div><div class=\"o-th\" role=\"columnheader\"></div></div></div>\n <div class=\"o-tbody\" role=\"rowgroup\">\n @for (b of refs(); track b.name) {\n <div class=\"o-tr\" role=\"row\" [attr.data-testid]=\"'branch-' + b.name\">\n <div class=\"o-td\" role=\"cell\"><span class=\"o-flex\"><a class=\"o-mono o-b5 o-sm\" [routerLink]=\"link()\" [queryParams]=\"{ ref: b.name }\">{{ b.name }}</a>@if (b.default) {<span class=\"o-chip\">default</span>}@if (b.protected) {<span class=\"o-chip o-amb\" [attr.title]=\"'Rule ' + b.rule\">protected</span>}@if (b.merged && !b.default) {<span class=\"o-chip o-vio\">merged</span>}</span></div>\n <div class=\"o-td o-mut o-sm\" role=\"cell\">@if (b.commit) {<span class=\"o-flex\"><span class=\"o-av\" aria-hidden=\"true\">{{ initials(b.commit.author.name) }}</span>{{ ago(b.commit.committer.when) }}</span>}</div>\n <div class=\"o-td\" role=\"cell\">\n @if (!b.default) {\n <div class=\"ab\" [attr.aria-label]=\"b.behind + ' behind, ' + b.ahead + ' ahead'\">\n <span class=\"o-mono o-xs o-faint\" style=\"width:26px;text-align:right;padding-right:4px\">{{ b.behind }}</span>\n <div class=\"l\"><i [style.width.%]=\"bar(b.behind)\" style=\"border-radius:3px 0 0 3px;background:var(--o-line-mid)\"></i></div>\n <div class=\"rr\"><i [style.width.%]=\"bar(b.ahead)\" style=\"border-radius:0 3px 3px 0;background:var(--o-acc)\"></i></div>\n <span class=\"o-mono o-xs o-faint\" style=\"width:26px;padding-left:4px\">{{ b.ahead }}</span>\n </div>\n }\n </div>\n <div class=\"o-td\" role=\"cell\">\n @if (pullFor(b.name); as pr) {<a [class]=\"pr.state === 'merged' ? 'o-chip o-vio' : pr.state === 'closed' ? 'o-chip' : 'o-chip o-blu'\" [routerLink]=\"link('pull/' + pr.number)\">#{{ pr.number }} {{ pr.state }}</a>}\n @else if (!b.default && b.ahead > 0 && canWrite()) {<a class=\"o-btn o-xs\" [routerLink]=\"link('pulls')\" [queryParams]=\"{ new: 1, source: b.name }\">New PR</a>}\n </div>\n <div class=\"o-td o-num\" role=\"cell\">@if (b.canDelete && canWrite()) {<button type=\"button\" class=\"o-btn o-xs o-ghost\" (click)=\"remove(b)\" [attr.aria-label]=\"'Delete ' + b.name\">Delete</button>}</div>\n </div>\n } @empty {\n <div class=\"o-empty\">{{ r.empty ? 'No branches yet: push to create ' + r.defaultBranch + '.' : 'Loading…' }}</div>\n }\n </div>\n </div>\n </div>\n } @else if (error()) {\n <div class=\"o-card o-empty\"><p>{{ error() }}</p></div>\n }\n </div>\n `,\n})\nexport class BranchesPage extends RepoPage {\n protected readonly refs = signal<Ref[]>([]);\n protected readonly pulls = signal<{ number: number; state: string; source: string }[]>([]);\n protected readonly adding = signal(false);\n protected readonly busy = signal(false);\n protected readonly ago = (s?: string) => ago(s);\n protected readonly initials = initials;\n protected newName = '';\n protected from = '';\n private readonly maxAB = computed(() => Math.max(1, ...this.refs().map((r) => Math.max(r.ahead, r.behind))));\n\n protected onRepo(r: Repo) {\n this.from = r.defaultBranch;\n this.load(r);\n }\n\n protected bar(n: number) {\n return n ? Math.max(4, (100 * n) / this.maxAB()) : 0;\n }\n\n protected pullFor(branch: string) {\n return this.pulls().find((p) => p.source === branch && p.state === 'open') ?? this.pulls().find((p) => p.source === branch);\n }\n\n protected create() {\n const r = this.repo();\n const n = this.newName.trim();\n if (!r || !n) return;\n this.busy.set(true);\n this.api.createBranch(this.projectId(), r.name, n, this.from || r.defaultBranch).subscribe({\n next: () => { this.busy.set(false); this.adding.set(false); this.newName = ''; this.note.set(`Branch ${n} created.`); this.load(r); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not create the branch.')); },\n });\n }\n\n protected remove(b: Ref) {\n const r = this.repo();\n if (!r) return;\n this.api.deleteBranch(this.projectId(), r.name, b.name).subscribe({\n next: () => { this.note.set(`Branch ${b.name} deleted.`); this.load(r); },\n error: (e) => this.error.set(apiMessage(e, `Could not delete ${b.name}.`)),\n });\n }\n\n protected deleteMerged() {\n const r = this.repo();\n if (!r) return;\n this.busy.set(true);\n this.api.deleteMerged(this.projectId(), r.name).subscribe({\n next: (res: any) => { this.busy.set(false); const n = (res?.deleted ?? res ?? []).length ?? 0; this.note.set(n ? `${n} merged ${n === 1 ? 'branch' : 'branches'} deleted.` : 'No merged branches to delete.'); this.load(r); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not delete merged branches.')); },\n });\n }\n\n private load(r: Repo) {\n if (r.empty) return;\n this.api.refs(this.projectId(), r.name, 'branch').subscribe({ next: (b) => this.refs.set(b), error: (e) => this.error.set(apiMessage(e, 'Could not load the branches.')) });\n this.api.pulls(this.projectId(), r.name, { state: 'all' }).subscribe({ next: (p) => this.pulls.set(p), error: () => undefined });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { forkJoin, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { CodeApi, Comparison, PullBrief, Ref, Repo, apiMessage } from './code.api';\nimport { CodeHost } from './host';\nimport { People, ago, checkDot } from './look';\n\ninterface Row extends PullBrief {\n repo: string;\n}\n\nconst REVIEW: Record<string, string> = { approved: 'Approved', changes_requested: 'Changes requested', review_required: 'Review required', commented: 'Commented', '': '' };\n\n// /{org}/{project}/code/pulls (every repository) and /code/{repo}/pulls (prototype \"code_pulls\"):\n// open, merged and closed pull requests with their checks, review state and comments; filters; and\n// the form that opens one (?new=1&source=).\n@Component({\n selector: 'o-code-pulls',\n imports: [FormsModule, RouterLink],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`.st{border:none;background:none;padding:0;font-size:12px;font-weight:500;cursor:pointer;color:var(--o-mut)} .st.o-on{color:var(--o-tx)} .o-btn.o-on{background:var(--o-tx);border-color:var(--o-tx);color:var(--o-acc-fg)}`],\n template: `\n <div class=\"o-page\">\n <div class=\"o-ph\">\n <div class=\"o-col\"><span class=\"o-eyebrow\">{{ repoName() || host.project()?.key + ' · every repository' }}</span><h1 class=\"o-t\">Pull requests</h1></div>\n @if (canWrite() && repos().length) {<div class=\"o-acts\"><button type=\"button\" class=\"o-btn o-dark\" (click)=\"startNew('')\" data-testid=\"new-pull\">New pull request</button></div>}\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n\n @if (opening()) {\n <form class=\"o-card\" (ngSubmit)=\"open()\" aria-label=\"New pull request\">\n <div class=\"o-ch\"><b>New pull request</b></div>\n <div class=\"o-cb o-col\" style=\"gap:12px\">\n <div class=\"o-flex o-wrap\">\n @if (!repoName()) {\n <select class=\"o-in o-sm\" style=\"width:auto\" name=\"repo\" aria-label=\"Repository\" [ngModel]=\"newRepo()\" (ngModelChange)=\"pickRepo($event)\">@for (r of repos(); track r.name) {<option [value]=\"r.name\">{{ r.name }}</option>}</select>\n }\n <span class=\"o-faint o-sm\">into</span>\n <select class=\"o-in o-sm o-mono\" style=\"width:auto\" name=\"target\" aria-label=\"Target branch\" [ngModel]=\"target()\" (ngModelChange)=\"target.set($event); compare()\">@for (b of branches(); track b.name) {<option [value]=\"b.name\">{{ b.name }}</option>}</select>\n <span class=\"o-faint o-sm\">from</span>\n <select class=\"o-in o-sm o-mono\" style=\"width:auto\" name=\"source\" aria-label=\"Source branch\" [ngModel]=\"source()\" (ngModelChange)=\"source.set($event); compare()\" data-testid=\"pull-source\">\n <option value=\"\">Choose a branch</option>\n @for (b of branches(); track b.name) {@if (b.name !== target()) {<option [value]=\"b.name\">{{ b.name }}</option>}}\n </select>\n @if (cmp(); as c) {<span class=\"o-faint o-sm\">{{ c.ahead }} {{ c.ahead === 1 ? 'commit' : 'commits' }} · {{ c.files.length }} {{ c.files.length === 1 ? 'file' : 'files' }}</span>}\n </div>\n <div class=\"o-fld\"><label for=\"np-title\">Title</label><input id=\"np-title\" class=\"o-in\" name=\"title\" [(ngModel)]=\"title\" data-testid=\"pull-title\" /><span class=\"o-hint\">Put an issue key in the title or description to link it; “Closes PAY-142” closes it on merge.</span></div>\n <div class=\"o-fld\"><label for=\"np-body\">Description</label><textarea id=\"np-body\" class=\"o-in\" rows=\"5\" name=\"body\" [(ngModel)]=\"body\" style=\"height:auto;padding:8px 10px\"></textarea></div>\n <div class=\"o-fld\"><label for=\"np-rev\">Reviewers</label>\n <select id=\"np-rev\" class=\"o-in\" name=\"reviewer\" [(ngModel)]=\"reviewer\"><option value=\"\">Nobody yet</option>@for (p of host.people(); track p.id) {@if (p.id !== host.meId()) {<option [value]=\"p.id\">{{ p.name || p.email }}</option>}}</select>\n </div>\n </div>\n <div class=\"o-cf\"><label class=\"o-flex o-sm\"><input type=\"checkbox\" name=\"draft\" [(ngModel)]=\"draft\" />Open as a draft</label><button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"opening.set(false)\">Cancel</button><button type=\"submit\" class=\"o-btn o-sm o-dark\" [disabled]=\"busy() || !source() || !title.trim()\" data-testid=\"pull-open\">Open pull request</button></div>\n </form>\n }\n\n <div class=\"o-flex o-wrap\">\n <input class=\"o-in o-sm\" style=\"flex:1;min-width:240px\" placeholder=\"Search titles\" aria-label=\"Search titles\" [(ngModel)]=\"q\" (keydown.enter)=\"load()\" (blur)=\"load()\" />\n <button type=\"button\" class=\"o-btn o-sm\" [class.o-on]=\"mine()\" [attr.aria-pressed]=\"mine()\" (click)=\"mine.set(!mine()); load()\">Needs my review</button>\n <select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Author\" [(ngModel)]=\"author\" (ngModelChange)=\"load()\"><option value=\"\">Author</option>@for (p of host.people(); track p.id) {<option [value]=\"p.id\">{{ p.name || p.email }}</option>}</select>\n </div>\n <div class=\"o-card\">\n <div class=\"o-ch\"><div class=\"o-flex\" style=\"gap:14px\" role=\"group\" aria-label=\"State\">\n @for (s of states; track s.id) {<button type=\"button\" class=\"st\" [class.o-on]=\"state() === s.id\" [attr.aria-pressed]=\"state() === s.id\" (click)=\"state.set(s.id); load()\">{{ s.icon }} {{ s.label }}</button>}\n </div></div>\n @for (p of rows(); track p.repo + p.number) {\n <a class=\"o-row o-click\" style=\"align-items:flex-start\" [routerLink]=\"host.link('code/' + p.repo + '/pull/' + p.number)\" [attr.data-testid]=\"'pull-' + p.number\">\n <span [style.color]=\"p.state === 'merged' ? 'var(--o-vio)' : p.state === 'closed' ? 'var(--o-bad-solid)' : 'var(--o-ok)'\" style=\"margin-top:1px\" aria-hidden=\"true\">{{ p.state === 'merged' ? '⇄' : p.state === 'closed' ? '✕' : '●' }}</span>\n <div class=\"o-col\" style=\"gap:4px;flex:1;min-width:0\">\n <span class=\"o-flex o-wrap\"><b class=\"o-b5\" style=\"color:var(--o-tx)\">{{ p.title }}</b>@for (l of p.labels; track l) {<span class=\"o-chip o-out\">{{ l }}</span>}@if (p.draft) {<span class=\"o-chip\">Draft</span>}</span>\n <span class=\"o-faint o-sm\">#{{ p.number }} · {{ people().name(p.authorId) }} · @if (!repoName()) {{{ p.repo }} · }<span class=\"o-mono\">{{ p.source }}</span> → <span class=\"o-mono\">{{ p.target }}</span> · updated {{ ago(p.updatedAt) }}</span>\n </div>\n <span class=\"o-flex o-sm\"><span [class]=\"dot(p.checks)\" [attr.title]=\"'Checks: ' + (p.checks || 'none')\"></span><span class=\"o-mut\">{{ review(p.review) }}</span><span class=\"o-faint\" [attr.aria-label]=\"p.comments + ' comments'\">💬 {{ p.comments }}</span></span>\n </a>\n } @empty {\n <div class=\"o-empty\">{{ loading() ? 'Loading…' : repos().length ? 'No pull requests match.' : 'No repositories yet.' }}</div>\n }\n </div>\n </div>\n `,\n})\nexport class PullsPage {\n protected readonly host = inject(CodeHost);\n private readonly api = inject(CodeApi);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n\n protected readonly states = [{ id: 'open', label: 'Open', icon: '●' }, { id: 'merged', label: 'Merged', icon: '✓' }, { id: 'closed', label: 'Closed', icon: '✕' }];\n protected readonly repoName = signal('');\n protected readonly repos = signal<Repo[]>([]);\n protected readonly rows = signal<Row[]>([]);\n protected readonly state = signal('open');\n protected readonly mine = signal(false);\n protected readonly loading = signal(false);\n protected readonly error = signal('');\n protected readonly busy = signal(false);\n protected readonly opening = signal(false);\n protected readonly newRepo = signal('');\n protected readonly branches = signal<Ref[]>([]);\n protected readonly source = signal('');\n protected readonly target = signal('');\n protected readonly cmp = signal<Comparison | null>(null);\n protected q = '';\n protected author = '';\n protected title = '';\n protected body = '';\n protected reviewer = '';\n protected draft = false;\n private wantNew: { source: string } | null = null;\n\n protected readonly people = computed(() => new People(this.host.people()));\n protected readonly ago = (s?: string) => ago(s);\n protected readonly dot = checkDot;\n protected readonly review = (r: string) => REVIEW[r] ?? r.replace(/_/g, ' ');\n protected readonly canWrite = computed(() => {\n const p = this.host.project();\n return !!p && !p.archivedAt && p.capabilities.includes('code.write');\n });\n\n constructor() {\n this.route.paramMap.subscribe((m) => this.repoName.set(m.get('repo') ?? ''));\n this.route.queryParamMap.subscribe((q) => { if (q.get('new')) this.wantNew = { source: q.get('source') ?? '' }; });\n effect(() => {\n const p = this.host.project();\n this.repoName();\n if (p) untracked(() => this.api.repos(p.id).subscribe({\n next: (rs) => {\n const only = this.repoName();\n this.repos.set(only ? rs.filter((r) => r.name === only) : rs.filter((r) => !r.empty));\n this.load();\n if (this.wantNew) { this.startNew(this.wantNew.source); this.wantNew = null; }\n },\n error: (e) => this.error.set(apiMessage(e, 'Could not load the repositories.')),\n }));\n });\n }\n\n protected load() {\n const p = this.host.project();\n if (!p) return;\n const q = { state: this.state(), q: this.q.trim(), author: this.author, needsMyReview: this.mine() };\n const repos = this.repos();\n if (!repos.length) { this.rows.set([]); return; }\n this.loading.set(true);\n forkJoin(repos.map((r) => this.api.pulls(p.id, r.name, q).pipe(map((ps) => ps.map((x) => ({ ...x, repo: r.name }))), catchError(() => of([] as Row[]))))).subscribe({\n next: (lists) => {\n this.loading.set(false);\n this.rows.set(lists.flat().sort((a, b) => (b.updatedAt ?? '').localeCompare(a.updatedAt ?? '')));\n },\n error: (e) => { this.loading.set(false); this.error.set(apiMessage(e, 'Could not load the pull requests.')); },\n });\n }\n\n protected startNew(source: string) {\n const repo = this.repoName() || this.repos()[0]?.name || '';\n if (!repo) return;\n this.opening.set(true);\n this.title = '';\n this.body = '';\n this.pickRepo(repo, source);\n }\n\n protected pickRepo(name: string, source = '') {\n const p = this.host.project();\n const r = this.repos().find((x) => x.name === name);\n if (!p || !r) return;\n this.newRepo.set(name);\n this.target.set(r.defaultBranch);\n this.source.set(source);\n this.cmp.set(null);\n this.api.refs(p.id, name, 'branch').subscribe({ next: (b) => { this.branches.set(b); this.compare(); }, error: () => undefined });\n this.api.template(p.id, name, r.defaultBranch).subscribe({ next: (t) => { if (!this.body) this.body = t; }, error: () => undefined });\n }\n\n protected compare() {\n const p = this.host.project();\n if (!p || !this.source() || !this.target()) { this.cmp.set(null); return; }\n if (!this.title.trim()) this.title = this.source().replace(/^[^/]+\\//, '').replace(/[-_]/g, ' ');\n this.api.compare(p.id, this.newRepo(), this.target(), this.source()).subscribe({ next: (c) => this.cmp.set(c), error: () => this.cmp.set(null) });\n }\n\n protected open() {\n const p = this.host.project();\n if (!p) return;\n this.busy.set(true);\n this.error.set('');\n this.api.openPull(p.id, this.newRepo(), { source: this.source(), target: this.target(), title: this.title.trim(), body: this.body, draft: this.draft, reviewers: this.reviewer ? [this.reviewer] : [] }).subscribe({\n next: (pr) => { this.busy.set(false); void this.router.navigate(this.host.link(`code/${this.newRepo()}/pull/${pr.number}`)); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not open the pull request.')); },\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, HostListener, computed, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterLink } from '@angular/router';\nimport { marked } from 'marked';\nimport { Comparison, Pull, Repo, Thread, Timeline, apiMessage } from './code.api';\nimport { DiffView, LineComment, ThreadReply } from './diff.view';\nimport { RepoPage } from './repo-base';\nimport { ago, checkDot, initials } from './look';\n\ntype Tab = 'conversation' | 'commits' | 'files' | 'checks';\n\ninterface Event {\n at: string;\n kind: 'comment' | 'review' | 'thread';\n who: string;\n body?: string;\n state?: string;\n thread?: Thread;\n id: string;\n}\n\nconst METHOD: Record<string, { label: string; hint: string; done: string }> = {\n merge: { label: 'Create a merge commit', hint: 'All commits plus a merge commit', done: 'merged' },\n squash: { label: 'Squash and merge', hint: 'One commit on the target', done: 'squashed and merged' },\n rebase: { label: 'Rebase and merge', hint: 'The commits, linear history', done: 'rebased and merged' },\n};\n\n// /{org}/{project}/code/{repo}/pull/{n} (prototype \"code\"): the pull request's conversation, commits,\n// files changed with line threads, and checks; the merge box with the gate's rows, the merge method\n// and branch deletion; a review (comment, approve, request changes).\n@Component({\n selector: 'o-code-pull',\n imports: [FormsModule, RouterLink, DiffView],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`\n .badge{padding:3px 10px;border-radius:12px;font-size:12px;font-weight:500;color:var(--o-acc-fg)}\n .anchor{position:relative;align-self:center}\n .merge{display:flex;align-items:center;position:relative}\n .merge .go{height:32px;padding:0 14px;border-radius:7px 0 0 7px;border:none;font-size:13px;font-weight:500;color:var(--o-acc-fg);background:var(--o-ok);cursor:pointer}\n .merge .mn{height:32px;padding:0 10px;border:none;border-radius:0 7px 7px 0;font-size:12px;color:var(--o-acc-fg);background:var(--o-ok);border-left:1px solid rgba(255,255,255,.25);cursor:pointer}\n .merge button:disabled{background:var(--o-line-mid);cursor:not-allowed}\n .tl{display:flex;flex-direction:column;gap:10px;padding-left:14px;border-left:2px solid var(--o-line);margin-left:14px}\n .files-split{display:grid;grid-template-columns:210px minmax(0,1fr);gap:14px;align-items:start}\n .files-split:has(> :only-child){grid-template-columns:minmax(0,1fr)}\n .files-tree{position:sticky;top:8px;max-height:calc(100vh - 120px);overflow:auto}\n @media (max-width:900px){ .files-split{grid-template-columns:minmax(0,1fr)} .files-tree{display:none} }\n `],\n template: `\n <div style=\"max-width:1180px;margin:0 auto;padding:22px 24px 40px;display:flex;flex-direction:column;gap:16px\">\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @if (note()) {<div class=\"o-note\" role=\"status\">{{ note() }}</div>}\n @if (pr(); as p) {\n <div class=\"o-col\">\n <span class=\"o-eyebrow\">{{ name() }} · pull/{{ p.number }}</span>\n <h1 class=\"o-t\">{{ p.title }} <span class=\"o-faint\" style=\"font-weight:400\">#{{ p.number }}</span></h1>\n <div class=\"o-flex o-wrap o-mut\">\n <span class=\"badge\" [style.background]=\"badgeBg()\" data-testid=\"pull-state\">{{ badge() }}</span>\n <span>{{ people().name(p.authorId) }} {{ p.state === 'merged' ? 'merged' : 'wants to merge' }} {{ p.commits }} {{ p.commits === 1 ? 'commit' : 'commits' }} into</span>\n <span class=\"o-chip o-mono\">{{ p.target }}</span><span>from</span><span class=\"o-chip o-mono\">{{ p.source }}</span>\n </div>\n </div>\n <div class=\"o-tabs\" role=\"tablist\">\n @for (t of tabs(); track t.id) {<button type=\"button\" role=\"tab\" class=\"o-tab\" [class.o-on]=\"tab() === t.id\" [attr.aria-selected]=\"tab() === t.id\" (click)=\"pick(t.id)\">{{ t.label }}@if (t.n !== undefined) {<span class=\"o-n\">{{ t.n }}</span>}</button>}\n <span class=\"o-r\"></span>\n @if (p.state === 'open' && (p.canReview || myPending().length)) {\n <div class=\"anchor\">\n <button type=\"button\" class=\"o-btn o-sm o-pri\" (click)=\"reviewOpen.set(!reviewOpen())\" [attr.aria-expanded]=\"reviewOpen()\" aria-haspopup=\"dialog\" data-testid=\"review-open\">Review changes ⌄</button>\n @if (reviewOpen()) {\n <div class=\"o-menu\" role=\"dialog\" aria-label=\"Finish your review\" style=\"right:0;top:36px;width:380px;padding:14px;display:flex;flex-direction:column;gap:10px\">\n <b>Finish your review</b>\n <span class=\"o-faint o-sm\" data-testid=\"review-pending-note\">{{ myPending().length ? myPending().length + ' pending ' + (myPending().length === 1 ? 'comment' : 'comments') + ' included' : 'No pending comments' }}</span>\n <textarea class=\"o-in\" rows=\"3\" placeholder=\"Leave a comment\" aria-label=\"Review comment\" style=\"height:auto;padding:8px 10px\" [ngModel]=\"revBody()\" (ngModelChange)=\"revBody.set($event)\"></textarea>\n @for (k of reviewKinds(); track k.id) {\n <button type=\"button\" class=\"o-opt\" style=\"padding:8px 10px\" [class.o-on]=\"revKind() === k.id\" (click)=\"revKind.set(k.id)\"><span class=\"o-rad\" [class.o-on]=\"revKind() === k.id\"></span><span class=\"o-col\" style=\"gap:1px\"><b class=\"o-b5\">{{ k.label }}</b><span class=\"o-faint o-sm\">{{ k.hint }}</span></span></button>\n }\n <div class=\"o-flex\"><button type=\"button\" class=\"o-btn o-sm o-pri o-r\" (click)=\"submitReview()\" [disabled]=\"busy() || (revKind() !== 'approved' && !revBody().trim() && !(revKind() === 'commented' && myPending().length))\" data-testid=\"review-submit\">Submit review</button></div>\n </div>\n }\n </div>\n }\n </div>\n\n <div class=\"o-split\" style=\"grid-template-columns:minmax(0,1fr) 260px;gap:24px\">\n <div class=\"o-col\" style=\"gap:14px;min-width:0\">\n @switch (tab()) {\n @case ('conversation') {\n <div class=\"o-card\">\n <div style=\"padding:9px 14px;background:var(--o-well);border-bottom:1px solid var(--o-line-soft);color:var(--o-mut);font-size:12px\"><b style=\"color:var(--o-tx);font-weight:600\">{{ people().name(p.authorId) }}</b> opened this {{ ago(p.createdAt) }}</div>\n <div class=\"o-cb o-md\" style=\"font-size:13px\" [innerHTML]=\"p.body ? md(p.body) : '<p class=&quot;o-faint&quot;>No description.</p>'\"></div>\n </div>\n <div class=\"tl\">\n @for (e of events(); track e.id) {\n @switch (e.kind) {\n @case ('comment') {\n <div class=\"o-card o-cb o-col\" style=\"gap:6px\"><span class=\"o-sm o-mut\"><b style=\"color:var(--o-tx);font-weight:600\">{{ people().name(e.who) }}</b> commented {{ ago(e.at) }}</span><div class=\"o-md\" style=\"font-size:13px\" [innerHTML]=\"md(e.body ?? '')\"></div></div>\n }\n @case ('review') {\n <span [style.color]=\"e.state === 'approved' ? 'var(--o-ok-tx)' : e.state === 'changes_requested' ? 'var(--o-bad-tx)' : 'var(--o-mut)'\">{{ people().name(e.who) }} {{ reviewVerb(e.state) }} · {{ ago(e.at) }}@if (e.body) {: “{{ e.body }}”}</span>\n }\n @case ('thread') {\n <div class=\"o-card o-cb o-col\" style=\"gap:6px\">\n <span class=\"o-sm o-mut\"><b style=\"color:var(--o-tx);font-weight:600\">{{ people().name(e.who) }}</b> commented on <button type=\"button\" class=\"o-lnk o-mono\" (click)=\"pick('files')\">{{ e.thread!.path }}</button> line {{ e.thread!.line }}@if (e.thread!.outdated) { · <span class=\"o-chip\">Outdated</span>}</span>\n @for (c of e.thread!.comments; track c.id) {<span class=\"o-sm\"><b class=\"o-b5\">{{ people().name(c.authorId) }}</b> {{ c.body }}</span>}\n <div class=\"o-flex\"><span class=\"o-faint o-sm\">{{ e.thread!.resolved ? 'Resolved' + (e.thread!.resolvedBy ? ' by ' + people().name(e.thread!.resolvedBy) : '') : 'Unresolved' }}</span>@if (p.state === 'open') {<button type=\"button\" class=\"o-lnk o-r\" (click)=\"resolve({ threadId: e.thread!.id, resolved: !e.thread!.resolved })\">{{ e.thread!.resolved ? 'Unresolve' : 'Resolve conversation' }}</button>}</div>\n </div>\n }\n }\n }\n @if (p.state === 'merged') {<span style=\"color:var(--o-vio-tx)\" data-testid=\"merged-line\">{{ people().name(p.mergedBy) }} {{ methodDone(p.mergeMethod) }} into {{ p.target }} · {{ ago(p.mergedAt) }}</span>}\n @if (p.state === 'closed') {<span class=\"o-red-t\">Closed {{ ago(p.closedAt) }}</span>}\n </div>\n\n <div class=\"o-card\" [style.border-color]=\"p.state === 'open' ? (p.gate.mergeable ? 'var(--o-ok)' : 'var(--o-line-mid)') : null\" data-testid=\"merge-box\">\n <div class=\"o-cb o-col\" style=\"gap:10px;border-bottom:1px solid var(--o-line-soft)\">\n <span style=\"font-weight:600;font-size:14px\" [style.color]=\"p.state === 'merged' ? 'var(--o-vio-tx)' : p.gate.mergeable ? 'var(--o-ok-tx)' : 'var(--o-tx)'\">{{ p.state === 'merged' ? 'Merged' : p.state === 'closed' ? 'Closed without merging' : p.gate.title }}</span>\n @if (p.state === 'open') {\n @for (r of p.gate.rows; track $index) {\n <div class=\"o-flex\"><span [class]=\"rowDot(r.status)\" aria-hidden=\"true\"></span><span>{{ r.text }}</span><span class=\"o-r o-faint o-sm\">{{ r.meta }}</span></div>\n }\n }\n </div>\n @if (p.state === 'open') {\n <div class=\"o-flex o-wrap\" style=\"padding:12px 14px;background:var(--o-well)\">\n @if (p.canReview && !approvedByMe()) {<button type=\"button\" class=\"o-btn\" (click)=\"approve()\" [disabled]=\"busy()\" data-testid=\"approve\">Approve</button>}\n @if (p.canEdit) {<button type=\"button\" class=\"o-btn o-ghost\" (click)=\"close(false)\" [disabled]=\"busy()\">Close</button>}\n @if (p.autoMergeBy) {\n <span class=\"o-chip o-blu\" data-testid=\"auto-merge-on\">Auto-merge on · {{ methodLabel(p.autoMergeMethod || 'merge') }} · by {{ people().name(p.autoMergeBy) }}</span>\n @if (canWrite()) {<button type=\"button\" class=\"o-btn o-sm o-ghost\" (click)=\"setAutoMerge(null)\" [disabled]=\"busy()\" data-testid=\"auto-merge-off\">Disable auto-merge</button>}\n } @else if (repo()?.allowAutoMerge && canWrite() && !p.gate.mergeable) {\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"setAutoMerge(method())\" [disabled]=\"busy()\" data-testid=\"auto-merge-enable\" title=\"Merges as you once every requirement passes\">Enable auto-merge</button>\n }\n @if (p.canMerge) {\n <span class=\"o-faint o-sm\">Delete branch after merge</span><button type=\"button\" class=\"o-tog\" role=\"switch\" aria-label=\"Delete branch after merge\" [class.o-on]=\"delBranch()\" [attr.aria-checked]=\"delBranch()\" (click)=\"delBranch.set(!delBranch())\"></button>\n <div class=\"merge o-r\">\n <button type=\"button\" class=\"go\" (click)=\"merge()\" [disabled]=\"!p.gate.mergeable || busy()\" data-testid=\"merge\">{{ methodLabel(method()) }}</button>\n <button type=\"button\" class=\"mn\" (click)=\"mergeMenu.set(!mergeMenu())\" [attr.aria-expanded]=\"mergeMenu()\" aria-label=\"Choose the merge method\" [disabled]=\"busy()\">⌄</button>\n @if (mergeMenu()) {\n <div class=\"o-menu\" role=\"menu\" style=\"right:0;bottom:40px;width:300px\">\n @for (m of p.mergeMethods; track m) {<button type=\"button\" role=\"menuitemradio\" [attr.aria-checked]=\"method() === m\" (click)=\"method.set(m); mergeMenu.set(false)\"><span class=\"o-col\" style=\"gap:1px\"><b class=\"o-b5\">{{ methodLabel(m) }}</b><span class=\"o-faint o-xs\">{{ methodHint(m) }}</span></span></button>}\n </div>\n }\n </div>\n }\n </div>\n } @else if (p.state === 'closed' && p.canEdit) {\n <div class=\"o-flex\" style=\"padding:12px 14px;background:var(--o-well)\"><button type=\"button\" class=\"o-btn o-r\" (click)=\"close(true)\" [disabled]=\"busy()\">Reopen</button></div>\n } @else if (p.state === 'merged') {\n <div class=\"o-flex\" style=\"padding:12px 14px;background:var(--o-well)\"><span class=\"o-mut\">{{ p.sourceDeleted ? 'Branch ' + p.source + ' deleted.' : 'Branch ' + p.source + ' can be deleted.' }}</span>@if (p.mergedSha) {<a class=\"o-btn o-r\" [routerLink]=\"link('commit/' + p.mergedSha)\">View {{ p.mergedSha.slice(0, 7) }}</a>}</div>\n }\n </div>\n\n <div class=\"o-card\">\n <label class=\"o-sr-only\" for=\"pr-cmt\">Add a comment</label>\n <textarea id=\"pr-cmt\" class=\"o-in\" style=\"border:none;box-shadow:none;min-height:70px;height:auto;padding:10px 12px\" placeholder=\"Add a comment. Markdown works.\" [ngModel]=\"draft()\" (ngModelChange)=\"draft.set($event)\" data-testid=\"pull-comment\"></textarea>\n <div class=\"o-cf\"><span>Markdown</span><button type=\"button\" class=\"o-btn o-sm o-dark o-r\" (click)=\"addComment()\" [disabled]=\"!draft().trim() || busy()\" data-testid=\"pull-comment-add\">Comment</button></div>\n </div>\n }\n @case ('commits') {\n <div class=\"o-card\">\n @for (c of cmp()?.commits ?? []; track c.oid) {\n <div class=\"o-row\"><span class=\"o-av\" aria-hidden=\"true\">{{ initials(c.author.name) }}</span><a class=\"o-ell\" style=\"flex:1;color:var(--o-tx)\" [routerLink]=\"link('commit/' + c.oid)\">{{ c.subject }}</a><a class=\"o-mono o-sm o-faint\" [routerLink]=\"link('commit/' + c.oid)\">{{ c.short }}</a></div>\n } @empty {<div class=\"o-empty\">{{ cmp() ? 'No commits.' : 'Loading…' }}</div>}\n </div>\n }\n @case ('files') {\n @if (batch().length) {\n <div class=\"o-note o-blu o-flex\" data-testid=\"suggestion-batch\"><span>{{ batch().length }} {{ batch().length === 1 ? 'suggestion' : 'suggestions' }} in a batch</span>\n <button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"batch.set([])\">Clear</button>\n <button type=\"button\" class=\"o-btn o-sm o-pri\" (click)=\"applySuggestions(batch())\" [disabled]=\"busy()\" data-testid=\"suggestion-commit\">Commit suggestions</button>\n </div>\n }\n <div class=\"o-flex o-wrap\">\n <div class=\"o-seg\" role=\"group\" aria-label=\"Diff view\"><button type=\"button\" [class.o-on]=\"mode() === 'unified'\" [attr.aria-pressed]=\"mode() === 'unified'\" (click)=\"setMode('unified')\">Unified</button><button type=\"button\" [class.o-on]=\"mode() === 'split'\" [attr.aria-pressed]=\"mode() === 'split'\" (click)=\"setMode('split')\" data-testid=\"diff-split\">Split</button></div>\n <button type=\"button\" class=\"o-btn o-sm\" [class.o-on]=\"hideWs()\" [attr.aria-pressed]=\"hideWs()\" (click)=\"hideWs.set(!hideWs())\" data-testid=\"hide-ws\">Hide whitespace</button>\n @if (myPending().length) {<span class=\"o-chip o-amb\" data-testid=\"pending-count\">{{ myPending().length }} pending {{ myPending().length === 1 ? 'comment' : 'comments' }}</span>}\n <span class=\"o-r o-faint o-sm\" data-testid=\"viewed-note\">{{ viewedCount() }} of {{ cmp()?.files?.length ?? 0 }} files viewed · {{ openThreads() }} unresolved {{ openThreads() === 1 ? 'conversation' : 'conversations' }}</span>\n </div>\n <div class=\"files-split\">\n @if ((cmp()?.files?.length ?? 0) > 1) {\n <div class=\"o-card files-tree\" role=\"navigation\" aria-label=\"Files\">\n @for (f of cmp()?.files ?? []; track f.path) {\n <button type=\"button\" class=\"o-row o-click o-sm\" style=\"width:100%;border:none;background:none;text-align:left\" (click)=\"jump(f.path)\"><span class=\"o-cbx\" [class.o-on]=\"isViewed(f.path)\" aria-hidden=\"true\"></span><span class=\"o-mono o-ell\" style=\"flex:1\">{{ f.path }}</span><span class=\"o-grn-t o-xs\">+{{ f.additions }}</span></button>\n }\n </div>\n }\n <div class=\"o-col\" style=\"gap:14px;min-width:0\">\n @for (f of cmp()?.files ?? []; track f.path) {\n <o-diff [repo]=\"name()\" [file]=\"f\" [head]=\"p.headSha\" [base]=\"p.mergeBase\" [threads]=\"threads()\" [canComment]=\"p.state === 'open'\" [mode]=\"mode()\" [ignoreSpace]=\"hideWs()\"\n [viewed]=\"isViewed(f.path)\" [reviewing]=\"myPending().length > 0\" (viewedChange)=\"setViewed(f.path, $event)\"\n [canApply]=\"p.state === 'open' && canWrite()\" [batch]=\"batch()\" (batchToggle)=\"toggleBatch($event)\" (apply)=\"applySuggestions($event)\"\n (comment)=\"lineComment($event)\" (reply)=\"reply($event)\" (resolve)=\"resolve($event)\" (discard)=\"discard($event)\" />\n } @empty {<div class=\"o-card\"><div class=\"o-empty\">{{ cmp() ? 'No changes.' : 'Loading…' }}</div></div>}\n </div>\n </div>\n }\n @case ('checks') {\n <div class=\"o-card\">\n @for (c of p.checks; track c.id) {\n <div class=\"o-row\"><span [class]=\"dot(c.state)\" aria-hidden=\"true\"></span><span class=\"o-mono o-sm\">{{ c.context }}</span><span class=\"o-faint\">{{ c.description }}</span>@if (c.url) {<a class=\"o-r o-sm\" [href]=\"c.url\" target=\"_blank\" rel=\"noopener\">Details</a>}</div>\n } @empty {<div class=\"o-empty\">No checks reported on {{ p.headSha.slice(0, 7) }}. Pipelines report here once Deploy is set up.</div>}\n </div>\n }\n }\n </div>\n\n <div class=\"o-col\" style=\"gap:18px;font-size:13px\">\n <div class=\"o-col\">\n <span class=\"o-lbl\">Reviewers</span>\n @for (r of reviewers(); track r.id) {<div class=\"o-flex\"><span class=\"o-av\" aria-hidden=\"true\">{{ people().initials(r.id) }}</span><span>{{ people().name(r.id) }}</span><span class=\"o-r o-sm\" [style.color]=\"r.colour\">{{ r.label }}</span></div>}\n @if (!reviewers().length) {<span class=\"o-faint o-sm\">No reviewers yet.</span>}\n <span class=\"o-faint o-xs\">Code owners of changed paths (CODEOWNERS) are asked automatically.</span>\n </div>\n <div class=\"o-col\"><span class=\"o-lbl\">Labels</span><div class=\"o-flex o-wrap\">@for (l of p.labels; track l) {<span class=\"o-chip o-out\">{{ l }}</span>}@if (!p.labels.length) {<span class=\"o-faint o-sm\">None</span>}</div></div>\n <div class=\"o-col\">\n <span class=\"o-lbl\">Linked issues</span>\n @for (k of p.keys; track k) {<a class=\"o-card o-cb o-click o-col\" style=\"gap:4px;padding:10px 12px;color:var(--o-tx)\" [routerLink]=\"host.link('issues/' + k)\"><span class=\"o-mono o-xs o-mut\">{{ k }}</span></a>}\n @if (!p.keys.length) {<span class=\"o-faint o-sm\">Name an issue key in the title or description to link it.</span>}\n </div>\n <div class=\"o-col\"><span class=\"o-lbl\">Deployments</span><span class=\"o-faint o-sm\">Releases that contain this pull request appear here after merge.</span></div>\n @if (canProtect()) {<div class=\"o-col\"><span class=\"o-lbl\">Branch protection · {{ p.target }}</span><a class=\"o-sm\" [routerLink]=\"link('settings')\" [queryParams]=\"{ section: 'protect' }\">Edit rules</a></div>}\n </div>\n </div>\n } @else if (!error()) {\n <div class=\"o-card\"><div class=\"o-empty\">Loading…</div></div>\n }\n </div>\n `,\n})\nexport class PullPage extends RepoPage {\n private readonly el = inject(ElementRef);\n protected readonly pr = signal<Pull | null>(null);\n protected readonly timeline = signal<Timeline>({ comments: [], reviews: [], threads: [] });\n protected readonly cmp = signal<Comparison | null>(null);\n protected readonly tab = signal<Tab>('conversation');\n protected readonly busy = signal(false);\n protected readonly draft = signal('');\n protected readonly reviewOpen = signal(false);\n protected readonly revBody = signal('');\n protected readonly revKind = signal<'commented' | 'approved' | 'changes_requested'>('commented');\n protected readonly mergeMenu = signal(false);\n protected readonly method = signal('merge');\n protected readonly delBranch = signal(false);\n private number = 0;\n\n protected readonly ago = (s?: string) => ago(s);\n protected readonly initials = initials;\n protected readonly dot = checkDot;\n protected readonly threads = computed(() => this.timeline().threads);\n protected readonly mode = signal<'unified' | 'split'>(readPref('origine.diff.mode') === 'split' ? 'split' : 'unified');\n protected readonly hideWs = signal(false);\n /** Files marked viewed, kept per pull request head in this browser (a new push resets them). */\n protected readonly viewed = signal<Record<string, boolean>>({});\n protected readonly viewedCount = computed(() => (this.cmp()?.files ?? []).filter((f) => this.viewed()[f.path]).length);\n /** The caller's pending review comments (shown only to them until the review is submitted). */\n protected readonly myPending = computed(() => {\n const me = this.host.meId();\n const t = this.timeline();\n return [...t.comments, ...t.threads.flatMap((th) => th.comments)].filter((c, i, all) => c.pending && c.authorId === me && all.findIndex((x) => x.id === c.id) === i);\n });\n protected readonly openThreads = computed(() => this.threads().filter((t) => !t.resolved && !t.outdated).length);\n protected readonly tabs = computed(() => {\n const p = this.pr();\n return [\n { id: 'conversation' as Tab, label: 'Conversation', n: undefined },\n { id: 'commits' as Tab, label: 'Commits', n: p?.commits },\n { id: 'files' as Tab, label: 'Files changed', n: this.cmp()?.files.length },\n { id: 'checks' as Tab, label: 'Checks', n: p?.checks.length },\n ];\n });\n protected readonly badge = computed(() => {\n const p = this.pr();\n return !p ? '' : p.state === 'merged' ? 'Merged' : p.state === 'closed' ? 'Closed' : p.draft ? 'Draft' : 'Open';\n });\n protected readonly badgeBg = computed(() => ({ Merged: 'var(--o-vio)', Closed: 'var(--o-bad-solid)', Draft: 'var(--o-dim)', Open: 'var(--o-ok)' } as Record<string, string>)[this.badge()] ?? 'var(--o-dim)');\n protected readonly approvedByMe = computed(() => (this.pr()?.reviews ?? []).some((r) => r.authorId === this.host.meId() && r.state === 'approved' && !r.stale));\n protected readonly reviewKinds = computed(() => {\n const need = this.pr()?.gate.rows.find((r) => /required by branch protection|requires/.test(r.text + (r.meta ?? '')));\n const comment = { id: 'commented' as const, label: 'Comment', hint: 'General feedback without approving.' };\n // the author (or a role that cannot push) still posts their pending comments as a review\n if (!this.pr()?.canReview) return [{ ...comment, hint: 'Post your pending comments.' }];\n return [\n comment,\n { id: 'approved' as const, label: 'Approve', hint: need ? `Counts toward the approvals ${this.pr()?.target} requires.` : 'Approve these changes.' },\n { id: 'changes_requested' as const, label: 'Request changes', hint: 'Blocks merge until you approve.' },\n ];\n });\n protected readonly reviewers = computed(() => {\n const p = this.pr();\n if (!p) return [];\n const ids = [...new Set([...p.reviewers, ...p.reviews.map((r) => r.authorId)])];\n return ids.map((id) => {\n const r = p.reviews.find((x) => x.authorId === id);\n const state = r ? (r.stale ? 'stale' : r.state) : 'requested';\n const label = { approved: 'Approved', changes_requested: 'Changes requested', commented: 'Commented', dismissed: 'Dismissed', stale: 'Approved an older commit', requested: 'Requested' }[state] ?? state;\n const colour = state === 'approved' ? 'var(--o-ok-tx)' : state === 'changes_requested' ? 'var(--o-bad-tx)' : 'var(--o-dim)';\n return { id, label, colour };\n });\n });\n protected readonly events = computed<Event[]>(() => {\n const t = this.timeline();\n const out: Event[] = [];\n for (const c of t.comments) if (!c.threadId) out.push({ id: 'c' + c.id, at: c.createdAt, kind: 'comment', who: c.authorId, body: c.body + (c.pending ? ' (pending)' : '') });\n for (const r of t.reviews) if (r.state !== 'pending') out.push({ id: 'r' + r.id, at: r.submittedAt ?? r.createdAt, kind: 'review', who: r.authorId, state: r.state, body: r.body });\n for (const th of t.threads) out.push({ id: 't' + th.id, at: th.createdAt, kind: 'thread', who: th.createdBy, thread: th });\n return out.sort((a, b) => a.at.localeCompare(b.at));\n });\n\n constructor() {\n super();\n this.route.paramMap.subscribe((m) => {\n this.number = Number(m.get('number') ?? 0);\n const r = this.repo();\n if (r && r.name === this.name()) this.onRepo(r);\n });\n }\n\n protected onRepo(_: Repo) {\n if (this.number) this.load(true);\n }\n\n protected md(s: string): string {\n return marked.parse(s || '', { async: false, gfm: true, breaks: true }) as string;\n }\n\n protected pick(t: Tab) {\n this.tab.set(t);\n }\n\n protected methodLabel(m: string) {\n return METHOD[m]?.label.replace('Create a merge commit', 'Merge pull request') ?? m;\n }\n\n protected methodHint(m: string) {\n return METHOD[m]?.hint ?? '';\n }\n\n protected methodDone(m?: string) {\n return METHOD[m ?? 'merge']?.done ?? 'merged';\n }\n\n protected reviewVerb(state?: string) {\n return state === 'approved' ? 'approved these changes' : state === 'changes_requested' ? 'requested changes' : state === 'dismissed' ? 'had a review dismissed' : 'reviewed';\n }\n\n protected rowDot(status: string) {\n return status === 'ok' ? 'o-dot o-grn' : status === 'failed' ? 'o-dot o-red' : 'o-dot o-amb';\n }\n\n protected approve() {\n this.sendReview('approved', '');\n }\n\n protected submitReview() {\n this.sendReview(this.revKind(), this.revBody().trim());\n }\n\n protected addComment() {\n const body = this.draft().trim();\n if (!body) return;\n this.run(this.api.comment(this.projectId(), this.name(), this.number, { body }), 'Could not add the comment.', () => this.draft.set(''));\n }\n\n protected lineComment(c: LineComment) {\n this.run(this.api.comment(this.projectId(), this.name(), this.number, { body: c.body, path: c.path, side: c.side, line: c.line, pending: c.pending }), 'Could not add the comment.',\n () => { if (c.pending) this.note.set('Added to your review. Submit it from Review changes to post your comments.'); });\n }\n\n protected readonly batch = signal<string[]>([]);\n\n /** Arms auto-merge with a method, or disarms it (null). */\n protected setAutoMerge(method: string | null) {\n this.run(this.api.autoMerge(this.projectId(), this.name(), this.number, method), method === null ? 'Could not turn auto-merge off.' : 'Could not turn auto-merge on.', () =>\n this.note.set(method === null ? 'Auto-merge is off.' : 'Auto-merge is on: this pull request merges as you once every requirement passes.'));\n }\n\n protected toggleBatch(id: string) {\n const b = this.batch();\n this.batch.set(b.includes(id) ? b.filter((x) => x !== id) : [...b, id]);\n }\n\n /** Commits one suggestion, or the batch, onto the pull request's branch. */\n protected applySuggestions(ids: string[]) {\n this.run(this.api.applySuggestions(this.projectId(), this.name(), this.number, ids), 'Could not apply the suggestion.', () => {\n this.note.set(ids.length === 1 ? 'Suggestion applied.' : `${ids.length} suggestions applied in one commit.`);\n this.batch.set([]);\n });\n }\n\n protected discard(id: string) {\n this.run(this.api.discardComment(this.projectId(), this.name(), this.number, id), 'Could not discard the comment.');\n }\n\n protected setMode(m: 'unified' | 'split') {\n this.mode.set(m);\n writePref('origine.diff.mode', m);\n }\n\n private viewedKey() {\n return `origine.viewed.${this.projectId()}.${this.name()}.${this.number}.${this.pr()?.headSha ?? ''}`;\n }\n\n protected isViewed(path: string) {\n return !!this.viewed()[path];\n }\n\n protected setViewed(path: string, on: boolean) {\n const v = { ...this.viewed(), [path]: on };\n if (!on) delete v[path];\n this.viewed.set(v);\n writePref(this.viewedKey(), JSON.stringify(v));\n }\n\n protected jump(path: string) {\n const el = (this.el.nativeElement as HTMLElement).querySelector(`[id=\"file-${CSS.escape(path)}\"]`);\n el?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n\n protected reply(r: ThreadReply) {\n this.run(this.api.comment(this.projectId(), this.name(), this.number, { body: r.body, threadId: r.threadId }), 'Could not reply.');\n }\n\n protected resolve(e: { threadId: string; resolved: boolean }) {\n this.run(this.api.resolve(this.projectId(), this.name(), this.number, e.threadId, e.resolved), 'Could not change the conversation.');\n }\n\n protected merge() {\n const p = this.pr();\n if (!p) return;\n this.run(this.api.merge(this.projectId(), this.name(), this.number, { method: this.method(), deleteBranch: this.delBranch(), expectHead: p.headSha }), 'Could not merge.', () => this.note.set(`Merged into ${p.target}.`));\n }\n\n protected close(reopen: boolean) {\n this.run(this.api.closePull(this.projectId(), this.name(), this.number, reopen), reopen ? 'Could not reopen.' : 'Could not close.');\n }\n\n @HostListener('document:click', ['$event'])\n protected outside(e: MouseEvent) {\n const t = e.target as HTMLElement;\n if (this.reviewOpen() && !t.closest('.anchor')) this.reviewOpen.set(false);\n if (this.mergeMenu() && !t.closest('.merge')) this.mergeMenu.set(false);\n }\n\n private sendReview(state: 'commented' | 'approved' | 'changes_requested', body: string) {\n this.run(this.api.review(this.projectId(), this.name(), this.number, state, body), 'Could not submit the review.', () => { this.reviewOpen.set(false); this.revBody.set(''); });\n }\n\n private run(o: import('rxjs').Observable<unknown>, fallback: string, after?: () => void) {\n this.busy.set(true);\n this.error.set('');\n o.subscribe({\n next: () => { this.busy.set(false); after?.(); this.load(false); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, fallback)); this.load(false); },\n });\n }\n\n private load(first: boolean) {\n const project = this.projectId();\n this.api.pull(project, this.name(), this.number).subscribe({\n next: (p) => {\n const headChanged = this.pr()?.headSha !== p.headSha;\n this.pr.set(p);\n if (headChanged) {\n try { this.viewed.set(JSON.parse(readPref(this.viewedKey()) || '{}')); } catch { this.viewed.set({}); }\n }\n if (first) {\n this.method.set(p.mergeMethods[0] ?? 'merge');\n this.delBranch.set(p.deleteBranchOnMerge);\n }\n if (first || !this.cmp() || this.cmp()!.head !== p.headSha) {\n this.api.compare(project, this.name(), p.mergeBase || p.targetSha, p.headSha).subscribe({ next: (c) => this.cmp.set(c), error: () => this.cmp.set({ base: '', head: p.headSha, mergeBase: '', ahead: 0, behind: 0, commits: [], files: [] }) });\n }\n },\n error: (e) => this.error.set(e?.status === 404 ? `There is no pull request #${this.number} in ${this.name()}.` : apiMessage(e, 'Could not open the pull request.')),\n });\n this.api.conversation(project, this.name(), this.number).subscribe({ next: (t) => this.timeline.set(t), error: () => undefined });\n }\n}\n\n// Per-viewer conveniences (the diff view, files viewed); storage can be missing or blocked.\nfunction readPref(key: string): string {\n try {\n return localStorage.getItem(key) ?? '';\n } catch {\n return '';\n }\n}\n\nfunction writePref(key: string, value: string) {\n try {\n localStorage.setItem(key, value);\n } catch {\n /* private window or blocked storage: the setting lasts for this page only */\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { Protection, Ref, Repo, apiMessage, Collaborator } from './code.api';\nimport { RepoPage } from './repo-base';\n\ntype Section = 'general' | 'protect' | 'collab' | 'danger';\n\ninterface RuleForm {\n id: string;\n pattern: string;\n blockDirectPush: boolean;\n blockForcePush: boolean;\n blockDeletion: boolean;\n requiredApprovals: number;\n dismissStaleApprovals: boolean;\n requireUpToDate: boolean;\n requireCodeOwnerReview: boolean;\n requiredChecks: string[];\n}\n\nconst BLANK: RuleForm = { id: '', pattern: '', blockDirectPush: true, blockForcePush: true, blockDeletion: true, requiredApprovals: 1, dismissStaleApprovals: true, requireUpToDate: false, requireCodeOwnerReview: false, requiredChecks: [] };\n\n// /{org}/{project}/code/{repo}/settings?section= (prototype \"code_settings\"): general settings and\n// merge methods, branch protection rules, and the danger zone (archive, delete).\n@Component({\n selector: 'o-code-settings',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page\">\n @if (repo(); as r) {\n <div class=\"o-split o-lft\">\n <nav class=\"o-setnav\" aria-label=\"Repository settings\">\n <span class=\"o-lbl\" style=\"padding-top:0\">{{ r.name }}</span>\n <button type=\"button\" [class.o-on]=\"section() === 'general'\" (click)=\"go('general')\">General</button>\n <button type=\"button\" [class.o-on]=\"section() === 'protect'\" (click)=\"go('protect')\">Branch protection</button>\n <button type=\"button\" [class.o-on]=\"section() === 'collab'\" (click)=\"go('collab')\">Collaborators</button>\n <button type=\"button\" [class.o-on]=\"section() === 'danger'\" (click)=\"go('danger')\">Danger zone</button>\n </nav>\n <div class=\"o-col\" style=\"gap:16px;min-width:0\">\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @if (note()) {<div class=\"o-note\" role=\"status\">{{ note() }}</div>}\n @switch (section()) {\n @case ('general') {\n <h1 class=\"o-t\">General</h1>\n <form class=\"o-card o-cb o-form\" (ngSubmit)=\"saveGeneral()\">\n <div class=\"o-g2\">\n <div class=\"o-fld\"><label for=\"rs-name\">Repository name</label><input id=\"rs-name\" class=\"o-in o-mono\" name=\"name\" [(ngModel)]=\"g.name\" [disabled]=\"!canAdmin()\" /><span class=\"o-hint\">Renaming keeps the old clone URL working as a redirect.</span></div>\n <div class=\"o-fld\"><label for=\"rs-def\">Default branch</label><select id=\"rs-def\" class=\"o-in\" name=\"def\" [(ngModel)]=\"g.defaultBranch\" [disabled]=\"!canMaintain()\">@for (b of branches(); track b.name) {<option [value]=\"b.name\">{{ b.name }}</option>}@if (!branches().length) {<option [value]=\"r.defaultBranch\">{{ r.defaultBranch }}</option>}</select></div>\n </div>\n <div class=\"o-fld\"><label for=\"rs-desc\">Description</label><input id=\"rs-desc\" class=\"o-in\" name=\"desc\" [(ngModel)]=\"g.description\" [disabled]=\"!canMaintain()\" /></div>\n <div class=\"o-fld\"><span class=\"o-lbl\" style=\"padding:0\">Visibility</span>\n <div class=\"o-g2\">\n <button type=\"button\" class=\"o-opt\" [class.o-on]=\"g.visibility === 'private'\" (click)=\"g.visibility = 'private'\" [disabled]=\"!canAdmin()\"><span class=\"o-rad\" [class.o-on]=\"g.visibility === 'private'\"></span><span class=\"o-col\" style=\"gap:2px\"><b>Private</b><span class=\"o-faint o-sm\">Project members only</span></span></button>\n <button type=\"button\" class=\"o-opt\" [class.o-on]=\"g.visibility === 'internal'\" (click)=\"g.visibility = 'internal'\" [disabled]=\"!canAdmin()\"><span class=\"o-rad\" [class.o-on]=\"g.visibility === 'internal'\"></span><span class=\"o-col\" style=\"gap:2px\"><b>Org-internal</b><span class=\"o-faint o-sm\">Everyone in the organization can read</span></span></button>\n </div>\n </div>\n <div class=\"o-fld\"><span class=\"o-lbl\" style=\"padding:0\">Allowed merge methods</span>\n @for (m of methods; track m.id) {<label class=\"o-flex\"><input type=\"checkbox\" [checked]=\"g.mergeMethods.includes(m.id)\" (change)=\"flipMethod(m.id)\" [disabled]=\"!canMaintain()\" />{{ m.label }}</label>}\n </div>\n <div class=\"o-flex\"><button type=\"button\" class=\"o-tog\" role=\"switch\" aria-labelledby=\"rs-del\" [class.o-on]=\"g.deleteBranchOnMerge\" [attr.aria-checked]=\"g.deleteBranchOnMerge\" (click)=\"g.deleteBranchOnMerge = !g.deleteBranchOnMerge\" [disabled]=\"!canMaintain()\"></button><span id=\"rs-del\">Delete head branches after merge</span></div>\n <div class=\"o-flex\"><button type=\"button\" class=\"o-tog\" role=\"switch\" aria-labelledby=\"rs-auto\" [class.o-on]=\"g.allowAutoMerge\" [attr.aria-checked]=\"g.allowAutoMerge\" (click)=\"g.allowAutoMerge = !g.allowAutoMerge\" [disabled]=\"!canMaintain()\" data-testid=\"allow-auto-merge\"></button><span id=\"rs-auto\">Allow auto-merge when all requirements pass</span></div>\n <div class=\"o-flex\"><button type=\"button\" class=\"o-tog o-dis\" disabled aria-label=\"Allow auto-merge\"></button>Allow auto-merge when all requirements pass<b class=\"o-ph-tag o-ga\">GA</b></div>\n @if (canMaintain()) {<div class=\"o-flex\">@if (!canAdmin()) {<span class=\"o-faint o-sm\">As a maintain collaborator you change these settings; a project Maintainer renames the repository or changes its visibility.</span>}<button type=\"submit\" class=\"o-btn o-dark o-r\" [disabled]=\"busy() || !g.mergeMethods.length\" data-testid=\"settings-save\">Save</button></div>}\n </form>\n }\n @case ('protect') {\n <div class=\"o-flex\"><h1 class=\"o-t\">Branch protection</h1>@if (canProtect()) {<button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"edit(null)\" data-testid=\"add-rule\">+ Add rule</button>}</div>\n <div class=\"o-card\">\n @for (p of rules(); track p.id) {\n <button type=\"button\" class=\"o-row o-click\" style=\"width:100%;border:none;background:none;text-align:left\" [class.o-sel]=\"form()?.id === p.id\" (click)=\"edit(p)\"><b class=\"o-mono\">{{ p.pattern }}</b><span class=\"o-faint o-sm\">{{ summary(p) }}</span>@if (form()?.id === p.id) {<span class=\"o-r o-chip\">Editing</span>}</button>\n } @empty {<div class=\"o-empty\">No rules. Without one, anyone who can push may push to any branch.</div>}\n </div>\n @if (form(); as f) {\n <form class=\"o-card\" (ngSubmit)=\"saveRule()\" aria-label=\"Protection rule\">\n <div class=\"o-ch\"><b>Rule for</b><input class=\"o-in o-mono o-sm\" style=\"width:200px\" name=\"pattern\" aria-label=\"Branch name or pattern\" [(ngModel)]=\"f.pattern\" placeholder=\"main or release/*\" data-testid=\"rule-pattern\" /></div>\n <div class=\"o-cb o-form\">\n @for (t of toggles; track t.key) {\n <div class=\"o-flex\" style=\"align-items:flex-start\"><button type=\"button\" class=\"o-tog\" role=\"switch\" [attr.aria-label]=\"t.label\" [class.o-on]=\"f[t.key]\" [attr.aria-checked]=\"f[t.key]\" (click)=\"flip(f, t.key)\" style=\"margin-top:2px\"></button><div class=\"o-col\" style=\"gap:2px;flex:1\"><span class=\"o-b5\">{{ t.label }}</span><span class=\"o-hint\">{{ t.hint }}</span></div></div>\n }\n <div class=\"o-flex\"><span class=\"o-b5\" style=\"flex:1\">Required approvals</span><button type=\"button\" class=\"o-btn o-sm\" (click)=\"f.requiredApprovals = max0(f.requiredApprovals - 1)\" aria-label=\"One fewer\">−</button><b class=\"o-mono\" style=\"width:24px;text-align:center\" aria-live=\"polite\">{{ f.requiredApprovals }}</b><button type=\"button\" class=\"o-btn o-sm\" (click)=\"f.requiredApprovals = f.requiredApprovals + 1\" aria-label=\"One more\">+</button></div>\n <div class=\"o-fld\"><label for=\"rule-check\">Required status checks</label>\n <div class=\"o-flex o-wrap\">\n @for (c of f.requiredChecks; track c) {<span class=\"o-chip o-mono\">{{ c }} <button type=\"button\" class=\"o-lnk\" style=\"font-size:11px\" (click)=\"removeCheck(f, c)\" [attr.aria-label]=\"'Remove ' + c\">✕</button></span>}\n <input id=\"rule-check\" class=\"o-in o-sm o-mono\" style=\"width:160px\" placeholder=\"+ check name, Enter\" [ngModel]=\"check()\" (ngModelChange)=\"check.set($event)\" name=\"check\" (keydown.enter)=\"$event.preventDefault(); addCheck(f)\" />\n </div>\n </div>\n <div class=\"o-fld\"><span class=\"o-lbl\" style=\"padding:0\">Allowed to bypass <b class=\"o-ph-tag o-ga\">GA</b></span><div class=\"o-flex\"><span class=\"o-chip\">Owners</span><span class=\"o-hint\">Every bypass is written to the audit log.</span></div></div>\n <div class=\"o-fld\"><span class=\"o-lbl\" style=\"padding:0\">What a blocked push sees</span><div class=\"o-term\" style=\"font-size:11.5px\"><div>$ git push origin {{ f.pattern || 'main' }}</div><div>remote: ✕ {{ f.pattern || 'main' }} is protected by rule “{{ f.pattern || 'main' }}”: direct pushes are blocked.</div><div>remote: Open a pull request instead.</div></div></div>\n <div class=\"o-flex\">\n @if (f.id) {<button type=\"button\" class=\"o-btn o-sm o-ghost\" style=\"color:var(--o-bad-tx)\" (click)=\"removeRule(f)\">Delete rule</button>}\n <button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"form.set(null)\">Cancel</button>\n <button type=\"submit\" class=\"o-btn o-dark\" [disabled]=\"busy() || !f.pattern.trim()\" data-testid=\"rule-save\">Save rule</button>\n </div>\n </div>\n </form>\n }\n }\n @case ('collab') {\n <h1 class=\"o-t\">Collaborators</h1>\n <span class=\"o-mut\">Access beyond the project role, for this repository only.</span>\n @if (canAdmin()) {\n <div class=\"o-card\" style=\"overflow-x:auto\" data-testid=\"collaborators\">\n <div class=\"o-tbl\" role=\"table\" aria-label=\"Collaborators\" style=\"min-width:560px\">\n <div class=\"o-thead\" role=\"rowgroup\"><div class=\"o-tr\" role=\"row\"><div class=\"o-th\" role=\"columnheader\">Person</div><div class=\"o-th\" role=\"columnheader\">Project role</div><div class=\"o-th\" role=\"columnheader\">Repository access</div><div class=\"o-th\" role=\"columnheader\"></div></div></div>\n <div class=\"o-tbody\" role=\"rowgroup\">\n @for (cl of collabs(); track cl.userId) {\n <div class=\"o-tr\" role=\"row\" [attr.data-testid]=\"'collab-' + cl.userId\">\n <div class=\"o-td\" role=\"cell\"><span class=\"o-flex\"><span class=\"o-av\" aria-hidden=\"true\">{{ people().initials(cl.userId) }}</span>{{ people().name(cl.userId) }}@if (cl.projectRole === 'guest') {<span class=\"o-chip\">Guest</span>}</span></div>\n <div class=\"o-td o-mut\" role=\"cell\">{{ roleLabel(cl.projectRole) }}</div>\n <div class=\"o-td\" role=\"cell\"><select class=\"o-in o-sm\" style=\"width:auto\" [attr.aria-label]=\"'Repository access for ' + people().name(cl.userId)\" [ngModel]=\"cl.permission\" (ngModelChange)=\"setCollab(cl.userId, $event)\">@for (p of perms; track p.id) {<option [value]=\"p.id\">{{ p.label }}</option>}</select></div>\n <div class=\"o-td o-num\" role=\"cell\"><button type=\"button\" class=\"o-btn o-xs o-ghost\" (click)=\"removeCollab(cl.userId)\" [attr.aria-label]=\"'Remove ' + people().name(cl.userId)\">Remove</button></div>\n </div>\n } @empty {\n <div class=\"o-tr\" role=\"row\"><div class=\"o-td o-faint\" role=\"cell\" style=\"grid-column:1 / -1\">No collaborators. Project roles decide who reads and pushes.</div></div>\n }\n </div>\n </div>\n <div class=\"o-cf\">\n <select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Person to add\" [(ngModel)]=\"newCollab\"><option value=\"\">Add a person…</option>@for (p of addable(); track p.id) {<option [value]=\"p.id\">{{ p.name || p.email }}</option>}</select>\n <select class=\"o-in o-sm\" style=\"width:auto\" aria-label=\"Access to give\" [(ngModel)]=\"newPerm\">@for (p of perms; track p.id) {<option [value]=\"p.id\">{{ p.label }}</option>}</select>\n <button type=\"button\" class=\"o-btn o-sm o-dark\" [disabled]=\"!newCollab || busy()\" (click)=\"setCollab(newCollab, newPerm, true)\" data-testid=\"collab-add\">Add</button>\n <span class=\"o-faint o-xs\">They need to be in the project (any role, Guest included). Write pushes and opens pull requests here; maintain also changes this repository's settings.</span>\n </div>\n </div>\n } @else {\n <div class=\"o-card\"><div class=\"o-empty\">{{ repo()?.collaborator ? 'You have ' + repo()?.collaborator + ' on this repository as a collaborator. ' : '' }}Project Maintainers manage collaborators.</div></div>\n }\n }\n @case ('danger') {\n <h1 class=\"o-t\">Danger zone</h1>\n <div class=\"o-card\" style=\"border-color:var(--o-bad-line)\">\n <div class=\"o-row\" style=\"padding:14px\"><div class=\"o-col\" style=\"gap:2px;flex:1\"><b>{{ r.archivedAt ? 'Unarchive' : 'Archive' }}</b><span class=\"o-hint\">{{ r.archivedAt ? 'Pushes are accepted again.' : 'Read-only. Pushes are rejected; pipelines stop triggering.' }}</span></div><button type=\"button\" class=\"o-btn o-sm\" (click)=\"archive(!r.archivedAt)\" [disabled]=\"!canAdmin() || busy()\">{{ r.archivedAt ? 'Unarchive' : 'Archive' }}</button></div>\n <div class=\"o-row\" style=\"padding:14px;flex-wrap:wrap\"><div class=\"o-col\" style=\"gap:2px;flex:1;min-width:240px\"><b>Delete this repository</b><span class=\"o-hint\">Recoverable for 7 days, then gone for good. Type <b class=\"o-mono\">{{ r.name }}</b> to confirm.</span></div>\n <input class=\"o-in o-sm o-mono\" style=\"width:180px\" aria-label=\"Type the repository name to confirm\" [ngModel]=\"confirm()\" (ngModelChange)=\"confirm.set($event)\" [disabled]=\"!canAdmin()\" />\n <button type=\"button\" class=\"o-btn o-sm o-red\" (click)=\"remove()\" [disabled]=\"!canAdmin() || confirm() !== r.name || busy()\">Delete</button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n } @else if (error()) {\n <div class=\"o-card o-empty\"><p>{{ error() }}</p></div>\n }\n </div>\n `,\n})\nexport class RepoSettingsPage extends RepoPage {\n private readonly router = inject(Router);\n protected readonly section = signal<Section>('general');\n protected readonly branches = signal<Ref[]>([]);\n protected readonly rules = signal<Protection[]>([]);\n protected readonly form = signal<RuleForm | null>(null);\n protected readonly check = signal('');\n protected readonly confirm = signal('');\n protected readonly busy = signal(false);\n protected g = { name: '', description: '', visibility: 'private', defaultBranch: '', mergeMethods: [] as string[], deleteBranchOnMerge: false, allowAutoMerge: false };\n\n protected readonly methods = [{ id: 'merge', label: 'Merge commit' }, { id: 'squash', label: 'Squash' }, { id: 'rebase', label: 'Rebase' }];\n protected readonly toggles: { key: 'blockDirectPush' | 'blockForcePush' | 'blockDeletion' | 'dismissStaleApprovals' | 'requireUpToDate' | 'requireCodeOwnerReview'; label: string; hint: string }[] = [\n { key: 'blockDirectPush', label: 'Require a pull request before merging', hint: 'Direct pushes are blocked; changes arrive through pull requests.' },\n { key: 'blockForcePush', label: 'Block force pushes', hint: 'History on matching branches cannot be rewritten.' },\n { key: 'blockDeletion', label: 'Block deletion', hint: 'Matching branches cannot be deleted.' },\n { key: 'dismissStaleApprovals', label: 'Dismiss stale approvals', hint: 'A new commit dismisses approvals given on an older one.' },\n { key: 'requireUpToDate', label: 'Require branches to be up to date', hint: 'The branch must contain the target’s latest commit before it merges.' },\n { key: 'requireCodeOwnerReview', label: 'Require review from CODEOWNERS', hint: 'Owners of changed paths are requested automatically; one of them approves each owned file.' },\n ];\n\n constructor() {\n super();\n this.route.queryParamMap.subscribe((q) => this.section.set((q.get('section') as Section) || 'general'));\n }\n\n protected readonly collabs = signal<Collaborator[]>([]);\n protected readonly perms = [{ id: 'read', label: 'Read' }, { id: 'write', label: 'Write' }, { id: 'maintain', label: 'Maintain' }];\n protected readonly addable = computed(() => this.host.people().filter((p) => !this.collabs().some((c) => c.userId === p.id)));\n protected newCollab = '';\n protected newPerm = 'write';\n\n protected roleLabel(r: string) {\n return r ? r[0].toUpperCase() + r.slice(1) : 'Not in the project';\n }\n\n private loadCollabs(r: Repo) {\n if (!this.canAdmin()) return;\n this.api.collaborators(this.projectId(), r.name).subscribe({ next: (l) => this.collabs.set(l), error: () => undefined });\n }\n\n protected setCollab(userId: string, permission: string, adding = false) {\n const r = this.repo();\n if (!r || !userId) return;\n this.busy.set(true);\n this.error.set('');\n this.api.setCollaborator(this.projectId(), r.name, userId, permission).subscribe({\n next: () => { this.busy.set(false); if (adding) { this.newCollab = ''; this.note.set(`${this.people().name(userId)} now has ${permission} on ${r.name}.`); } this.loadCollabs(r); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not change the access.')); this.loadCollabs(r); },\n });\n }\n\n protected removeCollab(userId: string) {\n const r = this.repo();\n if (!r) return;\n this.api.removeCollaborator(this.projectId(), r.name, userId).subscribe({\n next: () => { this.note.set(`${this.people().name(userId)} is no longer a collaborator.`); this.loadCollabs(r); },\n error: (e) => this.error.set(apiMessage(e, 'Could not remove the collaborator.')),\n });\n }\n\n protected onRepo(r: Repo) {\n this.loadCollabs(r);\n this.g = { name: r.name, description: r.description, visibility: r.visibility, defaultBranch: r.defaultBranch, mergeMethods: [...(r.mergeMethods ?? [])], deleteBranchOnMerge: r.deleteBranchOnMerge, allowAutoMerge: !!r.allowAutoMerge };\n if (!r.empty) this.api.refs(this.projectId(), r.name, 'branch').subscribe({ next: (b) => this.branches.set(b), error: () => undefined });\n this.api.protections(this.projectId(), r.name).subscribe({ next: (p) => this.rules.set(p), error: () => undefined });\n }\n\n protected go(s: Section) {\n void this.router.navigate([], { relativeTo: this.route, queryParams: { section: s === 'general' ? null : s }, replaceUrl: true });\n }\n\n protected max0(n: number) {\n return Math.max(0, n);\n }\n\n protected flipMethod(id: string) {\n this.g.mergeMethods = this.g.mergeMethods.includes(id) ? this.g.mergeMethods.filter((m) => m !== id) : [...this.g.mergeMethods, id];\n }\n\n protected summary(p: Protection) {\n const parts: string[] = [];\n if (p.requiredApprovals) parts.push(`${p.requiredApprovals} ${p.requiredApprovals === 1 ? 'approval' : 'approvals'}`);\n if (p.requiredChecks?.length) parts.push(`checks ${p.requiredChecks.join(', ')}`);\n if (p.blockDirectPush) parts.push('no direct push');\n if (p.requireUpToDate) parts.push('up to date');\n if (p.requireCodeOwnerReview) parts.push('code owners');\n if (p.blockDeletion) parts.push('no deletion');\n return parts.join(' · ') || 'no restrictions';\n }\n\n protected edit(p: Protection | null) {\n this.form.set(p ? { ...BLANK, ...p, requiredChecks: [...(p.requiredChecks ?? [])] } : { ...BLANK, pattern: this.rules().length ? '' : this.repo()?.defaultBranch ?? 'main', requiredChecks: [] });\n }\n\n protected flip(f: RuleForm, k: (typeof this.toggles)[number]['key']) {\n f[k] = !f[k];\n this.form.set({ ...f });\n }\n\n protected addCheck(f: RuleForm) {\n const c = this.check().trim();\n if (c && !f.requiredChecks.includes(c)) f.requiredChecks = [...f.requiredChecks, c];\n this.check.set('');\n this.form.set({ ...f });\n }\n\n protected removeCheck(f: RuleForm, c: string) {\n f.requiredChecks = f.requiredChecks.filter((x) => x !== c);\n this.form.set({ ...f });\n }\n\n protected saveGeneral() {\n const r = this.repo();\n if (!r) return;\n this.busy.set(true);\n const renamed = this.g.name.trim() !== r.name;\n // a maintain collaborator sends what they may change; the name and visibility stay a Maintainer's\n const body = this.canAdmin()\n ? { name: this.g.name.trim(), description: this.g.description, visibility: this.g.visibility, defaultBranch: this.g.defaultBranch, mergeMethods: this.g.mergeMethods, deleteBranchOnMerge: this.g.deleteBranchOnMerge, allowAutoMerge: this.g.allowAutoMerge }\n : { description: this.g.description, defaultBranch: this.g.defaultBranch, mergeMethods: this.g.mergeMethods, deleteBranchOnMerge: this.g.deleteBranchOnMerge, allowAutoMerge: this.g.allowAutoMerge };\n this.api.update(this.projectId(), r.name, body).subscribe({\n next: (n) => {\n this.busy.set(false);\n this.note.set('Saved.');\n if (renamed) void this.router.navigate(this.host.link(`code/${n.name}/settings`));\n else { this.repo.set(n); this.onRepo(n); }\n },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not save.')); },\n });\n }\n\n protected saveRule() {\n const r = this.repo();\n const f = this.form();\n if (!r || !f) return;\n const { id, ...body } = f;\n this.busy.set(true);\n const req = id ? this.api.updateProtection(this.projectId(), r.name, id, body) : this.api.addProtection(this.projectId(), r.name, body);\n req.subscribe({\n next: () => { this.busy.set(false); this.form.set(null); this.note.set(`Rule “${f.pattern}” saved.`); this.onRepo(r); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not save the rule.')); },\n });\n }\n\n protected removeRule(f: RuleForm) {\n const r = this.repo();\n if (!r || !f.id) return;\n this.api.removeProtection(this.projectId(), r.name, f.id).subscribe({\n next: () => { this.form.set(null); this.note.set(`Rule “${f.pattern}” deleted.`); this.onRepo(r); },\n error: (e) => this.error.set(apiMessage(e, 'Could not delete the rule.')),\n });\n }\n\n protected archive(on: boolean) {\n const r = this.repo();\n if (!r) return;\n this.busy.set(true);\n this.api.setArchived(this.projectId(), r.name, on).subscribe({\n next: (n) => { this.busy.set(false); this.repo.set(n); this.note.set(on ? 'Archived: the repository is read-only.' : 'Unarchived.'); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not change the archive state.')); },\n });\n }\n\n protected remove() {\n const r = this.repo();\n if (!r) return;\n this.busy.set(true);\n this.api.remove(this.projectId(), r.name).subscribe({\n next: () => { this.busy.set(false); void this.router.navigate(this.host.link('code')); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not delete the repository.')); },\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { marked } from 'marked';\nimport { forkJoin } from 'rxjs';\nimport { Ref, Release, Repo, apiMessage } from './code.api';\nimport { RepoPage } from './repo-base';\nimport { ago } from './look';\n\ninterface Draft {\n id?: string;\n version?: number;\n tag: string;\n newTag: boolean;\n target: string;\n title: string;\n notes: string;\n prerelease: boolean;\n draft: boolean;\n}\n\n// /{org}/{project}/code/{repo}/releases (prototype code_tags): releases newest first with their\n// notes, files and source archives, the latest marked; drafts for those who can push; a release\n// drafted on a new or existing tag with notes generated from the done issues since the previous\n// one; and the repository's tags.\n@Component({\n selector: 'o-code-releases',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`\n .rel h4{margin:0 0 6px;font-size:15px}\n .rel .o-md ul{margin:0;padding-left:20px}\n .assets{display:flex;gap:12px;flex-wrap:wrap;align-items:center}\n `],\n template: `\n <div class=\"o-page o-narrow\">\n <div class=\"o-ph\">\n <div class=\"o-col\"><span class=\"o-eyebrow\">{{ name() }}</span><h1 class=\"o-t\">Releases and tags</h1></div>\n @if (canWrite()) {\n <div class=\"o-acts\">\n <button type=\"button\" class=\"o-btn o-sm\" (click)=\"tagging.set(!tagging()); draft.set(null)\" data-testid=\"tag-new\">New tag</button>\n <button type=\"button\" class=\"o-btn o-sm o-dark\" (click)=\"startRelease()\" data-testid=\"release-new\">Draft release</button>\n </div>\n }\n </div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @if (note()) {<div class=\"o-note\" role=\"status\">{{ note() }}</div>}\n\n @if (tagging()) {\n <form class=\"o-card\" (ngSubmit)=\"createTag()\" data-testid=\"tag-form\">\n <div class=\"o-ch\"><b>New tag</b></div>\n <div class=\"o-cb o-flex o-wrap\" style=\"align-items:flex-end\">\n <div class=\"o-fld\"><label for=\"tg-name\">Tag</label><input id=\"tg-name\" class=\"o-in o-mono\" name=\"tag\" placeholder=\"v1.8.0\" [(ngModel)]=\"tagName\" /></div>\n <div class=\"o-fld\"><label for=\"tg-from\">At</label><input id=\"tg-from\" class=\"o-in o-mono\" name=\"from\" [(ngModel)]=\"tagFrom\" placeholder=\"main or a commit\" /></div>\n <button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"tagging.set(false)\">Cancel</button>\n <button type=\"submit\" class=\"o-btn o-sm o-dark\" [disabled]=\"busy() || !tagName.trim()\">Create tag</button>\n </div>\n </form>\n }\n\n @if (draft(); as d) {\n <div class=\"o-card\" data-testid=\"release-form\">\n <div class=\"o-ch\"><b>{{ d.id ? 'Edit ' + d.tag : 'Draft a release' }}</b></div>\n <div class=\"o-cb o-col\" style=\"gap:12px\">\n @if (!d.id) {\n <div class=\"o-flex o-wrap\" style=\"align-items:flex-end\">\n <div class=\"o-fld\"><label for=\"rl-tag\">Tag</label>\n <input id=\"rl-tag\" class=\"o-in o-mono\" list=\"rl-tags\" placeholder=\"v1.8.0\" [ngModel]=\"d.tag\" (ngModelChange)=\"setTag(d, $event)\" data-testid=\"release-tag\" />\n <datalist id=\"rl-tags\">@for (t of freeTags(); track t.name) {<option [value]=\"t.name\"></option>}</datalist>\n </div>\n @if (d.newTag) {<div class=\"o-fld\"><label for=\"rl-target\">New tag at</label><input id=\"rl-target\" class=\"o-in o-mono\" [(ngModel)]=\"d.target\" placeholder=\"main\" /></div>}\n <span class=\"o-hint\" style=\"padding-bottom:8px\">{{ d.tag ? (d.newTag ? 'A new tag, made when you save.' : 'An existing tag.') : '' }}</span>\n </div>\n }\n <div class=\"o-fld\"><label for=\"rl-title\">Title</label><input id=\"rl-title\" class=\"o-in\" maxlength=\"255\" [(ngModel)]=\"d.title\" placeholder=\"Defaults to the tag\" data-testid=\"release-title\" /></div>\n <div class=\"o-fld\">\n <div class=\"o-flex\"><label for=\"rl-notes\">Notes</label>\n @if (!d.id) {<button type=\"button\" class=\"o-lnk o-r o-sm\" [disabled]=\"busy() || !d.tag\" (click)=\"generate(d)\" data-testid=\"release-generate\">Generate from done issues</button>}\n </div>\n <textarea id=\"rl-notes\" class=\"o-in\" rows=\"7\" style=\"height:auto;padding:8px 10px\" [(ngModel)]=\"d.notes\" placeholder=\"Markdown works.\" data-testid=\"release-notes\"></textarea>\n <span class=\"o-hint\">Generated notes list the done issues and merged pull requests since the previous release.</span>\n </div>\n <label class=\"o-flex o-sm\"><input type=\"checkbox\" [(ngModel)]=\"d.prerelease\" /> Pre-release (never marked Latest)</label>\n </div>\n <div class=\"o-cf\">\n <button type=\"button\" class=\"o-btn o-sm o-r\" (click)=\"draft.set(null)\">Cancel</button>\n @if (!d.id || d.draft) {<button type=\"button\" class=\"o-btn o-sm\" [disabled]=\"busy() || !d.tag\" (click)=\"save(d, true)\" data-testid=\"release-save-draft\">Save draft</button>}\n <button type=\"button\" class=\"o-btn o-sm o-dark\" [disabled]=\"busy() || !d.tag\" (click)=\"save(d, false)\" data-testid=\"release-publish\">{{ d.id && !d.draft ? 'Save' : 'Publish release' }}</button>\n </div>\n </div>\n }\n\n @for (r of releases(); track r.id) {\n <div class=\"o-card rel\" [attr.data-testid]=\"'release-' + r.tag\">\n <div class=\"o-ch\">\n <b class=\"o-md\">{{ r.tag }}</b>\n @if (r.latest) {<span class=\"o-chip o-grn\">Latest</span>}\n @if (r.draft) {<span class=\"o-chip o-amb\">Draft</span>}\n @if (r.prerelease) {<span class=\"o-chip\">Pre-release</span>}\n <span class=\"o-r o-mono o-sm o-faint\">{{ r.short }} · {{ ago(r.publishedAt || r.createdAt) }} · {{ people().name(r.createdBy) }}</span>\n </div>\n <div class=\"o-cb\">\n @if (r.title && r.title !== r.tag) {<h4>{{ r.title }}</h4>}\n <div class=\"o-md\" style=\"font-size:13px\" [innerHTML]=\"r.notes ? md(r.notes) : '<p class=&quot;o-faint&quot;>No notes.</p>'\"></div>\n </div>\n <div class=\"o-cf assets\">\n <span>Assets</span>\n @for (a of r.assets; track a.id) {\n <button type=\"button\" class=\"o-lnk o-mono\" (click)=\"download(r, a.id, a.name)\" [attr.aria-label]=\"'Download ' + a.name\">{{ a.name }}</button>\n @if (canWrite()) {<button type=\"button\" class=\"o-lnk\" style=\"color:var(--o-mut)\" (click)=\"removeAsset(r, a.id)\" [attr.aria-label]=\"'Remove ' + a.name\">×</button>}\n }\n <button type=\"button\" class=\"o-lnk\" (click)=\"archive(r, 'zip')\">Source (zip)</button>\n <button type=\"button\" class=\"o-lnk\" (click)=\"archive(r, 'tar.gz')\">Source (tar.gz)</button>\n @if (canWrite()) {\n <span class=\"o-r o-flex\" style=\"gap:10px\">\n <label class=\"o-lnk\" style=\"cursor:pointer\">Add file<input type=\"file\" class=\"o-sr-only\" (change)=\"upload(r, $event)\" [attr.aria-label]=\"'Add a file to ' + r.tag\" /></label>\n <button type=\"button\" class=\"o-lnk\" (click)=\"edit(r)\" [attr.aria-label]=\"'Edit ' + r.tag\">Edit</button>\n @if (confirming() === r.id) {\n <label class=\"o-flex o-xs\"><input type=\"checkbox\" [(ngModel)]=\"alsoTag\" /> and the tag</label>\n <button type=\"button\" class=\"o-lnk o-red-t\" (click)=\"remove(r)\">Delete</button><button type=\"button\" class=\"o-lnk\" (click)=\"confirming.set('')\">Keep</button>\n } @else {\n <button type=\"button\" class=\"o-lnk\" style=\"color:var(--o-mut)\" (click)=\"confirming.set(r.id); alsoTag = false\" [attr.aria-label]=\"'Delete ' + r.tag\">Delete</button>\n }\n </span>\n }\n </div>\n </div>\n } @empty {\n <div class=\"o-card\"><div class=\"o-empty\">{{ loaded() ? 'No releases yet.' + (canWrite() ? ' Draft one from a tag; its notes can come from the issues it finishes.' : '') : 'Loading…' }}</div></div>\n }\n\n <div class=\"o-card\" data-testid=\"tags\">\n <div class=\"o-ch\"><b>Tags</b><span class=\"o-r o-faint o-sm\">{{ tags().length }}</span></div>\n @for (t of tags(); track t.name) {\n <div class=\"o-row\" [attr.data-testid]=\"'tag-' + t.name\">\n <span class=\"o-mono o-sm o-b5\">{{ t.name }}</span><span class=\"o-faint o-sm o-mono\">{{ t.commit?.short }}</span>\n <span class=\"o-r o-faint o-sm\">{{ ago(t.commit?.committer?.when) }}</span>\n @if (canWrite() && !used(t.name)) {<button type=\"button\" class=\"o-lnk\" style=\"color:var(--o-mut)\" (click)=\"removeTag(t)\" [attr.aria-label]=\"'Delete tag ' + t.name\">Delete</button>}\n </div>\n } @empty {<div class=\"o-empty o-sm\">No tags yet.</div>}\n </div>\n </div>\n `,\n})\nexport class ReleasesPage extends RepoPage {\n protected readonly releases = signal<Release[]>([]);\n protected readonly tags = signal<Ref[]>([]);\n protected readonly loaded = signal(false);\n protected readonly tagging = signal(false);\n protected readonly draft = signal<Draft | null>(null);\n protected readonly busy = signal(false);\n protected readonly confirming = signal('');\n protected readonly freeTags = computed(() => this.tags().filter((t) => !this.used(t.name)));\n protected readonly ago = (s?: string) => ago(s);\n protected tagName = '';\n protected tagFrom = '';\n protected alsoTag = false;\n\n protected onRepo(r: Repo) {\n this.tagFrom = r.defaultBranch;\n this.load();\n }\n\n protected md(s: string): string {\n return marked.parse(s || '', { async: false, gfm: true, breaks: true }) as string;\n }\n\n protected used(tag: string) {\n return this.releases().some((r) => r.tag === tag);\n }\n\n private load() {\n const r = this.repo();\n if (!r) return;\n forkJoin({ rel: this.api.releases(this.projectId(), r.name), tags: this.api.refs(this.projectId(), r.name, 'tag') }).subscribe({\n next: ({ rel, tags }) => { this.releases.set(rel); this.tags.set(sortTags(tags)); this.loaded.set(true); },\n error: (e) => { this.loaded.set(true); this.error.set(apiMessage(e, 'Could not load the releases.')); },\n });\n }\n\n private run(o: import('rxjs').Observable<unknown>, fallback: string, done?: () => void) {\n this.busy.set(true);\n this.error.set('');\n this.note.set('');\n o.subscribe({\n next: () => { this.busy.set(false); done?.(); this.load(); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, fallback)); },\n });\n }\n\n protected createTag() {\n const r = this.repo();\n const t = this.tagName.trim();\n if (!r || !t) return;\n this.run(this.api.createTag(this.projectId(), r.name, t, this.tagFrom.trim() || r.defaultBranch), 'Could not create the tag.', () => {\n this.tagging.set(false);\n this.note.set(`Tag ${t} created.`);\n this.tagName = '';\n });\n }\n\n protected removeTag(t: Ref) {\n const r = this.repo();\n if (!r) return;\n this.run(this.api.deleteTag(this.projectId(), r.name, t.name), `Could not delete ${t.name}.`, () => this.note.set(`Tag ${t.name} deleted.`));\n }\n\n protected startRelease() {\n const r = this.repo();\n this.tagging.set(false);\n this.draft.set({ tag: '', newTag: true, target: r?.defaultBranch ?? 'main', title: '', notes: '', prerelease: false, draft: true });\n }\n\n protected setTag(d: Draft, tag: string) {\n d.tag = tag.trim();\n d.newTag = !this.tags().some((t) => t.name === d.tag);\n }\n\n protected generate(d: Draft) {\n const r = this.repo();\n if (!r) return;\n this.busy.set(true);\n const target = d.newTag ? d.target || r.defaultBranch : 'refs/tags/' + d.tag;\n this.api.releaseNotes(this.projectId(), r.name, target).subscribe({\n next: (n) => { this.busy.set(false); d.notes = n; this.draft.set({ ...d }); },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not generate the notes.')); },\n });\n }\n\n protected edit(r: Release) {\n this.tagging.set(false);\n this.draft.set({ id: r.id, version: r.version, tag: r.tag, newTag: false, target: '', title: r.title === r.tag ? '' : r.title, notes: r.notes, prerelease: r.prerelease, draft: r.draft });\n }\n\n protected save(d: Draft, asDraft: boolean) {\n const r = this.repo();\n if (!r) return;\n if (d.id) {\n this.run(this.api.updateRelease(this.projectId(), r.name, d.id, { title: d.title, notes: d.notes, prerelease: d.prerelease, draft: d.draft && asDraft, version: d.version }),\n 'Could not save the release.', () => { this.draft.set(null); this.note.set(asDraft ? 'Draft saved.' : `${d.tag} saved.`); });\n return;\n }\n this.run(this.api.createRelease(this.projectId(), r.name, { tag: d.tag, target: d.newTag ? d.target || r.defaultBranch : undefined, title: d.title, notes: d.notes, prerelease: d.prerelease, draft: asDraft }),\n 'Could not create the release.', () => { this.draft.set(null); this.note.set(asDraft ? `Draft ${d.tag} saved.` : `${d.tag} published.`); });\n }\n\n protected remove(rel: Release) {\n const r = this.repo();\n if (!r) return;\n this.confirming.set('');\n this.run(this.api.deleteRelease(this.projectId(), r.name, rel.id, this.alsoTag), `Could not delete ${rel.tag}.`, () => this.note.set(`Release ${rel.tag} deleted${this.alsoTag ? ' with its tag' : ''}.`));\n }\n\n protected upload(rel: Release, ev: Event) {\n const r = this.repo();\n const input = ev.target as HTMLInputElement;\n const file = input.files?.[0];\n if (!r || !file) return;\n if (file.size > 25 * 1024 * 1024) {\n this.error.set('A release file is at most 25 MB.');\n return;\n }\n this.run(this.api.addAsset(this.projectId(), r.name, rel.id, file), 'Could not add the file.', () => { input.value = ''; this.note.set(`${file.name} added to ${rel.tag}.`); });\n }\n\n protected removeAsset(rel: Release, id: string) {\n const r = this.repo();\n if (!r) return;\n this.run(this.api.deleteAsset(this.projectId(), r.name, rel.id, id), 'Could not remove the file.');\n }\n\n protected download(rel: Release, id: string, filename: string) {\n const r = this.repo();\n if (!r) return;\n this.api.assetBlob(this.projectId(), r.name, rel.id, id).subscribe({\n next: (b) => this.save_(b, filename),\n error: (e) => this.error.set(apiMessage(e, 'Could not download the file.')),\n });\n }\n\n protected archive(rel: Release, format: 'zip' | 'tar.gz') {\n const r = this.repo();\n if (!r) return;\n this.api.archiveUrl(this.projectId(), r.name, 'refs/tags/' + rel.tag, format).subscribe({\n next: (url) => { if (url) window.location.assign(url); },\n error: (e) => this.error.set(apiMessage(e, 'Could not prepare the archive.')),\n });\n }\n\n private save_(b: globalThis.Blob, filename: string) {\n const url = URL.createObjectURL(b);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.click();\n setTimeout(() => URL.revokeObjectURL(url), 10_000);\n }\n}\n\n/** Newest commit first; tags on commits of the same second by version, highest first (v1.10 after v1.9). */\nfunction sortTags(tags: Ref[]): Ref[] {\n const when = (t: Ref) => Date.parse(t.commit?.committer?.when ?? '') || 0;\n return [...tags].sort((a, b) => when(b) - when(a) || b.name.localeCompare(a.name, undefined, { numeric: true }));\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router, RouterLink } from '@angular/router';\nimport { CommitRequest, Repo, apiMessage } from './code.api';\nimport { CommitBox, CommitChoice } from './commit.box';\nimport { RepoPage } from './repo-base';\nimport { size } from './look';\n\ninterface Upload {\n name: string;\n size: number;\n b64: string;\n}\n\n/** Uploads in one commit stay under the server's 25 MB request limit (base64 grows them by a third). */\nconst MAX_UPLOAD = 18 * 1024 * 1024;\n\n// /{org}/{project}/code/{repo}/new?ref=&path= and /upload (DEV-13): a new file written in the\n// browser, or files uploaded from the computer, committed to the branch or to a new branch with a\n// pull request (protection applies).\n@Component({\n selector: 'o-code-new-file',\n imports: [FormsModule, RouterLink, CommitBox],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"o-page o-wide\">\n @if (repo(); as r) {\n <div class=\"o-ph\"><div class=\"o-col\"><span class=\"o-eyebrow\">{{ r.name }} · {{ branch() }}</span><h1 class=\"o-t\">{{ upload() ? 'Upload files' : 'Create a file' }}</h1></div></div>\n @if (error()) {<div class=\"o-note o-red\" role=\"alert\">{{ error() }}</div>}\n @if (!canWrite()) {\n <div class=\"o-card\"><div class=\"o-empty\">Your role cannot change this repository.</div></div>\n } @else {\n <div class=\"o-card\">\n <div class=\"o-cb o-col\" style=\"gap:12px\">\n @if (upload()) {\n <div class=\"o-fld\"><label for=\"nf-dir\">Into folder</label><input id=\"nf-dir\" class=\"o-in o-mono\" [(ngModel)]=\"dir\" placeholder=\"(the repository root)\" /></div>\n <div class=\"o-fld\"><label for=\"nf-files\">Files</label><input id=\"nf-files\" type=\"file\" multiple class=\"o-in\" (change)=\"pick($event)\" data-testid=\"upload-files\" /></div>\n @for (u of uploads(); track u.name) {<div class=\"o-row o-sm\"><span class=\"o-mono\">{{ shown(u.name) }}</span><span class=\"o-r o-faint\">{{ fmt(u.size) }}</span><button type=\"button\" class=\"o-lnk\" (click)=\"drop(u.name)\" [attr.aria-label]=\"'Remove ' + u.name\">×</button></div>}\n } @else {\n <div class=\"o-fld\"><label for=\"nf-path\">File path</label><input id=\"nf-path\" class=\"o-in o-mono\" [(ngModel)]=\"filePath\" placeholder=\"docs/notes.md\" data-testid=\"new-file-path\" /></div>\n <textarea class=\"o-in o-mono\" rows=\"16\" style=\"font-size:12px;height:auto;padding:8px 10px\" aria-label=\"File contents\" [(ngModel)]=\"content\" data-testid=\"new-file-text\"></textarea>\n }\n </div>\n <div class=\"o-cb\" style=\"border-top:1px solid var(--o-line-soft)\">\n <o-commit-box [repo]=\"r.name\" [branch]=\"branch()\" [defaultMessage]=\"defaultMessage()\" [busy]=\"busy()\" (commit)=\"save($event)\" (cancel)=\"back()\" />\n </div>\n </div>\n }\n } @else if (error()) {\n <div class=\"o-card o-empty\"><p>{{ error() }}</p><a class=\"o-btn\" [routerLink]=\"host.link('code')\">All repositories</a></div>\n }\n </div>\n `,\n})\nexport class NewFilePage extends RepoPage {\n private readonly router = inject(Router);\n protected readonly upload = signal(false);\n protected readonly ref = signal('');\n protected readonly uploads = signal<Upload[]>([]);\n protected readonly busy = signal(false);\n protected filePath = '';\n protected content = '';\n protected dir = '';\n protected readonly branch = computed(() => this.ref() || this.repo()?.defaultBranch || 'main');\n protected readonly defaultMessage = computed(() => (this.upload() ? 'Add files via upload' : 'Create a file'));\n protected readonly fmt = size;\n\n constructor() {\n super();\n this.upload.set(this.route.snapshot.url.at(-1)?.path === 'upload');\n this.route.queryParamMap.subscribe((q) => {\n this.ref.set(q.get('ref') ?? '');\n const p = q.get('path') ?? '';\n this.dir = p;\n this.filePath = p ? p.replace(/\\/+$/, '') + '/' : '';\n });\n }\n\n protected onRepo(_: Repo) {}\n\n protected async pick(ev: Event) {\n const files = Array.from((ev.target as HTMLInputElement).files ?? []);\n const out: Upload[] = [...this.uploads()];\n for (const f of files) {\n const buf = new Uint8Array(await f.arrayBuffer());\n let bin = '';\n for (let i = 0; i < buf.length; i += 0x8000) bin += String.fromCharCode(...buf.subarray(i, i + 0x8000));\n out.push({ name: f.name, size: f.size, b64: btoa(bin) });\n }\n if (out.reduce((a, u) => a + u.size, 0) > MAX_UPLOAD) {\n this.error.set('One upload is at most 18 MB; commit large files with Git.');\n return;\n }\n this.error.set('');\n this.uploads.set(out);\n }\n\n protected shown(name: string) {\n const prefix = this.dir.trim().replace(/^\\/+|\\/+$/g, '');\n return (prefix ? prefix + '/' : '') + name;\n }\n\n protected drop(name: string) {\n this.uploads.set(this.uploads().filter((u) => u.name !== name));\n }\n\n protected back() {\n void this.router.navigate(this.link(), { queryParams: { ref: this.ref() || null, path: this.dir || null } });\n }\n\n protected save(c: CommitChoice) {\n const r = this.repo();\n if (!r) return;\n const body: CommitRequest = c.newBranch ? { branch: c.newBranch, from: this.branch(), message: c.message, pull: {} } : { branch: this.branch(), message: c.message };\n if (this.upload()) {\n if (!this.uploads().length) { this.error.set('Choose files to upload.'); return; }\n const prefix = this.dir.trim().replace(/^\\/+|\\/+$/g, '');\n body.uploads = Object.fromEntries(this.uploads().map((u) => [(prefix ? prefix + '/' : '') + u.name, u.b64]));\n } else {\n const p = this.filePath.trim().replace(/^\\/+/, '');\n if (!p || p.endsWith('/')) { this.error.set('Name the file.'); return; }\n body.files = { [p]: this.content };\n }\n this.busy.set(true);\n this.error.set('');\n this.api.commitFiles(this.projectId(), r.name, body).subscribe({\n next: (res) => {\n this.busy.set(false);\n if (res.pull) { void this.router.navigate(this.link('pull/' + res.pull)); return; }\n if (!this.upload()) { void this.router.navigate(this.link('blob'), { queryParams: { ref: res.branch, path: this.filePath.trim().replace(/^\\/+/, '') } }); return; }\n void this.router.navigate(this.link(), { queryParams: { ref: res.branch, path: this.dir.trim() || null } });\n },\n error: (e) => { this.busy.set(false); this.error.set(apiMessage(e, 'Could not commit.')); },\n });\n }\n}\n","/*\n * @chisquare-tech/origine-ngx-apps-code: the Code module's screens (TRD §6.10). The host app provides\n * CodeHost and mounts the pages at /{org}/{project}/code, /code/new, /code/pulls and\n * /code/{repo}[/blob|/commits|/commit/:sha|/branches|/pulls|/pull/:number|/settings].\n */\nexport * from './lib/host';\nexport * from './lib/code.api';\nexport * from './lib/look';\nexport * from './lib/repo-base';\nexport * from './lib/diff.view';\nexport * from './lib/repos.page';\nexport * from './lib/repo.page';\nexport * from './lib/file.page';\nexport * from './lib/history.pages';\nexport * from './lib/pulls.page';\nexport * from './lib/pull.page';\nexport * from './lib/settings.page';\nexport * from './lib/releases.page';\nexport * from './lib/commit.box';\nexport * from './lib/new-file.page';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["map"],"mappings":"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"}