@knpkv/control-center 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.
- package/dist/client/.vite/manifest.json +312 -255
- package/dist/client/assets/ActiveWorkPage-C6lIQfjL.js +2 -0
- package/dist/client/assets/{ActiveWorkPage-BsaIr8ah.js.map → ActiveWorkPage-C6lIQfjL.js.map} +1 -1
- package/dist/client/assets/AgentPage-DqB5BilE.js +6 -0
- package/dist/client/assets/{AgentPage-Cybynsnc.js.map → AgentPage-DqB5BilE.js.map} +1 -1
- package/dist/client/assets/{AtlassianOAuthCallbackPage-Du3pHuS9.js → AtlassianOAuthCallbackPage-DzTO6SqN.js} +2 -2
- package/dist/client/assets/{AtlassianOAuthCallbackPage-Du3pHuS9.js.map → AtlassianOAuthCallbackPage-DzTO6SqN.js.map} +1 -1
- package/dist/client/assets/AuthorizedSharePage-V_E5giT7.js +2 -0
- package/dist/client/assets/{AuthorizedSharePage-tfTdXNjt.js.map → AuthorizedSharePage-V_E5giT7.js.map} +1 -1
- package/dist/client/assets/BrowserCrypto-CoBR2WBd.js +2 -0
- package/dist/client/assets/{BrowserCrypto-DVxU0-Oc.js.map → BrowserCrypto-CoBR2WBd.js.map} +1 -1
- package/dist/client/assets/BrowserSessionHydrator-CEypgMkR.js +2 -0
- package/dist/client/assets/{BrowserSessionHydrator-CvtvZstV.js.map → BrowserSessionHydrator-CEypgMkR.js.map} +1 -1
- package/dist/client/assets/CommandSearch-syQMt_rx.js +2 -0
- package/dist/client/assets/{CommandSearch-Bf_oW_kD.js.map → CommandSearch-syQMt_rx.js.map} +1 -1
- package/dist/client/assets/Dialog-DSwimdwG-BeHnBpPp.js +42 -0
- package/dist/client/assets/Dialog-DSwimdwG-BeHnBpPp.js.map +1 -0
- package/dist/client/assets/Domain-cJ5aJFpE.js +2 -0
- package/dist/client/assets/Domain-cJ5aJFpE.js.map +1 -0
- package/dist/client/assets/ItemsPage-Cr3--iJc.js +2 -0
- package/dist/client/assets/{ItemsPage-BmWEHinz.js.map → ItemsPage-Cr3--iJc.js.map} +1 -1
- package/dist/client/assets/OpenPullRequestPage-BYoRmtui.js +2 -0
- package/dist/client/assets/OpenPullRequestPage-BYoRmtui.js.map +1 -0
- package/dist/client/assets/{Pages-BmZj4KzS.js → Pages-DrDuXLFH.js} +2 -2
- package/dist/client/assets/{Pages-BmZj4KzS.js.map → Pages-DrDuXLFH.js.map} +1 -1
- package/dist/client/assets/PairPage-ByOBKuBB.js +2 -0
- package/dist/client/assets/{PairPage-CLLUweYZ.js.map → PairPage-ByOBKuBB.js.map} +1 -1
- package/dist/client/assets/PortalProvider-CN_81Fy3-D_japesx.js +2 -0
- package/dist/client/assets/{PortalProvider-BpgZwSpw-nEH0TqWT.js.map → PortalProvider-CN_81Fy3-D_japesx.js.map} +1 -1
- package/dist/client/assets/PortfolioOverview-BacOXO-c.js +2 -0
- package/dist/client/assets/{PortfolioOverview-BBKSc-yI.js.map → PortfolioOverview-BacOXO-c.js.map} +1 -1
- package/dist/client/assets/{PullRequestReviewPanel-Boi0A6pq.js → PullRequestReviewPanel-DwVYuZ8Q.js} +5 -5
- package/dist/client/assets/{PullRequestReviewPanel-Boi0A6pq.js.map → PullRequestReviewPanel-DwVYuZ8Q.js.map} +1 -1
- package/dist/client/assets/ReleaseRoute-C-MfQKnL.js +2 -0
- package/dist/client/assets/{ReleaseRoute-D4CttCjC.js.map → ReleaseRoute-C-MfQKnL.js.map} +1 -1
- package/dist/client/assets/ReleaseWorkset-MV3I0HCi.js +2 -0
- package/dist/client/assets/{ReleaseWorkset-Dt-ArwsN.js.map → ReleaseWorkset-MV3I0HCi.js.map} +1 -1
- package/dist/client/assets/ReviewSuggestionPublicationSurface-BZIa-Vvc.js +2 -0
- package/dist/client/assets/{ReviewSuggestionPublicationSurface-N9Qwdh2n.js.map → ReviewSuggestionPublicationSurface-BZIa-Vvc.js.map} +1 -1
- package/dist/client/assets/ServicesPage-BjeCOlsh.js +2 -0
- package/dist/client/assets/{ServicesPage-D0ygZTFD.js.map → ServicesPage-BjeCOlsh.js.map} +1 -1
- package/dist/client/assets/TimelinePage-Ccnp6Mmg.js +2 -0
- package/dist/client/assets/{TimelinePage-Bb2o9DGU.js.map → TimelinePage-Ccnp6Mmg.js.map} +1 -1
- package/dist/client/assets/{WorkspaceEntityLink-Cw675wTN.js → WorkspaceEntityLink-D3TXDcD0.js} +2 -2
- package/dist/client/assets/{WorkspaceEntityLink-Cw675wTN.js.map → WorkspaceEntityLink-D3TXDcD0.js.map} +1 -1
- package/dist/client/assets/WorkspaceEntityRoute-uUK6vwM_.js +14 -0
- package/dist/client/assets/WorkspaceEntityRoute-uUK6vwM_.js.map +1 -0
- package/dist/client/assets/WorkspaceHomeLink-D5SdEgJJ.js +2 -0
- package/dist/client/assets/{WorkspaceHomeLink-FGslxXCu.js.map → WorkspaceHomeLink-D5SdEgJJ.js.map} +1 -1
- package/dist/client/assets/WorkspacePullRequestDetails-CKedGIT8.js +3 -0
- package/dist/client/assets/{WorkspacePullRequestDetails-Dxg8argO.js.map → WorkspacePullRequestDetails-CKedGIT8.js.map} +1 -1
- package/dist/client/assets/{WorkspaceReleaseLayout-BvEiZJEb.js → WorkspaceReleaseLayout-Bdvl0q99.js} +2 -2
- package/dist/client/assets/{WorkspaceReleaseLayout-BvEiZJEb.js.map → WorkspaceReleaseLayout-Bdvl0q99.js.map} +1 -1
- package/dist/client/assets/{WorkspaceRichText-CocmKQ4T.js → WorkspaceRichText-Beh64wsV.js} +2 -2
- package/dist/client/assets/{WorkspaceRichText-CocmKQ4T.js.map → WorkspaceRichText-Beh64wsV.js.map} +1 -1
- package/dist/client/assets/WorkspaceSettingsPage-BxFq65Vf.js +2 -0
- package/dist/client/assets/{WorkspaceSettingsPage-iZhUs-pg.js.map → WorkspaceSettingsPage-BxFq65Vf.js.map} +1 -1
- package/dist/client/assets/{agent-api-CzdQFCcD.js → agent-api-CUWP1qs8.js} +2 -2
- package/dist/client/assets/{agent-api-CzdQFCcD.js.map → agent-api-CUWP1qs8.js.map} +1 -1
- package/dist/client/assets/{atlassianOAuthSetupIntentStorage-BxsxmjSm.js → atlassianOAuthSetupIntentStorage-Cy1Gw639.js} +2 -2
- package/dist/client/assets/{atlassianOAuthSetupIntentStorage-BxsxmjSm.js.map → atlassianOAuthSetupIntentStorage-Cy1Gw639.js.map} +1 -1
- package/dist/client/assets/authenticatedMutationClient-Bc_-Jpbo.js +2 -0
- package/dist/client/assets/{authenticatedMutationClient-DUqEcJHu.js.map → authenticatedMutationClient-Bc_-Jpbo.js.map} +1 -1
- package/dist/client/assets/authorizedShareTransport-kkT3Jf6q.js +2 -0
- package/dist/client/assets/{authorizedShareTransport-7YCNH9l3.js.map → authorizedShareTransport-kkT3Jf6q.js.map} +1 -1
- package/dist/client/assets/client-D3WRV6yl.js +5 -0
- package/dist/client/assets/client-D3WRV6yl.js.map +1 -0
- package/dist/client/assets/{confluenceTasks-D9yrB-oV.js → confluenceTasks-By7BV0WN.js} +2 -2
- package/dist/client/assets/{confluenceTasks-D9yrB-oV.js.map → confluenceTasks-By7BV0WN.js.map} +1 -1
- package/dist/client/assets/connectionTestTransport-CRq7l9X0.js +2 -0
- package/dist/client/assets/{connectionTestTransport-D8tiZ4ym.js.map → connectionTestTransport-CRq7l9X0.js.map} +1 -1
- package/dist/client/assets/controlCenterRelayDock-D7375HPG.js +3 -0
- package/dist/client/assets/controlCenterRelayDock-D7375HPG.js.map +1 -0
- package/dist/client/assets/controlCenterRelayDockChrome-B7jSUI3t.js +3 -0
- package/dist/client/assets/controlCenterRelayDockChrome-B7jSUI3t.js.map +1 -0
- package/dist/client/assets/index-BVikncBH.js +11 -0
- package/dist/client/assets/index-BVikncBH.js.map +1 -0
- package/dist/client/assets/index-tjRpNCt_.css +1 -0
- package/dist/client/assets/openPullRequest-BMlmibLP.js +2 -0
- package/dist/client/assets/openPullRequest-BMlmibLP.js.map +1 -0
- package/dist/client/assets/patterns-DAeEdyxU.js +2 -0
- package/dist/client/assets/patterns-DAeEdyxU.js.map +1 -0
- package/dist/client/assets/{presentPortfolio-c8-wbodG.js → presentPortfolio-DVP-zqTg.js} +2 -2
- package/dist/client/assets/{presentPortfolio-c8-wbodG.js.map → presentPortfolio-DVP-zqTg.js.map} +1 -1
- package/dist/client/assets/{presentWorkspaceItems-DfhyQeSY.js → presentWorkspaceItems-BY8bmqjF.js} +2 -2
- package/dist/client/assets/{presentWorkspaceItems-DfhyQeSY.js.map → presentWorkspaceItems-BY8bmqjF.js.map} +1 -1
- package/dist/client/assets/primitives-DYGtIZqB-r-Glkv2i.js +2 -0
- package/dist/client/assets/primitives-DYGtIZqB-r-Glkv2i.js.map +1 -0
- package/dist/client/assets/pullRequestReviewFailures-CCNxSXP6.js +2 -0
- package/dist/client/assets/{pullRequestReviewFailures-QvtS729d.js.map → pullRequestReviewFailures-CCNxSXP6.js.map} +1 -1
- package/dist/client/assets/pullRequestReviewThreadReplay-eI3Y4i6s.js +2 -0
- package/dist/client/assets/{pullRequestReviewThreadReplay-CpPdYxQE.js.map → pullRequestReviewThreadReplay-eI3Y4i6s.js.map} +1 -1
- package/dist/client/assets/{releaseAgentTransport-BCQDYqZt.js → releaseAgentTransport-CJjWwE8y.js} +2 -2
- package/dist/client/assets/{releaseAgentTransport-BCQDYqZt.js.map → releaseAgentTransport-CJjWwE8y.js.map} +1 -1
- package/dist/client/assets/releaseRoutes-h4FVwFvJ.js +2 -0
- package/dist/client/assets/{releaseRoutes-CSP_eBj6.js.map → releaseRoutes-h4FVwFvJ.js.map} +1 -1
- package/dist/client/assets/{serviceOnboarding-B6v5VXTG.js → serviceOnboarding-F9Lj6a7y.js} +2 -2
- package/dist/client/assets/{serviceOnboarding-B6v5VXTG.js.map → serviceOnboarding-F9Lj6a7y.js.map} +1 -1
- package/dist/client/assets/useWorkspaceDefaultLanding-DMWfrZfF.js +3 -0
- package/dist/client/assets/{useWorkspaceDefaultLanding-C3PRrLgk.js.map → useWorkspaceDefaultLanding-DMWfrZfF.js.map} +1 -1
- package/dist/client/assets/useWorkspaceItems-6KWfmFtx.js +2 -0
- package/dist/client/assets/{useWorkspaceItems-CHYpfLmL.js.map → useWorkspaceItems-6KWfmFtx.js.map} +1 -1
- package/dist/client/assets/{workspaceEntityRoutes-CFPO-iFw.js → workspaceEntityRoutes-BJ-SC0Jd.js} +2 -2
- package/dist/client/assets/{workspaceEntityRoutes-CFPO-iFw.js.map → workspaceEntityRoutes-BJ-SC0Jd.js.map} +1 -1
- package/dist/client/assets/{workspaceScrollCapture-DUj-_YMd.js → workspaceScrollCapture-CwBIBHg8.js} +2 -2
- package/dist/client/assets/{workspaceScrollCapture-DUj-_YMd.js.map → workspaceScrollCapture-CwBIBHg8.js.map} +1 -1
- package/dist/client/assets/workspaceSettingsTransport-BwRQteEH.js +2 -0
- package/dist/client/assets/{workspaceSettingsTransport-Kq7lfPsC.js.map → workspaceSettingsTransport-BwRQteEH.js.map} +1 -1
- package/dist/client/build-graph.json +63 -0
- package/dist/client/index.html +3 -3
- package/dist/server/api/index.js +1 -1
- package/dist/server/assets/{BindConfig-hNWrGfu2.js → BindConfig-D8aIjI_R.js} +2 -2
- package/dist/server/assets/{BindConfig-hNWrGfu2.js.map → BindConfig-D8aIjI_R.js.map} +1 -1
- package/dist/server/assets/{controlCenterApi-BcVWTP9F.js → controlCenterApi-WaKi6EUb.js} +2 -1
- package/dist/server/assets/controlCenterApi-WaKi6EUb.js.map +1 -0
- package/dist/server/index.js +1 -1
- package/dist/server/server/cli.js +1 -1
- package/dist/server/server/index.js +1 -1
- package/package.json +7 -6
- package/dist/client/assets/ActiveWorkPage-BsaIr8ah.js +0 -2
- package/dist/client/assets/AgentPage-Cybynsnc.js +0 -6
- package/dist/client/assets/AuthorizedSharePage-tfTdXNjt.js +0 -2
- package/dist/client/assets/BrowserCrypto-DVxU0-Oc.js +0 -2
- package/dist/client/assets/BrowserSessionHydrator-CvtvZstV.js +0 -2
- package/dist/client/assets/CommandSearch-Bf_oW_kD.js +0 -2
- package/dist/client/assets/Dialog-1WvU8GjA-C7r26HF0.js +0 -42
- package/dist/client/assets/Dialog-1WvU8GjA-C7r26HF0.js.map +0 -1
- package/dist/client/assets/ItemsPage-BmWEHinz.js +0 -2
- package/dist/client/assets/OpenPullRequestPage-DkCom6mf.js +0 -2
- package/dist/client/assets/OpenPullRequestPage-DkCom6mf.js.map +0 -1
- package/dist/client/assets/PairPage-CLLUweYZ.js +0 -2
- package/dist/client/assets/PortalProvider-BpgZwSpw-nEH0TqWT.js +0 -2
- package/dist/client/assets/PortfolioOverview-BBKSc-yI.js +0 -2
- package/dist/client/assets/ReleaseRoute-D4CttCjC.js +0 -2
- package/dist/client/assets/ReleaseWorkset-Dt-ArwsN.js +0 -2
- package/dist/client/assets/ReviewSuggestionPublicationSurface-N9Qwdh2n.js +0 -2
- package/dist/client/assets/ServicesPage-D0ygZTFD.js +0 -2
- package/dist/client/assets/TimelinePage-Bb2o9DGU.js +0 -2
- package/dist/client/assets/WorkspaceEntityRoute-rLRiaF8b.js +0 -14
- package/dist/client/assets/WorkspaceEntityRoute-rLRiaF8b.js.map +0 -1
- package/dist/client/assets/WorkspaceHomeLink-FGslxXCu.js +0 -2
- package/dist/client/assets/WorkspacePullRequestDetails-Dxg8argO.js +0 -3
- package/dist/client/assets/WorkspaceSettingsPage-iZhUs-pg.js +0 -2
- package/dist/client/assets/authenticatedMutationClient-DUqEcJHu.js +0 -2
- package/dist/client/assets/authorizedShareTransport-7YCNH9l3.js +0 -2
- package/dist/client/assets/client-D2F6HlDk.js +0 -5
- package/dist/client/assets/client-D2F6HlDk.js.map +0 -1
- package/dist/client/assets/connectionTestTransport-D8tiZ4ym.js +0 -2
- package/dist/client/assets/index-BWx9sNOT.js +0 -11
- package/dist/client/assets/index-BWx9sNOT.js.map +0 -1
- package/dist/client/assets/index-CIfiz7oF.css +0 -1
- package/dist/client/assets/patterns-CxMz8DKX-ByHwV03y.js +0 -2
- package/dist/client/assets/patterns-CxMz8DKX-ByHwV03y.js.map +0 -1
- package/dist/client/assets/primitives-CW89TsFB-BBLwFFPo.js +0 -2
- package/dist/client/assets/primitives-CW89TsFB-BBLwFFPo.js.map +0 -1
- package/dist/client/assets/pullRequestReviewFailures-QvtS729d.js +0 -2
- package/dist/client/assets/pullRequestReviewThreadReplay-CpPdYxQE.js +0 -2
- package/dist/client/assets/releaseRoutes-CSP_eBj6.js +0 -2
- package/dist/client/assets/useWorkspaceDefaultLanding-C3PRrLgk.js +0 -3
- package/dist/client/assets/useWorkspaceItems-CHYpfLmL.js +0 -2
- package/dist/client/assets/workspaceSettingsTransport-Kq7lfPsC.js +0 -2
- package/dist/server/assets/controlCenterApi-BcVWTP9F.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{An as e,Bn as t,Br as n,Cr as r,Dn as i,Fn as a,Gr as o,Ni as s,On as c,Rn as l,Tr as u,Vr as d,Xi as f,Xn as p,_r as m,di as h,er as g,hr as _,jn as v,jr as y,vr as b,wr as x,yr as S,zn as C}from"./agent-api-CUWP1qs8.js";var w=C.pipe(p(`PullRequestId`)),T=C.pipe(p(`RepositoryName`)),E=C.pipe(p(`AwsProfileName`)),D=C.pipe(p(`AwsRegion`)),O=C.pipe(p(`CommentId`)),k=C.pipe(p(`SandboxId`)),A=a([`OPEN`,`CLOSED`,`MERGED`]),j=a([`error`,`info`,`warning`,`success`]);a([`idle`,`loading`,`error`]);var M=a([`creating`,`cloning`,`starting`,`running`,`stopping`,`stopped`,`error`]),N=class extends e(`Account`)({profile:E,region:D,awsAccountId:r(C),repoAccountId:r(C)}){},P=class extends e(`ApprovalRule`)({ruleName:C,requiredApprovals:l,poolMembers:i(C),poolMemberArns:i(C).pipe(y(s([]))),satisfied:c,fromTemplate:r(C)}){};e(`PullRequest`)({id:w,title:C,description:r(C),author:C,repositoryName:T,creationDate:v,lastModifiedDate:v,link:C,account:N,status:A,sourceBranch:C,destinationBranch:C,isMergeable:c,isApproved:c,commentCount:r(l),healthScore:r(l),fetchedAt:r(v),approvedBy:i(C),approvedByArns:i(C).pipe(y(s([]))),commentedBy:i(C),filesChanged:r(l),approvalRules:i(P).pipe(y(s([])))});var F=e=>e.startsWith(`cn-`)?`console.amazonaws.cn`:e.startsWith(`us-gov-`)?`console.amazonaws-us-gov.com`:`console.aws.amazon.com`,I=(e,t,n)=>`https://${e}.${F(e)}/codesuite/codecommit/repositories/${t}/pull-requests/${n}?region=${e}`,L=D.check(b(/^[a-z]{2}(?:-gov)?-[a-z0-9-]+-[0-9]+$/u)),R=T.check(b(/^[A-Za-z0-9._-]{1,100}$/u)),z=w.check(b(/^[0-9]{1,200}$/u)),B=t({region:L,repositoryName:R,pullRequestId:z}),V=/^(?<region>[a-z]{2}(?:-gov)?-[a-z0-9-]+-\d+)\.(?<domain>console\.aws\.amazon\.com|console\.amazonaws\.cn|console\.amazonaws-us-gov\.com)$/u,H=/^\/codesuite\/codecommit\/repositories\/(?<repositoryName>[A-Za-z0-9._-]{1,100})\/pull-requests\/(?<pullRequestId>[0-9]{1,200})(?:\/(?<view>activity|changes|details))?$/u,U=e=>{if(!URL.canParse(e))return null;let t=new URL(e),n=V.exec(t.hostname),r=H.exec(t.pathname),i=n?.groups?.region,a=n?.groups?.domain,o=r?.groups?.repositoryName,s=r?.groups?.pullRequestId,c=r?.groups?.view,l=t.searchParams.getAll(`region`);return t.protocol!==`https:`||t.port.length>0||t.username.length>0||t.password.length>0||t.hash.length>0&&c!==`activity`||i===void 0||a===void 0||o===void 0||s===void 0||a!==F(i)||l.length>1||l.length===1&&l[0]!==i?null:{region:D.make(i),repositoryName:T.make(o),pullRequestId:w.make(s)}},W=C.check(S(),m(),_(2048)).pipe(g(B,{decode:d((e,t)=>{let n=U(e);return n===null?h(new o({expected:`an AWS CodeCommit pull-request console URL`},e,t)):s(n)}),encode:n(({pullRequestId:e,region:t,repositoryName:n})=>I(t,n,e))}));e(`Sandbox`)({id:k,pullRequestId:w,awsAccountId:C,repositoryName:T,region:D,sourceBranch:C,containerId:r(C),port:r(l),workspacePath:C,status:M,error:r(C),createdAt:v,lastActivityAt:v}),e(`PRComment`)({id:O,content:C,author:C,creationDate:v,inReplyTo:r(O),deleted:c,filePath:r(C),lineNumber:r(l)});var G=a([`BEFORE`,`AFTER`]),K=t({id:C,content:C,author:C,creationDate:C,inReplyTo:r(C),deleted:c,filePath:r(C),lineNumber:r(l)}),q=t({root:K,replies:i(u(()=>q))});t({filePath:r(C),beforeCommitId:r(C),afterCommitId:r(C),relativeFileVersion:r(G),comments:i(q)});var J=a([`new_comment`,`comment_edited`,`comment_deleted`,`approval_changed`,`approval_requested`,`review_reminder`,`merge_changed`,`title_changed`,`description_changed`,`pr_merged`,`pr_closed`,`pr_reopened`]);e(`PersistentNotification`)({id:l,pullRequestId:w,awsAccountId:C,type:J,message:C,createdAt:v,read:c}),f(),e(`NotificationItem`)({type:j,title:C,message:C,timestamp:v,profile:x(C)});export{W as n,B as t};
|
|
2
|
+
//# sourceMappingURL=Domain-cJ5aJFpE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Domain-cJ5aJFpE.js","names":[],"sources":["../../../../codecommit-core/src/Domain.ts"],"sourcesContent":["/**\n * Domain models for CodeCommit operations.\n *\n * Provides branded types for compile-time ID safety, `Schema.Class` models\n * with computed properties, and `Schema.Literal` enumerations. Central types\n * include {@link PullRequest} (with approval rules, approver ARNs, and\n * review detection), {@link ApprovalRule} (per-PR rule with pool members\n * and satisfaction state), and {@link PersistentNotification} (including\n * approval_requested and review_reminder types).\n *\n * **Mental model**\n *\n * - ApprovalRule: per-PR rule with pool members (normalized names) + raw ARNs\n * - needsMyReview: standalone fn (not method) so it works with wire objects too\n * - PersistentNotificationType: includes approval_requested, review_reminder\n *\n * **Gotchas**\n *\n * - ApprovalRule uses `Schema.Class`, but instances round-trip as plain objects\n * through JSON without class instance checks\n *\n * **Common tasks**\n *\n * - Define approval rule: {@link ApprovalRule}\n * - Check review needed: {@link needsMyReview}\n * - PR console URL: {@link codecommitConsoleUrl}\n * - Notification types: {@link PersistentNotificationType}\n *\n * **Quickstart**\n *\n * ```ts\n * import { needsMyReview, PullRequest } from \"./Domain.js\"\n *\n * declare const pr: PullRequest\n * if (needsMyReview(pr, \"alice\")) {\n * console.log(`Review needed: ${pr.consoleUrl}`)\n * }\n * ```\n *\n * @category Domain\n * @module\n */\nimport { Data, Effect, Schema, SchemaGetter, SchemaIssue } from \"effect\"\n\n// ---------------------------------------------------------------------------\n// Branded Types\n// ---------------------------------------------------------------------------\n\n/**\n * Branded pull request identifier.\n *\n * @category Domain\n */\nexport const PullRequestId = Schema.String.pipe(Schema.brand(\"PullRequestId\"))\nexport type PullRequestId = typeof PullRequestId.Type\n\n/**\n * Branded repository name.\n *\n * @category Domain\n */\nexport const RepositoryName = Schema.String.pipe(Schema.brand(\"RepositoryName\"))\nexport type RepositoryName = typeof RepositoryName.Type\n\n/**\n * Branded AWS profile name.\n *\n * @category Domain\n */\nexport const AwsProfileName = Schema.String.pipe(Schema.brand(\"AwsProfileName\"))\nexport type AwsProfileName = typeof AwsProfileName.Type\n\n/**\n * Branded AWS region name.\n *\n * @category Domain\n */\nexport const AwsRegion = Schema.String.pipe(Schema.brand(\"AwsRegion\"))\nexport type AwsRegion = typeof AwsRegion.Type\n\n/**\n * Branded comment identifier.\n *\n * @category Domain\n */\nexport const CommentId = Schema.String.pipe(Schema.brand(\"CommentId\"))\nexport type CommentId = typeof CommentId.Type\n\n/**\n * Branded sandbox identifier.\n *\n * @category Domain\n */\nexport const SandboxId = Schema.String.pipe(Schema.brand(\"SandboxId\"))\nexport type SandboxId = typeof SandboxId.Type\n\n// ---------------------------------------------------------------------------\n// Enumerations\n// ---------------------------------------------------------------------------\n\n/**\n * Pull request status.\n *\n * @category Domain\n */\nexport const PullRequestStatus = Schema.Literals([\"OPEN\", \"CLOSED\", \"MERGED\"])\nexport type PullRequestStatus = typeof PullRequestStatus.Type\n\n/** Normalizes provider/cache account identifiers; blank values are unresolved, not identities. */\nexport const normalizeAccountId = (value: string | null | undefined): string | undefined => {\n const normalized = value?.trim()\n return normalized === undefined || normalized.length === 0 ? undefined : normalized\n}\n\n/**\n * Notification severity type.\n *\n * @category Domain\n */\nexport const NotificationType = Schema.Literals([\"error\", \"info\", \"warning\", \"success\"])\nexport type NotificationType = typeof NotificationType.Type\n\n/**\n * Application loading status.\n *\n * @category Domain\n */\nexport const AppStatus = Schema.Literals([\"idle\", \"loading\", \"error\"])\nexport type AppStatus = typeof AppStatus.Type\n\n/**\n * Sandbox lifecycle status.\n *\n * @category Domain\n */\nexport const SandboxStatus = Schema.Literals([\n \"creating\",\n \"cloning\",\n \"starting\",\n \"running\",\n \"stopping\",\n \"stopped\",\n \"error\"\n])\nexport type SandboxStatus = typeof SandboxStatus.Type\n\n// ---------------------------------------------------------------------------\n// Domain Models\n// ---------------------------------------------------------------------------\n\n/**\n * AWS account reference (profile + region).\n *\n * @category Domain\n */\nexport class Account extends Schema.Class<Account>(\"Account\")({\n profile: AwsProfileName,\n region: AwsRegion,\n awsAccountId: Schema.optional(Schema.String),\n repoAccountId: Schema.optional(Schema.String)\n}) {}\n\n/**\n * Approval rule attached to a pull request.\n *\n * @category Domain\n */\nexport class ApprovalRule extends Schema.Class<ApprovalRule>(\"ApprovalRule\")({\n ruleName: Schema.String,\n requiredApprovals: Schema.Number,\n poolMembers: Schema.Array(Schema.String),\n poolMemberArns: Schema.Array(Schema.String).pipe(Schema.withDecodingDefaultTypeKey(Effect.succeed([]))),\n satisfied: Schema.Boolean,\n fromTemplate: Schema.optional(Schema.String)\n}) {}\n\n/**\n * CodeCommit pull request.\n *\n * @category Domain\n */\nexport class PullRequest extends Schema.Class<PullRequest>(\"PullRequest\")({\n id: PullRequestId,\n title: Schema.String,\n description: Schema.optional(Schema.String),\n author: Schema.String,\n repositoryName: RepositoryName,\n creationDate: Schema.Date,\n lastModifiedDate: Schema.Date,\n link: Schema.String,\n account: Account,\n status: PullRequestStatus,\n sourceBranch: Schema.String,\n destinationBranch: Schema.String,\n isMergeable: Schema.Boolean,\n isApproved: Schema.Boolean,\n commentCount: Schema.optional(Schema.Number),\n healthScore: Schema.optional(Schema.Number),\n fetchedAt: Schema.optional(Schema.Date),\n approvedBy: Schema.Array(Schema.String),\n approvedByArns: Schema.Array(Schema.String).pipe(Schema.withDecodingDefaultTypeKey(Effect.succeed([]))),\n commentedBy: Schema.Array(Schema.String),\n filesChanged: Schema.optional(Schema.Number),\n approvalRules: Schema.Array(ApprovalRule).pipe(Schema.withDecodingDefaultTypeKey(Effect.succeed([])))\n}) {\n get consoleUrl(): string {\n return codecommitConsoleUrl(this.account.region, this.repositoryName, this.id)\n }\n}\n\n/**\n * Robust identity comparison for matching a caller against an author or\n * approval-pool member.\n *\n * Both sides normally arrive already normalised by `normalizeAuthor`\n * (ARN → trailing `/`-segment), so the happy path is a plain equality. Under\n * cross-account SSO / assumed-role setups the two strings can still diverge —\n * e.g. one side is a full ARN or `AWSReservedSSO_<perm>_<id>/<user>` form while\n * the other is the bare username, or they differ only in case. This is a\n * SUPERSET of exact match: it still matches when the strings are equal, and\n * additionally matches when, after case-folding and reducing each side to its\n * final `/`- or `:`-segment (the username), the username segments are equal.\n * It deliberately anchors on the username segment so unrelated users never match.\n *\n * @category Domain\n */\nexport const identityMatches = (callerUsername: string, prAuthor: string): boolean => {\n const norm = (s: string) => s.trim().toLowerCase()\n const tail = (s: string) => {\n const segments = norm(s).split(/[/:]/).filter((seg) => seg.length > 0)\n return segments[segments.length - 1] ?? \"\"\n }\n const a = norm(callerUsername)\n const b = norm(prAuthor)\n if (a === \"\" || b === \"\") return false\n if (a === b) return true\n const ta = tail(callerUsername)\n const tb = tail(prAuthor)\n return ta !== \"\" && ta === tb\n}\n\n/**\n * Check if a PR needs review from the given user.\n * Standalone function so it works with both Schema.Class instances and plain wire objects.\n *\n * Uses {@link identityMatches} (a superset of exact equality) for the\n * caller-vs-pool-member and caller-vs-approver comparisons so SSO/ARN identity\n * forms still match when they refer to the same user.\n */\nexport const needsMyReview = (\n pr: { readonly approvalRules: ReadonlyArray<ApprovalRule>; readonly approvedBy: ReadonlyArray<string> },\n currentUser: string | undefined\n): boolean => {\n if (currentUser === undefined || currentUser.length === 0) return false\n if (pr.approvedBy.some((approver) => identityMatches(currentUser, approver))) return false\n return pr.approvalRules.some(\n (rule) => !rule.satisfied && rule.poolMembers.some((member) => identityMatches(currentUser, member))\n )\n}\n\nconst consoleDomainForRegion = (region: string): string =>\n region.startsWith(\"cn-\")\n ? \"console.amazonaws.cn\"\n : region.startsWith(\"us-gov-\")\n ? \"console.amazonaws-us-gov.com\"\n : \"console.aws.amazon.com\"\n\nexport const codecommitConsoleUrl = (region: string, repo: string, prId: string): string =>\n `https://${region}.${\n consoleDomainForRegion(\n region\n )\n }/codesuite/codecommit/repositories/${repo}/pull-requests/${prId}?region=${region}`\n\nconst CodeCommitLocatorRegion = AwsRegion.check(\n Schema.isPattern(/^[a-z]{2}(?:-gov)?-[a-z0-9-]+-[0-9]+$/u)\n)\nconst CodeCommitLocatorRepositoryName = RepositoryName.check(\n Schema.isPattern(/^[A-Za-z0-9._-]{1,100}$/u)\n)\nconst CodeCommitLocatorPullRequestId = PullRequestId.check(\n Schema.isPattern(/^[0-9]{1,200}$/u)\n)\n\n/** Provider coordinates recovered from an AWS CodeCommit console pull-request URL. */\nexport const CodeCommitPullRequestLocator = Schema.Struct({\n region: CodeCommitLocatorRegion,\n repositoryName: CodeCommitLocatorRepositoryName,\n pullRequestId: CodeCommitLocatorPullRequestId\n})\nexport type CodeCommitPullRequestLocator = typeof CodeCommitPullRequestLocator.Type\n\nconst codeCommitConsoleHost =\n /^(?<region>[a-z]{2}(?:-gov)?-[a-z0-9-]+-\\d+)\\.(?<domain>console\\.aws\\.amazon\\.com|console\\.amazonaws\\.cn|console\\.amazonaws-us-gov\\.com)$/u\nconst codeCommitPullRequestPath =\n /^\\/codesuite\\/codecommit\\/repositories\\/(?<repositoryName>[A-Za-z0-9._-]{1,100})\\/pull-requests\\/(?<pullRequestId>[0-9]{1,200})(?:\\/(?<view>activity|changes|details))?$/u\n\nconst parseCodeCommitPullRequestUrl = (input: string): CodeCommitPullRequestLocator | null => {\n if (!URL.canParse(input)) return null\n const url = new URL(input)\n const host = codeCommitConsoleHost.exec(url.hostname)\n const path = codeCommitPullRequestPath.exec(url.pathname)\n const region = host?.groups?.region\n const domain = host?.groups?.domain\n const repositoryName = path?.groups?.repositoryName\n const pullRequestId = path?.groups?.pullRequestId\n const view = path?.groups?.view\n const queryRegions = url.searchParams.getAll(\"region\")\n if (\n url.protocol !== \"https:\" ||\n url.port.length > 0 ||\n url.username.length > 0 ||\n url.password.length > 0 ||\n (url.hash.length > 0 && view !== \"activity\") ||\n region === undefined ||\n domain === undefined ||\n repositoryName === undefined ||\n pullRequestId === undefined ||\n domain !== consoleDomainForRegion(region) ||\n queryRegions.length > 1 ||\n (queryRegions.length === 1 && queryRegions[0] !== region)\n ) return null\n return {\n region: AwsRegion.make(region),\n repositoryName: RepositoryName.make(repositoryName),\n pullRequestId: PullRequestId.make(pullRequestId)\n }\n}\n\n/**\n * Decodes a shared AWS Console PR link into provider coordinates.\n *\n * The URL does not identify an AWS account. Callers must resolve the locator\n * within their authenticated workspace and reject ambiguous matches.\n */\nexport const CodeCommitPullRequestUrl = Schema.String.check(\n Schema.isTrimmed(),\n Schema.isNonEmpty(),\n Schema.isMaxLength(2_048)\n).pipe(\n Schema.decodeTo(CodeCommitPullRequestLocator, {\n decode: SchemaGetter.transformOrFail((input, options) => {\n const locator = parseCodeCommitPullRequestUrl(input)\n return locator === null\n ? Effect.fail(\n new SchemaIssue.InvalidValue({ expected: \"an AWS CodeCommit pull-request console URL\" }, input, options)\n )\n : Effect.succeed(locator)\n }),\n encode: SchemaGetter.transform(({ pullRequestId, region, repositoryName }) =>\n codecommitConsoleUrl(region, repositoryName, pullRequestId)\n )\n })\n)\n\n/**\n * Code sandbox instance for a pull request.\n *\n * @category Domain\n */\nexport class Sandbox extends Schema.Class<Sandbox>(\"Sandbox\")({\n id: SandboxId,\n pullRequestId: PullRequestId,\n awsAccountId: Schema.String,\n repositoryName: RepositoryName,\n region: AwsRegion,\n sourceBranch: Schema.String,\n containerId: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Number),\n workspacePath: Schema.String,\n status: SandboxStatus,\n error: Schema.optional(Schema.String),\n createdAt: Schema.Date,\n lastActivityAt: Schema.Date\n}) {}\n\n/**\n * Comment on a pull request.\n *\n * @category Domain\n */\nexport class PRComment extends Schema.Class<PRComment>(\"PRComment\")({\n id: CommentId,\n content: Schema.String,\n author: Schema.String,\n creationDate: Schema.Date,\n inReplyTo: Schema.optional(CommentId),\n deleted: Schema.Boolean,\n filePath: Schema.optional(Schema.String),\n lineNumber: Schema.optional(Schema.Number)\n}) {}\n\n/**\n * Recursive comment thread (root comment + nested replies).\n *\n * @category Domain\n */\nexport interface CommentThread {\n readonly root: PRComment\n readonly replies: ReadonlyArray<CommentThread>\n}\n\n/** Provider-relative side of a pull-request file position. */\nexport const RelativeFileVersion = Schema.Literals([\"BEFORE\", \"AFTER\"])\nexport type RelativeFileVersion = typeof RelativeFileVersion.Type\n\n/**\n * Comments grouped by file location in a pull request.\n *\n * @category Domain\n */\nexport interface PRCommentLocation {\n readonly filePath?: string\n readonly beforeCommitId?: string\n readonly afterCommitId?: string\n readonly relativeFileVersion?: RelativeFileVersion\n readonly comments: ReadonlyArray<CommentThread>\n}\n\n// ---------------------------------------------------------------------------\n// JSON-safe comment schemas (for HTTP API wire format)\n// ---------------------------------------------------------------------------\n\nconst PRCommentJson = Schema.Struct({\n id: Schema.String,\n content: Schema.String,\n author: Schema.String,\n creationDate: Schema.String,\n inReplyTo: Schema.optional(Schema.String),\n deleted: Schema.Boolean,\n filePath: Schema.optional(Schema.String),\n lineNumber: Schema.optional(Schema.Number)\n})\n\nexport interface CommentThreadJsonEncoded {\n readonly root: typeof PRCommentJson.Type\n readonly replies: ReadonlyArray<CommentThreadJsonEncoded>\n}\n\nconst CommentThreadJson: Schema.Codec<CommentThreadJsonEncoded> = Schema.Struct({\n root: PRCommentJson,\n replies: Schema.Array(Schema.suspend((): Schema.Codec<CommentThreadJsonEncoded> => CommentThreadJson))\n})\n\n/**\n * JSON-safe schema for comment locations (HTTP wire format).\n * Dates are ISO strings, no branded types.\n *\n * @category Domain\n */\nexport const PRCommentLocationJson = Schema.Struct({\n filePath: Schema.optional(Schema.String),\n beforeCommitId: Schema.optional(Schema.String),\n afterCommitId: Schema.optional(Schema.String),\n relativeFileVersion: Schema.optional(RelativeFileVersion),\n comments: Schema.Array(CommentThreadJson)\n})\n\n// NOTE: replies of deleted root comments are omitted — matches UI behavior\n// (deleted comments hide their subtree).\nconst serializeThread = (t: CommentThread): CommentThreadJsonEncoded => ({\n root: {\n id: t.root.id,\n content: t.root.content,\n author: t.root.author,\n creationDate: t.root.creationDate.toISOString(),\n ...((t.root.inReplyTo != null) && { inReplyTo: t.root.inReplyTo }),\n deleted: t.root.deleted,\n ...((t.root.filePath != null) && { filePath: t.root.filePath }),\n ...((t.root.lineNumber != null) && { lineNumber: t.root.lineNumber })\n },\n replies: t.root.deleted ? [] : t.replies.map(serializeThread)\n})\n\n/**\n * Encode PRCommentLocations to JSON-safe format for HTTP responses.\n *\n * @category Domain\n */\nexport const encodeCommentLocations = (\n locations: ReadonlyArray<PRCommentLocation>\n): ReadonlyArray<typeof PRCommentLocationJson.Type> =>\n locations.map((loc) => ({\n ...((loc.filePath != null) && { filePath: loc.filePath }),\n ...((loc.beforeCommitId != null) && { beforeCommitId: loc.beforeCommitId }),\n ...((loc.afterCommitId != null) && { afterCommitId: loc.afterCommitId }),\n ...((loc.relativeFileVersion != null) && { relativeFileVersion: loc.relativeFileVersion }),\n comments: loc.comments.map(serializeThread)\n }))\n\n// ---------------------------------------------------------------------------\n// Persistent Notification Types\n// ---------------------------------------------------------------------------\n\nexport const PersistentNotificationType = Schema.Literals([\n \"new_comment\",\n \"comment_edited\",\n \"comment_deleted\",\n \"approval_changed\",\n \"approval_requested\",\n \"review_reminder\",\n \"merge_changed\",\n \"title_changed\",\n \"description_changed\",\n \"pr_merged\",\n \"pr_closed\",\n \"pr_reopened\"\n])\nexport type PersistentNotificationType = typeof PersistentNotificationType.Type\n\nexport class PersistentNotification extends Schema.Class<PersistentNotification>(\"PersistentNotification\")({\n id: Schema.Number,\n pullRequestId: PullRequestId,\n awsAccountId: Schema.String,\n type: PersistentNotificationType,\n message: Schema.String,\n createdAt: Schema.Date,\n read: Schema.Boolean\n}) {}\n\nexport type PRSyncStatus = Data.TaggedEnum<{\n readonly Cached: { readonly fetchedAt: Date }\n readonly Syncing: { readonly fetchedAt: Date }\n readonly UpToDate: { readonly fetchedAt: Date }\n readonly Failed: { readonly fetchedAt: Date; readonly error: string }\n}>\nexport const PRSyncStatus = Data.taggedEnum<PRSyncStatus>()\n\n// ---------------------------------------------------------------------------\n// State Models\n// ---------------------------------------------------------------------------\n\n/**\n * Notification item with timestamp.\n *\n * @category Domain\n */\nexport class NotificationItem extends Schema.Class<NotificationItem>(\"NotificationItem\")({\n type: NotificationType,\n title: Schema.String,\n message: Schema.String,\n timestamp: Schema.Date,\n profile: Schema.optionalKey(Schema.String)\n}) {}\n\n/**\n * Notification state container.\n *\n * @category Domain\n */\nexport interface NotificationsState {\n readonly items: ReadonlyArray<NotificationItem>\n}\n\n/**\n * Account configuration in app state.\n *\n * @category Domain\n */\nexport interface AccountState {\n readonly profile: AwsProfileName\n readonly region: AwsRegion\n readonly enabled: boolean\n}\n\n/** Account-region scope whose pull-request list completed in the latest refresh. */\nexport interface PullRequestRefreshScope {\n readonly profile: AwsProfileName\n readonly region: AwsRegion\n readonly awsAccountId: string\n}\n\n/**\n * Application state.\n *\n * @category Domain\n */\nexport interface AppState {\n readonly pullRequests: ReadonlyArray<PullRequest>\n readonly accounts: ReadonlyArray<AccountState>\n readonly status: AppStatus\n readonly statusDetail?: string | undefined\n readonly error?: string | undefined\n readonly lastUpdated?: Date\n readonly currentUser?: string\n readonly pendingReviewCount?: number\n /** Monotonic sequence incremented when a list refresh starts. */\n readonly refreshGeneration?: number\n readonly successfulRefreshScopes?: ReadonlyArray<PullRequestRefreshScope>\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-CwJFpaho.js";import{l as n,o as r,r as i}from"./hooks-K-sIfGqH.js";import{a,t as o}from"./lib-6h955hh9.js";import{t as s}from"./jsx-runtime-NZYk81nU.js";import{d as c,g as l,r as u,v as d}from"./Dialog-DSwimdwG-BeHnBpPp.js";import{p as f}from"./index-BVikncBH.js";import{n as p,o as m}from"./patterns-DAeEdyxU.js";import{n as h,t as g}from"./primitives-DYGtIZqB-r-Glkv2i.js";import{Jr as _,ja as v,nr as y,on as b}from"./agent-api-CUWP1qs8.js";import{i as x,o as S}from"./releaseRoutes-h4FVwFvJ.js";import{PortfolioOverviewView as C}from"./PortfolioOverview-BacOXO-c.js";import{n as w,r as T}from"./workspaceEntityRoutes-BJ-SC0Jd.js";import{a as E}from"./presentWorkspaceItems-BY8bmqjF.js";import{n as ee,t as te}from"./useWorkspaceItems-6KWfmFtx.js";import{n as ne,t as re}from"./workspaceScrollCapture-CwBIBHg8.js";import{t as D}from"./authorizedShareTransport-kkT3Jf6q.js";import{n as ie}from"./ReleaseWorkset-MV3I0HCi.js";var O=e(t(),1),k={page:`_page_wg828_1`,hero:`_hero_wg828_2`,filters:`_filters_wg828_3`,items:`_items_wg828_4`,item:`_item_wg828_4`,itemLink:`_itemLink_wg828_6`,meta:`_meta_wg828_7`,selection:`_selection_wg828_8`,membershipChoices:`_membershipChoices_wg828_54`,shareLink:`_shareLink_wg828_55`,resultHeading:`_resultHeading_wg828_60`,selectionHeader:`_selectionHeader_wg828_80`,selectionActions:`_selectionActions_wg828_81`,owners:`_owners_wg828_153`,ownerGroup:`_ownerGroup_wg828_157`,ownerLimit:`_ownerLimit_wg828_163`,shareForm:`_shareForm_wg828_181`,shareResult:`_shareResult_wg828_182`,search:`_search_wg828_242`},A=s(),j=e=>e===`hour`||e===`week`?e:`day`,M=(e,t)=>{let n=new Map;n.set(e,{displayName:`You`,personId:e});for(let e of t)n.set(e.personId,{displayName:e.displayName,personId:e.personId});return[...n.values()]},N=({currentPersonId:e,entityId:t,grantees:n,transport:r=D,workspaceId:i})=>{let a=(0,O.useMemo)(()=>M(e,n),[e,n]),[s,l]=(0,O.useState)(a[0]?.personId??e),[d,f]=(0,O.useState)(`day`),[p,m]=(0,O.useState)({_tag:`idle`}),g=(0,O.useRef)(null),v=(0,O.useRef)(null),y=(0,O.useRef)(null);(0,O.useEffect)(()=>()=>v.current?.abort(),[]),(0,O.useEffect)(()=>{(p._tag===`ready`||p._tag===`revoked`)&&y.current?.focus()},[p._tag]);let x=e=>{e.preventDefault(),v.current?.abort();let n=new AbortController;v.current=n,m({_tag:`creating`});let i=g.current;(i!==null&&i.entityId===t&&i.granteePersonId===s&&i.lifetime===d?Promise.resolve(i):r.prepareCreate({entityId:t,granteePersonId:s,lifetime:d}).then(e=>(g.current=e,e))).then(e=>r.create(e,n.signal)).then(e=>{if(n.signal.aborted)return;let t=g.current;if(t===null||e.shareId!==t.shareId||e.entityId!==t.entityId||e.granteePersonId!==t.granteePersonId){m({_tag:`failed`});return}if(e.revokedAt!==null){m({_tag:`revoked`});return}m({_tag:`ready`,shareId:e.shareId,expiresAt:_(e.expiresAt)})},()=>{n.signal.aborted||m({_tag:`failed`})})},S=(e,t)=>{v.current?.abort();let n=new AbortController;v.current=n,m({_tag:`revoking`,shareId:e,expiresAt:t}),r.revoke(i,e,n.signal).then(()=>{n.signal.aborted||m({_tag:`revoked`})},()=>{n.signal.aborted||m({_tag:`ready`,shareId:e,expiresAt:t})})},C=e=>{g.current=null,l(b.make(e))},w=e=>{g.current=null,f(j(e))},T=()=>{g.current=null,m({_tag:`idle`})};if(p._tag===`ready`||p._tag===`revoking`){let e=`/shares/${i}/${p.shareId}`;return(0,A.jsxs)(`section`,{"aria-label":`Authorized share`,"aria-live":`polite`,className:k.shareResult,ref:y,role:`status`,tabIndex:-1,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(h,{as:`h3`,variant:`body-large`,children:`Authorized link ready`}),(0,A.jsxs)(h,{tone:`secondary`,children:[`Only the selected person can open this exact item. Expires `,p.expiresAt,`.`]})]}),(0,A.jsx)(o,{to:e,children:e}),(0,A.jsx)(u,{disabled:p._tag===`revoking`,onClick:()=>S(p.shareId,p.expiresAt),children:p._tag===`revoking`?`Revoking…`:`Revoke link`})]})}return p._tag===`revoked`?(0,A.jsxs)(`section`,{"aria-label":`Authorized share`,"aria-live":`polite`,className:k.shareResult,ref:y,role:`status`,tabIndex:-1,children:[(0,A.jsx)(c,{label:`Revoked`,size:`compact`,tone:`neutral`}),(0,A.jsx)(h,{tone:`secondary`,children:`This link no longer resolves.`}),(0,A.jsx)(u,{onClick:T,children:`Create another`})]}):(0,A.jsxs)(`form`,{className:k.shareForm,onSubmit:x,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(h,{as:`h3`,variant:`body-large`,children:`Share this exact item`}),(0,A.jsx)(h,{tone:`secondary`,children:`Authenticated access only. Related releases and relationships stay private.`})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Person`}),(0,A.jsx)(`select`,{disabled:p._tag===`creating`,onChange:e=>C(e.currentTarget.value),value:s,children:a.map(e=>(0,A.jsx)(`option`,{value:e.personId,children:e.displayName},e.personId))})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Expires`}),(0,A.jsxs)(`select`,{disabled:p._tag===`creating`,onChange:e=>w(e.currentTarget.value),value:d,children:[(0,A.jsx)(`option`,{value:`hour`,children:`In 1 hour`}),(0,A.jsx)(`option`,{value:`day`,children:`In 1 day`}),(0,A.jsx)(`option`,{value:`week`,children:`In 7 days`})]})]}),(0,A.jsx)(u,{disabled:p._tag===`creating`,type:`submit`,children:p._tag===`creating`?`Creating…`:`Create authorized link`}),p._tag===`failed`?(0,A.jsx)(h,{role:`alert`,tone:`secondary`,children:`Could not create the link. Check the person and try again.`}):null]})},P=[`issue`,`pull-request`,`page`,`pipeline-execution`,`deployment`,`time-entry`],F=[`jira`,`codecommit`,`confluence`,`codepipeline`,`clockify`],I=new Intl.DateTimeFormat(`en-GB`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`UTC`}),L=e=>I.format(Date.parse(e)),R=(e,t)=>({hash:e.hash,pathname:e.pathname,search:t.size===0?``:`?${t.toString()}`}),z=(e,t,n)=>{let r=new URLSearchParams(t);return r.set(`object`,n),{hash:`#item-details`,pathname:e,search:`?${r.toString()}`}},B=e=>P.find(t=>t===e)??`all`,V=e=>e===`active`||e===`done`||e===`failed`?e:`all`,H=e=>{let t=y(b)(e);return v(t)?t.value:`all`},ae=e=>({owner:H(e.get(`owner`)),query:e.get(`q`)?.trim()??``,service:F.find(t=>t===e.get(`service`))??`all`,status:V(e.get(`status`)),type:B(e.get(`type`))}),U=(e,t)=>{let n=t.query.toLocaleLowerCase(`en-US`);return e.filter(e=>(n.length===0||`${e.key} ${e.title} ${e.status}`.toLocaleLowerCase(`en-US`).includes(n))&&(t.service===`all`||e.service===t.service)&&(t.owner===`all`||e.owners.some(({id:e})=>e===t.owner))&&(t.status===`all`||e.statusGroup===t.status)&&(t.type===`all`||e.kind===t.type))},W=({item:e})=>{let[t,n]=(0,O.useState)(!1);return e.owners.length===0?(0,A.jsx)(`span`,{children:`Unassigned`}):(0,A.jsxs)(`span`,{className:k.ownerGroup,children:[(0,A.jsx)(m,{"aria-label":`${e.key} collaborators${e.ownersTruncated?`, more collaborators not shown`:``}`,className:k.owners,expanded:t,limit:2,onExpandedChange:n,people:e.owners,size:`compact`}),e.ownersTruncated?(0,A.jsx)(`span`,{className:k.ownerLimit,children:`20+ people · More not shown`}):null]})},G=(e,t)=>t===null?null:e.find(e=>e.entityId===t)??null,K=e=>e.split(`-`).map(e=>`${e.charAt(0).toLocaleUpperCase(`en-US`)}${e.slice(1)}`).join(` `),q=e=>e.releaseIds.length===0?`This current object is not linked to a release yet. Its provider-specific full view will remain available here when that integration is connected.`:e.routableReleaseIds.length===0?`This object is linked to ${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} release${e.releaseIds.length===1?``:`s`} outside the current portfolio. Its membership remains visible without routing to an unavailable release page.`:e.releaseIds.length===1?`This object is linked to one release and can be opened in its complete delivery context.`:`This object is linked to ${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} releases. Choose the exact release context to avoid silently substituting another delivery trace.`,J=({shareTransport:e,transport:t=te}={})=>{let s=n(),m=f(),_=i(),v=r(),[y]=a(),b=s.controller.state._tag===`ready`?s.controller.state.portfolio:null,D=(0,O.useMemo)(()=>new Map(b?.releases.map(e=>[e.id,e])??[]),[b]),j=(0,O.useMemo)(()=>new Set(b?.releases.map(({id:e})=>e)??[]),[b]),M=s.controller.state._tag===`ready`?s.controller.state.portfolio.generatedAt:`pending`,I=ie(m.state),B=ae(y),V=ee(s.workspaceId,j,B,M,I,m.invalidateSession,t),H=e=>{v(R(_,e),{replace:!0})},U=(e,t)=>{let n=new URLSearchParams(y);t.length===0||t===`all`?n.delete(e===`query`?`q`:e):n.set(e===`query`?`q`:e,t),H(n)},J=s.controller.state._tag===`ready`?I===null?{_tag:`session`,reason:m.state._tag===`authenticated`?`checking`:m.state._tag}:null:s.controller.state;if(J?._tag===`loading`)return(0,A.jsxs)(`section`,{"aria-label":`Loading delivery items`,className:k.page,children:[(0,A.jsx)(d,{height:`8rem`,variant:`block`}),(0,A.jsx)(d,{height:`20rem`,variant:`block`})]});if(J!==null)return(0,A.jsx)(C,{onPreviewRelease:()=>void 0,onRetry:s.controller.onRetry,state:J});if(V.state._tag===`idle`||V.state._tag===`loading`)return(0,A.jsxs)(`section`,{"aria-label":`Loading delivery items`,className:k.page,children:[(0,A.jsx)(d,{height:`8rem`,variant:`block`}),(0,A.jsx)(d,{height:`20rem`,variant:`block`})]});if(V.state._tag===`failed`)return(0,A.jsx)(l,{action:(0,A.jsx)(u,{onClick:V.retry,children:`Try again`}),description:`Control Center could not read the normalized delivery index. Saved source facts remain unchanged.`,title:`Items unavailable`,tone:`caution`});let Y=V.state.items,oe=B.owner===`all`||V.state.ownerOptions.some(({personId:e})=>e===B.owner),se=B.owner===`all`?void 0:V.state.items.flatMap(({owners:e})=>e).find(({id:e})=>e===B.owner),X=y.get(`object`),Z=G(V.state.items,X),Q=m.state._tag===`authenticated`&&m.state.session.permission===`workspace-owner`&&m.state.session.actor._tag===`human`?m.state.session.actor.personId:null,$=()=>{let e=new URLSearchParams(y);e.delete(`object`),v({hash:`#results`,pathname:_.pathname,search:e.size===0?``:`?${e.toString()}`},{replace:!0})};return(0,A.jsxs)(`article`,{className:k.page,children:[(0,A.jsxs)(`header`,{className:k.hero,children:[(0,A.jsx)(h,{as:`p`,tone:`secondary`,variant:`label`,children:`Workspace items`}),(0,A.jsx)(h,{as:`h1`,variant:`verdict`,children:`Find release work.`}),(0,A.jsx)(h,{tone:`secondary`,variant:`body-large`,children:`One quiet index across tickets, pull requests, docs, pipelines, deployments, and time.`})]}),(0,A.jsxs)(`section`,{"aria-label":`Item filters`,className:k.filters,children:[(0,A.jsxs)(`label`,{className:k.search,children:[(0,A.jsx)(`span`,{children:`Search`}),(0,A.jsx)(`input`,{maxLength:200,onChange:e=>U(`query`,e.currentTarget.value),placeholder:`Key, title, or status`,type:`search`,value:B.query})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Service`}),(0,A.jsxs)(`select`,{onChange:e=>U(`service`,e.currentTarget.value),value:B.service,children:[(0,A.jsx)(`option`,{value:`all`,children:`All services`}),F.map(e=>(0,A.jsx)(`option`,{value:e,children:e},e))]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Owner`}),(0,A.jsxs)(`select`,{onChange:e=>U(`owner`,e.currentTarget.value),value:B.owner,children:[(0,A.jsx)(`option`,{value:`all`,children:`Anyone`}),B.owner!==`all`&&!oe?(0,A.jsx)(`option`,{value:B.owner,children:se?.name??`Owner …${B.owner.slice(-6)}`}):null,V.state.ownerOptions.map(e=>(0,A.jsx)(`option`,{value:e.personId,children:e.displayName},e.personId)),V.state.ownerOptionsTruncated?(0,A.jsx)(`option`,{disabled:!0,children:`More owners not shown`}):null]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Type`}),(0,A.jsxs)(`select`,{onChange:e=>U(`type`,e.currentTarget.value),value:B.type,children:[(0,A.jsx)(`option`,{value:`all`,children:`All types`}),P.map(e=>(0,A.jsx)(`option`,{value:e,children:K(e)},e))]})]}),(0,A.jsxs)(`label`,{children:[(0,A.jsx)(`span`,{children:`Status`}),(0,A.jsxs)(`select`,{onChange:e=>U(`status`,e.currentTarget.value),value:B.status,children:[(0,A.jsx)(`option`,{value:`all`,children:`Any status`}),(0,A.jsx)(`option`,{value:`active`,children:`Active`}),(0,A.jsx)(`option`,{value:`done`,children:`Done`}),(0,A.jsx)(`option`,{value:`failed`,children:`Needs attention`})]})]})]}),X===null?null:Z===null?(0,A.jsx)(`div`,{id:`item-details`,children:(0,A.jsx)(l,{action:(0,A.jsx)(u,{onClick:$,children:`Back to items`}),description:`This item is not present in the current bounded workspace index. It may have been deleted or fall outside this result prefix.`,title:`Item unavailable`,tone:`caution`})}):(0,A.jsxs)(g,{as:`section`,className:k.selection,id:`item-details`,padding:`spacious`,tone:`secondary`,children:[(0,A.jsxs)(`div`,{className:k.selectionHeader,children:[(0,A.jsx)(p,{service:Z.service,size:`compact`}),(0,A.jsx)(c,{label:Z.status,size:`compact`,tone:Z.tone})]}),(0,A.jsxs)(h,{as:`p`,tone:`secondary`,variant:`label`,children:[Z.key,` · `,K(Z.kind)]}),(0,A.jsx)(h,{as:`h2`,variant:`section-title`,children:Z.title}),(0,A.jsx)(h,{tone:`secondary`,variant:`body-large`,children:q(Z)}),(0,A.jsx)(W,{item:Z}),Q===null?null:(0,A.jsx)(N,{currentPersonId:Q,entityId:Z.entityId,grantees:V.state.ownerOptions,workspaceId:s.workspaceId,...e===void 0?{}:{transport:e}},Z.entityId),(0,A.jsxs)(`div`,{className:k.selectionActions,children:[(0,A.jsx)(`div`,{className:k.membershipChoices,children:Z.routableReleaseIds.map(e=>{let t=D.get(e);return(0,A.jsxs)(o,{state:x(s.workspaceId,e,S(_)),to:E(s.workspaceId,e,Z.entityId),children:[`Open `,t===void 0?`release ${e.slice(-6)}`:t.relay.codename,t===void 0?null:(0,A.jsx)(`span`,{children:t.version})]},e)})}),(0,A.jsx)(u,{onClick:$,children:`Back to items`})]})]}),(0,A.jsxs)(`div`,{className:k.resultHeading,id:`results`,children:[(0,A.jsxs)(h,{as:`h2`,variant:`section-title`,children:[V.state.matchedCount,` of `,V.state.totalCount,` workspace items`]}),(0,A.jsx)(c,{label:V.state.refreshing?`Updating results`:V.state.truncated?`Bounded workspace result`:`Workspace scope`,size:`compact`,tone:V.state.truncated&&!V.state.refreshing?`caution`:`neutral`})]}),Y.length===0?(0,A.jsx)(l,{action:(0,A.jsx)(u,{onClick:()=>H(new URLSearchParams),children:`Clear filters`}),description:`Try a broader word, owner, service, type, or status. No demo object is substituted.`,title:`No matching items`}):(0,A.jsx)(`div`,{className:k.items,children:Y.map(e=>(0,A.jsxs)(g,{as:`article`,className:k.item,padding:`none`,tone:`secondary`,children:[(0,A.jsx)(p,{service:e.service,size:`compact`}),(0,A.jsxs)(o,{className:k.itemLink,onClick:t=>{ne(t,t.currentTarget.target)&&re(_,e.href)},state:T(_.state,s.workspaceId,e.entityId,w(_)),to:e.href,children:[(0,A.jsx)(`span`,{children:e.key}),(0,A.jsx)(`strong`,{children:e.title})]}),(0,A.jsxs)(`div`,{className:k.meta,children:[(0,A.jsx)(c,{label:e.status,size:`compact`,tone:e.tone}),(0,A.jsx)(`span`,{children:K(e.kind)}),(0,A.jsx)(`span`,{children:e.releaseIds.length===0?`Unlinked`:`${e.releaseIds.length}${e.releaseMembershipsTruncated?`+`:``} release${e.releaseIds.length===1?``:`s`}`}),(0,A.jsx)(W,{item:e}),(0,A.jsx)(`time`,{dateTime:e.freshness,title:`Synchronized ${e.freshness}`,children:L(e.freshness)})]}),Q===null?null:(0,A.jsx)(o,{className:k.shareLink,to:z(_.pathname,y,e.entityId),children:`Share`})]},e.entityId))})]})};export{J as ItemsPage,U as filterWorkspaceItems,L as formatItemFreshness,R as itemsLocationWithSearch,G as selectWorkspaceItem,z as unlinkedItemLocation,q as workspaceItemMembershipDescription};
|
|
2
|
+
//# sourceMappingURL=ItemsPage-Cr3--iJc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ItemsPage-BmWEHinz.js","names":[],"sources":["../../../src/client/items/ItemsPage.module.css","../../../src/client/items/AuthorizedSharePanel.tsx","../../../src/client/items/ItemsPage.tsx"],"sourcesContent":[".page,\n.hero,\n.filters,\n.items,\n.item,\n.itemLink,\n.meta,\n.selection {\n display: grid;\n}\n\n.page {\n gap: var(--rly-space-32);\n}\n\n.hero {\n gap: var(--rly-space-8);\n max-inline-size: 52rem;\n}\n\n.hero > * {\n margin: 0;\n}\n\n.filters {\n grid-template-columns: minmax(16rem, 2fr) repeat(4, minmax(9rem, 1fr));\n gap: var(--rly-space-12);\n align-items: end;\n}\n\n.filters label {\n display: grid;\n gap: var(--rly-space-6);\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.filters input,\n.filters select {\n min-block-size: 3.5rem;\n inline-size: 100%;\n padding-inline: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: inherit;\n}\n\n.filters input:focus-visible,\n.filters select:focus-visible,\n.itemLink:focus-visible,\n.membershipChoices a:focus-visible,\n.shareLink:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n.resultHeading {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--rly-space-12);\n}\n\n.resultHeading h2 {\n margin: 0;\n}\n\n.selection {\n gap: var(--rly-space-12);\n scroll-margin-block-start: var(--rly-space-24);\n}\n\n.selection > * {\n margin: 0;\n}\n\n.selectionHeader,\n.selectionActions,\n.membershipChoices {\n display: flex;\n align-items: center;\n gap: var(--rly-space-12);\n}\n\n.selectionActions {\n justify-content: space-between;\n}\n\n.membershipChoices {\n flex-wrap: wrap;\n}\n\n.membershipChoices a {\n display: grid;\n gap: var(--rly-space-2);\n min-block-size: 3rem;\n padding: var(--rly-space-8) var(--rly-space-12);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.membershipChoices a span {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.items {\n gap: var(--rly-space-8);\n}\n\n.item {\n grid-template-columns: auto minmax(0, 1fr) auto auto;\n align-items: center;\n gap: var(--rly-space-16);\n min-block-size: 5.5rem;\n padding: var(--rly-space-16) var(--rly-space-20);\n}\n\n.itemLink {\n gap: var(--rly-space-2);\n min-inline-size: 0;\n color: inherit;\n text-decoration: none;\n}\n\n.shareLink {\n min-block-size: 2.5rem;\n padding: var(--rly-space-8) var(--rly-space-12);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n color: var(--rly-color-text-1);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.itemLink span,\n.meta {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.owners {\n min-inline-size: max-content;\n}\n\n.ownerGroup {\n display: grid;\n gap: var(--rly-space-4);\n min-inline-size: 0;\n}\n\n.ownerLimit {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.itemLink strong {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.meta {\n grid-auto-flow: column;\n align-items: center;\n gap: var(--rly-space-12);\n}\n\n.shareForm,\n.shareResult {\n display: grid;\n grid-template-columns: minmax(12rem, 1fr) minmax(8rem, auto) minmax(8rem, auto) auto;\n gap: var(--rly-space-12);\n align-items: end;\n padding-block: var(--rly-space-12);\n border-block: 1px solid var(--rly-color-border-2);\n}\n\n.shareForm > div,\n.shareResult > div {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.shareForm h3,\n.shareForm p,\n.shareResult h3,\n.shareResult p {\n margin: 0;\n}\n\n.shareForm label {\n display: grid;\n gap: var(--rly-space-6);\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.shareForm select {\n min-block-size: 3rem;\n padding-inline: var(--rly-space-12);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: inherit;\n}\n\n.shareForm select:focus-visible,\n.shareResult a:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n.shareResult {\n grid-template-columns: minmax(0, 1fr) auto auto;\n}\n\n.shareResult a {\n overflow-wrap: anywhere;\n color: var(--rly-color-text-1);\n}\n\n@media (max-width: 64rem) {\n .filters {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n\n .search {\n grid-column: 1 / -1;\n }\n\n .item {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .meta {\n grid-column: 2;\n grid-auto-flow: row;\n grid-template-columns: repeat(2, minmax(0, max-content));\n }\n\n .shareLink {\n grid-column: 2;\n justify-self: start;\n }\n\n .shareForm,\n .shareResult {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n align-items: end;\n }\n\n .shareForm > div,\n .shareResult > div {\n grid-column: 1 / -1;\n }\n}\n\n@media (max-width: 40rem) {\n .filters {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .search {\n grid-column: auto;\n }\n\n .meta,\n .shareForm,\n .shareResult {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .shareForm > div,\n .shareResult > div {\n grid-column: auto;\n }\n}\n","import { Button, StateLabel, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport { type FormEvent, type ReactElement, useEffect, useMemo, useRef, useState } from \"react\"\nimport { Link } from \"react-router\"\n\nimport type { WorkspaceEntityOwner } from \"../../api/deliveryGraph.js\"\nimport type { EntityId, ShareId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { PersonId } from \"../../domain/identifiers.js\"\nimport {\n browserAuthorizedShareTransport,\n type AuthorizedShareLifetime,\n type AuthorizedShareTransport,\n type CreateAuthorizedShareTransportInput\n} from \"./authorizedShareTransport.js\"\nimport styles from \"./ItemsPage.module.css\"\n\ninterface ShareGrantee {\n readonly displayName: string\n readonly personId: PersonId\n}\n\ntype AuthorizedSharePanelState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"creating\" }\n | { readonly _tag: \"failed\" }\n | { readonly _tag: \"ready\"; readonly shareId: ShareId; readonly expiresAt: string }\n | { readonly _tag: \"revoking\"; readonly shareId: ShareId; readonly expiresAt: string }\n | { readonly _tag: \"revoked\" }\n\nexport interface AuthorizedSharePanelProps {\n readonly currentPersonId: PersonId\n readonly entityId: EntityId\n readonly grantees: ReadonlyArray<WorkspaceEntityOwner>\n readonly transport?: AuthorizedShareTransport\n readonly workspaceId: WorkspaceId\n}\n\nconst shareLifetime = (value: string): AuthorizedShareLifetime => (value === \"hour\" || value === \"week\" ? value : \"day\")\n\nconst shareGrantees = (\n currentPersonId: PersonId,\n grantees: ReadonlyArray<WorkspaceEntityOwner>\n): ReadonlyArray<ShareGrantee> => {\n const byId = new Map<PersonId, ShareGrantee>()\n byId.set(currentPersonId, { displayName: \"You\", personId: currentPersonId })\n for (const grantee of grantees) {\n byId.set(grantee.personId, { displayName: grantee.displayName, personId: grantee.personId })\n }\n return [...byId.values()]\n}\n\n/** Owner-only creation and revocation controls for one exact item share. */\nexport const AuthorizedSharePanel = ({\n currentPersonId,\n entityId,\n grantees,\n transport = browserAuthorizedShareTransport,\n workspaceId\n}: AuthorizedSharePanelProps): ReactElement => {\n const options = useMemo(() => shareGrantees(currentPersonId, grantees), [currentPersonId, grantees])\n const [granteePersonId, setGranteePersonId] = useState<PersonId>(options[0]?.personId ?? currentPersonId)\n const [lifetime, setLifetime] = useState<AuthorizedShareLifetime>(\"day\")\n const [state, setState] = useState<AuthorizedSharePanelState>({ _tag: \"idle\" })\n const createIntent = useRef<CreateAuthorizedShareTransportInput | null>(null)\n const currentRequest = useRef<AbortController | null>(null)\n const statusRegion = useRef<HTMLElement | null>(null)\n\n useEffect(() => () => currentRequest.current?.abort(), [])\n useEffect(() => {\n if (state._tag === \"ready\" || state._tag === \"revoked\") statusRegion.current?.focus()\n }, [state._tag])\n\n const create = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault()\n currentRequest.current?.abort()\n const request = new AbortController()\n currentRequest.current = request\n setState({ _tag: \"creating\" })\n const existingIntent = createIntent.current\n const intent =\n existingIntent !== null &&\n existingIntent.entityId === entityId &&\n existingIntent.granteePersonId === granteePersonId &&\n existingIntent.lifetime === lifetime\n ? Promise.resolve(existingIntent)\n : transport.prepareCreate({ entityId, granteePersonId, lifetime }).then((nextIntent) => {\n createIntent.current = nextIntent\n return nextIntent\n })\n intent\n .then((currentIntent) => transport.create(currentIntent, request.signal))\n .then(\n (share) => {\n if (request.signal.aborted) return\n const currentIntent = createIntent.current\n if (\n currentIntent === null ||\n share.shareId !== currentIntent.shareId ||\n share.entityId !== currentIntent.entityId ||\n share.granteePersonId !== currentIntent.granteePersonId\n ) {\n setState({ _tag: \"failed\" })\n return\n }\n if (share.revokedAt !== null) {\n setState({ _tag: \"revoked\" })\n return\n }\n setState({\n _tag: \"ready\",\n shareId: share.shareId,\n expiresAt: DateTime.formatIso(share.expiresAt)\n })\n },\n () => {\n if (!request.signal.aborted) setState({ _tag: \"failed\" })\n }\n )\n }\n\n const revoke = (shareId: ShareId, expiresAt: string): void => {\n currentRequest.current?.abort()\n const request = new AbortController()\n currentRequest.current = request\n setState({ _tag: \"revoking\", shareId, expiresAt })\n transport.revoke(workspaceId, shareId, request.signal).then(\n () => {\n if (!request.signal.aborted) setState({ _tag: \"revoked\" })\n },\n () => {\n if (!request.signal.aborted) setState({ _tag: \"ready\", shareId, expiresAt })\n }\n )\n }\n\n const selectGrantee = (value: string): void => {\n createIntent.current = null\n setGranteePersonId(PersonId.make(value))\n }\n const selectLifetime = (value: string): void => {\n createIntent.current = null\n setLifetime(shareLifetime(value))\n }\n const createAnother = (): void => {\n createIntent.current = null\n setState({ _tag: \"idle\" })\n }\n\n if (state._tag === \"ready\" || state._tag === \"revoking\") {\n const sharePath = `/shares/${workspaceId}/${state.shareId}`\n return (\n <section\n aria-label=\"Authorized share\"\n aria-live=\"polite\"\n className={styles.shareResult}\n ref={statusRegion}\n role=\"status\"\n tabIndex={-1}\n >\n <div>\n <Text as=\"h3\" variant=\"body-large\">\n Authorized link ready\n </Text>\n <Text tone=\"secondary\">Only the selected person can open this exact item. Expires {state.expiresAt}.</Text>\n </div>\n <Link to={sharePath}>{sharePath}</Link>\n <Button disabled={state._tag === \"revoking\"} onClick={() => revoke(state.shareId, state.expiresAt)}>\n {state._tag === \"revoking\" ? \"Revoking…\" : \"Revoke link\"}\n </Button>\n </section>\n )\n }\n\n if (state._tag === \"revoked\") {\n return (\n <section\n aria-label=\"Authorized share\"\n aria-live=\"polite\"\n className={styles.shareResult}\n ref={statusRegion}\n role=\"status\"\n tabIndex={-1}\n >\n <StateLabel label=\"Revoked\" size=\"compact\" tone=\"neutral\" />\n <Text tone=\"secondary\">This link no longer resolves.</Text>\n <Button onClick={createAnother}>Create another</Button>\n </section>\n )\n }\n\n return (\n <form className={styles.shareForm} onSubmit={create}>\n <div>\n <Text as=\"h3\" variant=\"body-large\">\n Share this exact item\n </Text>\n <Text tone=\"secondary\">Authenticated access only. Related releases and relationships stay private.</Text>\n </div>\n <label>\n <span>Person</span>\n <select\n disabled={state._tag === \"creating\"}\n onChange={(event) => selectGrantee(event.currentTarget.value)}\n value={granteePersonId}\n >\n {options.map((option) => (\n <option key={option.personId} value={option.personId}>\n {option.displayName}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>Expires</span>\n <select\n disabled={state._tag === \"creating\"}\n onChange={(event) => selectLifetime(event.currentTarget.value)}\n value={lifetime}\n >\n <option value=\"hour\">In 1 hour</option>\n <option value=\"day\">In 1 day</option>\n <option value=\"week\">In 7 days</option>\n </select>\n </label>\n <Button disabled={state._tag === \"creating\"} type=\"submit\">\n {state._tag === \"creating\" ? \"Creating…\" : \"Create authorized link\"}\n </Button>\n {state._tag === \"failed\" ? (\n <Text role=\"alert\" tone=\"secondary\">\n Could not create the link. Check the person and try again.\n </Text>\n ) : null}\n </form>\n )\n}\n","import { PeopleStrip, ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Button, Skeleton, StateLabel, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as Option from \"effect/Option\"\nimport * as Schema from \"effect/Schema\"\nimport { type ReactElement, useMemo, useState } from \"react\"\nimport { Link, useLocation, useNavigate, useOutletContext, useSearchParams } from \"react-router\"\n\nimport type { DeliveryEntityKind, DeliveryEntityService } from \"../../domain/deliveryGraph.js\"\nimport { PersonId } from \"../../domain/identifiers.js\"\nimport { useBrowserSession } from \"../BrowserSession.js\"\nimport { PortfolioOverviewView, type PortfolioOverviewState } from \"../portfolio/PortfolioOverview.js\"\nimport type { WorkspaceReleaseOutletContext } from \"../releases/WorkspaceReleaseLayout.js\"\nimport { makeReleaseRouteState, releaseOriginFromLocation } from \"../releases/releaseRoutes.js\"\nimport { releaseWorksetSessionKey } from \"../releases/ReleaseWorkset.js\"\nimport { rememberWorkspaceScrollPosition, shouldRememberWorkspaceScrollPosition } from \"../workspaceScrollCapture.js\"\nimport {\n type WorkspaceItemPresentation,\n type WorkspaceItemStatus,\n workspaceItemReleaseHref\n} from \"./presentWorkspaceItems.js\"\nimport { browserWorkspaceItemsTransport, useWorkspaceItems, type WorkspaceItemsTransport } from \"./useWorkspaceItems.js\"\nimport { AuthorizedSharePanel } from \"./AuthorizedSharePanel.js\"\nimport type { AuthorizedShareTransport } from \"./authorizedShareTransport.js\"\nimport styles from \"./ItemsPage.module.css\"\nimport { entityOriginFromLocation, makeWorkspaceEntityRouteState } from \"./workspaceEntityRoutes.js\"\n\ninterface ItemFilters {\n readonly query: string\n readonly owner: PersonId | \"all\"\n readonly service: DeliveryEntityService | \"all\"\n readonly status: WorkspaceItemStatus | \"all\"\n readonly type: DeliveryEntityKind | \"all\"\n}\n\nexport interface ItemsPageProps {\n readonly shareTransport?: AuthorizedShareTransport\n readonly transport?: WorkspaceItemsTransport\n}\n\nconst entityKinds: ReadonlyArray<DeliveryEntityKind> = [\n \"issue\",\n \"pull-request\",\n \"page\",\n \"pipeline-execution\",\n \"deployment\",\n \"time-entry\"\n]\nconst services: ReadonlyArray<DeliveryEntityService> = [\"jira\", \"codecommit\", \"confluence\", \"codepipeline\", \"clockify\"]\nconst freshnessFormatter = new Intl.DateTimeFormat(\"en-GB\", {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n timeZone: \"UTC\"\n})\n\nexport const formatItemFreshness = (freshness: string): string => freshnessFormatter.format(Date.parse(freshness))\n\nexport const itemsLocationWithSearch = (location: Pick<Location, \"hash\" | \"pathname\">, params: URLSearchParams) => ({\n hash: location.hash,\n pathname: location.pathname,\n search: params.size === 0 ? \"\" : `?${params.toString()}`\n})\n\nexport const unlinkedItemLocation = (pathname: string, params: URLSearchParams, entityId: string) => {\n const next = new URLSearchParams(params)\n next.set(\"object\", entityId)\n return {\n hash: \"#item-details\",\n pathname,\n search: `?${next.toString()}`\n }\n}\n\nconst entityKind = (value: string | null): DeliveryEntityKind | \"all\" =>\n entityKinds.find((candidate) => candidate === value) ?? \"all\"\n\nconst itemStatus = (value: string | null): WorkspaceItemStatus | \"all\" =>\n value === \"active\" || value === \"done\" || value === \"failed\" ? value : \"all\"\n\nconst itemOwner = (value: string | null): PersonId | \"all\" => {\n const decoded = Schema.decodeUnknownOption(PersonId)(value)\n return Option.isSome(decoded) ? decoded.value : \"all\"\n}\n\nconst filtersFrom = (params: URLSearchParams): ItemFilters => ({\n owner: itemOwner(params.get(\"owner\")),\n query: params.get(\"q\")?.trim() ?? \"\",\n service: services.find((candidate) => candidate === params.get(\"service\")) ?? \"all\",\n status: itemStatus(params.get(\"status\")),\n type: entityKind(params.get(\"type\"))\n})\n\nexport const filterWorkspaceItems = (\n items: ReadonlyArray<WorkspaceItemPresentation>,\n filters: ItemFilters\n): ReadonlyArray<WorkspaceItemPresentation> => {\n const query = filters.query.toLocaleLowerCase(\"en-US\")\n return items.filter(\n (item) =>\n (query.length === 0 || `${item.key} ${item.title} ${item.status}`.toLocaleLowerCase(\"en-US\").includes(query)) &&\n (filters.service === \"all\" || item.service === filters.service) &&\n (filters.owner === \"all\" || item.owners.some(({ id }) => id === filters.owner)) &&\n (filters.status === \"all\" || item.statusGroup === filters.status) &&\n (filters.type === \"all\" || item.kind === filters.type)\n )\n}\n\nconst ItemOwners = ({ item }: { readonly item: WorkspaceItemPresentation }): ReactElement => {\n const [expanded, setExpanded] = useState(false)\n if (item.owners.length === 0) return <span>Unassigned</span>\n return (\n <span className={styles.ownerGroup}>\n <PeopleStrip\n aria-label={`${item.key} collaborators${item.ownersTruncated ? \", more collaborators not shown\" : \"\"}`}\n className={styles.owners}\n expanded={expanded}\n limit={2}\n onExpandedChange={setExpanded}\n people={item.owners}\n size=\"compact\"\n />\n {item.ownersTruncated ? <span className={styles.ownerLimit}>20+ people · More not shown</span> : null}\n </span>\n )\n}\n\nexport const selectWorkspaceItem = (\n items: ReadonlyArray<WorkspaceItemPresentation>,\n entityId: string | null\n): WorkspaceItemPresentation | null =>\n entityId === null ? null : (items.find((item) => item.entityId === entityId) ?? null)\n\nconst labelForKind = (kind: DeliveryEntityKind): string =>\n kind\n .split(\"-\")\n .map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`)\n .join(\" \")\n\nexport const workspaceItemMembershipDescription = (item: WorkspaceItemPresentation): string => {\n if (item.releaseIds.length === 0) {\n return \"This current object is not linked to a release yet. Its provider-specific full view will remain available here when that integration is connected.\"\n }\n if (item.routableReleaseIds.length === 0) {\n return `This object is linked to ${item.releaseIds.length}${item.releaseMembershipsTruncated ? \"+\" : \"\"} release${item.releaseIds.length === 1 ? \"\" : \"s\"} outside the current portfolio. Its membership remains visible without routing to an unavailable release page.`\n }\n if (item.releaseIds.length === 1) {\n return \"This object is linked to one release and can be opened in its complete delivery context.\"\n }\n return `This object is linked to ${item.releaseIds.length}${item.releaseMembershipsTruncated ? \"+\" : \"\"} releases. Choose the exact release context to avoid silently substituting another delivery trace.`\n}\n\n/** Compact workspace-wide index of normalized delivery objects. */\nexport const ItemsPage = ({\n shareTransport,\n transport = browserWorkspaceItemsTransport\n}: ItemsPageProps = {}): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext>()\n const browserSession = useBrowserSession()\n const location = useLocation()\n const navigate = useNavigate()\n const [searchParams] = useSearchParams()\n const portfolio = context.controller.state._tag === \"ready\" ? context.controller.state.portfolio : null\n const releaseById = useMemo(\n () => new Map(portfolio?.releases.map((release) => [release.id, release]) ?? []),\n [portfolio]\n )\n const routableReleaseIds = useMemo(() => new Set(portfolio?.releases.map(({ id }) => id) ?? []), [portfolio])\n const refreshKey =\n context.controller.state._tag === \"ready\" ? context.controller.state.portfolio.generatedAt : \"pending\"\n const sessionKey = releaseWorksetSessionKey(browserSession.state)\n const filters = filtersFrom(searchParams)\n const controller = useWorkspaceItems(\n context.workspaceId,\n routableReleaseIds,\n filters,\n refreshKey,\n sessionKey,\n browserSession.invalidateSession,\n transport\n )\n const replaceSearch = (next: URLSearchParams): void => {\n navigate(itemsLocationWithSearch(location, next), { replace: true })\n }\n const update = (key: keyof ItemFilters, value: string): void => {\n const next = new URLSearchParams(searchParams)\n if (value.length === 0 || value === \"all\") next.delete(key === \"query\" ? \"q\" : key)\n else next.set(key === \"query\" ? \"q\" : key, value)\n replaceSearch(next)\n }\n\n const portfolioBoundary: PortfolioOverviewState | null =\n context.controller.state._tag !== \"ready\"\n ? context.controller.state\n : sessionKey === null\n ? {\n _tag: \"session\",\n reason: browserSession.state._tag === \"authenticated\" ? \"checking\" : browserSession.state._tag\n }\n : null\n if (portfolioBoundary?._tag === \"loading\") {\n return (\n <section aria-label=\"Loading delivery items\" className={styles.page}>\n <Skeleton height=\"8rem\" variant=\"block\" />\n <Skeleton height=\"20rem\" variant=\"block\" />\n </section>\n )\n }\n if (portfolioBoundary !== null) {\n return (\n <PortfolioOverviewView\n onPreviewRelease={() => undefined}\n onRetry={context.controller.onRetry}\n state={portfolioBoundary}\n />\n )\n }\n if (controller.state._tag === \"idle\" || controller.state._tag === \"loading\") {\n return (\n <section aria-label=\"Loading delivery items\" className={styles.page}>\n <Skeleton height=\"8rem\" variant=\"block\" />\n <Skeleton height=\"20rem\" variant=\"block\" />\n </section>\n )\n }\n if (controller.state._tag === \"failed\") {\n return (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"Control Center could not read the normalized delivery index. Saved source facts remain unchanged.\"\n title=\"Items unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n const visibleItems = controller.state.items\n const hasSelectedOwnerOption =\n filters.owner === \"all\" || controller.state.ownerOptions.some(({ personId }) => personId === filters.owner)\n const selectedOwner =\n filters.owner === \"all\"\n ? undefined\n : controller.state.items.flatMap(({ owners }) => owners).find(({ id }) => id === filters.owner)\n const selectedEntityId = searchParams.get(\"object\")\n const selectedItem = selectWorkspaceItem(controller.state.items, selectedEntityId)\n const shareOwnerPersonId =\n browserSession.state._tag === \"authenticated\" &&\n browserSession.state.session.permission === \"workspace-owner\" &&\n browserSession.state.session.actor._tag === \"human\"\n ? browserSession.state.session.actor.personId\n : null\n const clearSelection = (): void => {\n const next = new URLSearchParams(searchParams)\n next.delete(\"object\")\n navigate(\n {\n hash: \"#results\",\n pathname: location.pathname,\n search: next.size === 0 ? \"\" : `?${next.toString()}`\n },\n { replace: true }\n )\n }\n return (\n <article className={styles.page}>\n <header className={styles.hero}>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n Workspace items\n </Text>\n <Text as=\"h1\" variant=\"verdict\">\n Find release work.\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n One quiet index across tickets, pull requests, docs, pipelines, deployments, and time.\n </Text>\n </header>\n\n <section aria-label=\"Item filters\" className={styles.filters}>\n <label className={styles.search}>\n <span>Search</span>\n <input\n maxLength={200}\n onChange={(event) => update(\"query\", event.currentTarget.value)}\n placeholder=\"Key, title, or status\"\n type=\"search\"\n value={filters.query}\n />\n </label>\n <label>\n <span>Service</span>\n <select onChange={(event) => update(\"service\", event.currentTarget.value)} value={filters.service}>\n <option value=\"all\">All services</option>\n {services.map((service) => (\n <option key={service} value={service}>\n {service}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>Owner</span>\n <select onChange={(event) => update(\"owner\", event.currentTarget.value)} value={filters.owner}>\n <option value=\"all\">Anyone</option>\n {filters.owner !== \"all\" && !hasSelectedOwnerOption ? (\n <option value={filters.owner}>{selectedOwner?.name ?? `Owner …${filters.owner.slice(-6)}`}</option>\n ) : null}\n {controller.state.ownerOptions.map((owner) => (\n <option key={owner.personId} value={owner.personId}>\n {owner.displayName}\n </option>\n ))}\n {controller.state.ownerOptionsTruncated ? <option disabled>More owners not shown</option> : null}\n </select>\n </label>\n <label>\n <span>Type</span>\n <select onChange={(event) => update(\"type\", event.currentTarget.value)} value={filters.type}>\n <option value=\"all\">All types</option>\n {entityKinds.map((kind) => (\n <option key={kind} value={kind}>\n {labelForKind(kind)}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>Status</span>\n <select onChange={(event) => update(\"status\", event.currentTarget.value)} value={filters.status}>\n <option value=\"all\">Any status</option>\n <option value=\"active\">Active</option>\n <option value=\"done\">Done</option>\n <option value=\"failed\">Needs attention</option>\n </select>\n </label>\n </section>\n\n {selectedEntityId === null ? null : selectedItem === null ? (\n <div id=\"item-details\">\n <StatePanel\n action={<Button onClick={clearSelection}>Back to items</Button>}\n description=\"This item is not present in the current bounded workspace index. It may have been deleted or fall outside this result prefix.\"\n title=\"Item unavailable\"\n tone=\"caution\"\n />\n </div>\n ) : (\n <Surface as=\"section\" className={styles.selection} id=\"item-details\" padding=\"spacious\" tone=\"secondary\">\n <div className={styles.selectionHeader}>\n <ServiceMark service={selectedItem.service} size=\"compact\" />\n <StateLabel label={selectedItem.status} size=\"compact\" tone={selectedItem.tone} />\n </div>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n {selectedItem.key} · {labelForKind(selectedItem.kind)}\n </Text>\n <Text as=\"h2\" variant=\"section-title\">\n {selectedItem.title}\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n {workspaceItemMembershipDescription(selectedItem)}\n </Text>\n <ItemOwners item={selectedItem} />\n {shareOwnerPersonId === null ? null : (\n <AuthorizedSharePanel\n key={selectedItem.entityId}\n currentPersonId={shareOwnerPersonId}\n entityId={selectedItem.entityId}\n grantees={controller.state.ownerOptions}\n workspaceId={context.workspaceId}\n {...(shareTransport === undefined ? {} : { transport: shareTransport })}\n />\n )}\n <div className={styles.selectionActions}>\n <div className={styles.membershipChoices}>\n {selectedItem.routableReleaseIds.map((releaseId) => {\n const release = releaseById.get(releaseId)\n return (\n <Link\n key={releaseId}\n state={makeReleaseRouteState(context.workspaceId, releaseId, releaseOriginFromLocation(location))}\n to={workspaceItemReleaseHref(context.workspaceId, releaseId, selectedItem.entityId)}\n >\n Open {release === undefined ? `release ${releaseId.slice(-6)}` : release.relay.codename}\n {release === undefined ? null : <span>{release.version}</span>}\n </Link>\n )\n })}\n </div>\n <Button onClick={clearSelection}>Back to items</Button>\n </div>\n </Surface>\n )}\n\n <div className={styles.resultHeading} id=\"results\">\n <Text as=\"h2\" variant=\"section-title\">\n {controller.state.matchedCount} of {controller.state.totalCount} workspace items\n </Text>\n <StateLabel\n label={\n controller.state.refreshing\n ? \"Updating results\"\n : controller.state.truncated\n ? \"Bounded workspace result\"\n : \"Workspace scope\"\n }\n size=\"compact\"\n tone={controller.state.truncated && !controller.state.refreshing ? \"caution\" : \"neutral\"}\n />\n </div>\n\n {visibleItems.length === 0 ? (\n <StatePanel\n action={<Button onClick={() => replaceSearch(new URLSearchParams())}>Clear filters</Button>}\n description=\"Try a broader word, owner, service, type, or status. No demo object is substituted.\"\n title=\"No matching items\"\n />\n ) : (\n <div className={styles.items}>\n {visibleItems.map((item) => (\n <Surface as=\"article\" className={styles.item} key={item.entityId} padding=\"none\" tone=\"secondary\">\n <ServiceMark service={item.service} size=\"compact\" />\n <Link\n className={styles.itemLink}\n onClick={(event) => {\n if (shouldRememberWorkspaceScrollPosition(event, event.currentTarget.target)) {\n rememberWorkspaceScrollPosition(location, item.href)\n }\n }}\n state={makeWorkspaceEntityRouteState(\n location.state,\n context.workspaceId,\n item.entityId,\n entityOriginFromLocation(location)\n )}\n to={item.href}\n >\n <span>{item.key}</span>\n <strong>{item.title}</strong>\n </Link>\n <div className={styles.meta}>\n <StateLabel label={item.status} size=\"compact\" tone={item.tone} />\n <span>{labelForKind(item.kind)}</span>\n <span>\n {item.releaseIds.length === 0\n ? \"Unlinked\"\n : `${item.releaseIds.length}${item.releaseMembershipsTruncated ? \"+\" : \"\"} release${item.releaseIds.length === 1 ? \"\" : \"s\"}`}\n </span>\n <ItemOwners item={item} />\n <time dateTime={item.freshness} title={`Synchronized ${item.freshness}`}>\n {formatItemFreshness(item.freshness)}\n </time>\n </div>\n {shareOwnerPersonId === null ? null : (\n <Link\n className={styles.shareLink}\n to={unlinkedItemLocation(location.pathname, searchParams, item.entityId)}\n >\n Share\n </Link>\n )}\n </Surface>\n ))}\n </div>\n )}\n </article>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ItemsPage-Cr3--iJc.js","names":[],"sources":["../../../src/client/items/ItemsPage.module.css","../../../src/client/items/AuthorizedSharePanel.tsx","../../../src/client/items/ItemsPage.tsx"],"sourcesContent":[".page,\n.hero,\n.filters,\n.items,\n.item,\n.itemLink,\n.meta,\n.selection {\n display: grid;\n}\n\n.page {\n gap: var(--rly-space-32);\n}\n\n.hero {\n gap: var(--rly-space-8);\n max-inline-size: 52rem;\n}\n\n.hero > * {\n margin: 0;\n}\n\n.filters {\n grid-template-columns: minmax(16rem, 2fr) repeat(4, minmax(9rem, 1fr));\n gap: var(--rly-space-12);\n align-items: end;\n}\n\n.filters label {\n display: grid;\n gap: var(--rly-space-6);\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.filters input,\n.filters select {\n min-block-size: 3.5rem;\n inline-size: 100%;\n padding-inline: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: inherit;\n}\n\n.filters input:focus-visible,\n.filters select:focus-visible,\n.itemLink:focus-visible,\n.membershipChoices a:focus-visible,\n.shareLink:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n.resultHeading {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--rly-space-12);\n}\n\n.resultHeading h2 {\n margin: 0;\n}\n\n.selection {\n gap: var(--rly-space-12);\n scroll-margin-block-start: var(--rly-space-24);\n}\n\n.selection > * {\n margin: 0;\n}\n\n.selectionHeader,\n.selectionActions,\n.membershipChoices {\n display: flex;\n align-items: center;\n gap: var(--rly-space-12);\n}\n\n.selectionActions {\n justify-content: space-between;\n}\n\n.membershipChoices {\n flex-wrap: wrap;\n}\n\n.membershipChoices a {\n display: grid;\n gap: var(--rly-space-2);\n min-block-size: 3rem;\n padding: var(--rly-space-8) var(--rly-space-12);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.membershipChoices a span {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.items {\n gap: var(--rly-space-8);\n}\n\n.item {\n grid-template-columns: auto minmax(0, 1fr) auto auto;\n align-items: center;\n gap: var(--rly-space-16);\n min-block-size: 5.5rem;\n padding: var(--rly-space-16) var(--rly-space-20);\n}\n\n.itemLink {\n gap: var(--rly-space-2);\n min-inline-size: 0;\n color: inherit;\n text-decoration: none;\n}\n\n.shareLink {\n min-block-size: 2.5rem;\n padding: var(--rly-space-8) var(--rly-space-12);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n color: var(--rly-color-text-1);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n text-decoration: none;\n}\n\n.itemLink span,\n.meta {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.owners {\n min-inline-size: max-content;\n}\n\n.ownerGroup {\n display: grid;\n gap: var(--rly-space-4);\n min-inline-size: 0;\n}\n\n.ownerLimit {\n color: var(--rly-color-text-2);\n font: var(--rly-type-meta-weight) var(--rly-type-meta-size) / var(--rly-type-meta-line-height)\n var(--rly-type-meta-font);\n}\n\n.itemLink strong {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.meta {\n grid-auto-flow: column;\n align-items: center;\n gap: var(--rly-space-12);\n}\n\n.shareForm,\n.shareResult {\n display: grid;\n grid-template-columns: minmax(12rem, 1fr) minmax(8rem, auto) minmax(8rem, auto) auto;\n gap: var(--rly-space-12);\n align-items: end;\n padding-block: var(--rly-space-12);\n border-block: 1px solid var(--rly-color-border-2);\n}\n\n.shareForm > div,\n.shareResult > div {\n display: grid;\n gap: var(--rly-space-4);\n}\n\n.shareForm h3,\n.shareForm p,\n.shareResult h3,\n.shareResult p {\n margin: 0;\n}\n\n.shareForm label {\n display: grid;\n gap: var(--rly-space-6);\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.shareForm select {\n min-block-size: 3rem;\n padding-inline: var(--rly-space-12);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: inherit;\n}\n\n.shareForm select:focus-visible,\n.shareResult a:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n\n.shareResult {\n grid-template-columns: minmax(0, 1fr) auto auto;\n}\n\n.shareResult a {\n overflow-wrap: anywhere;\n color: var(--rly-color-text-1);\n}\n\n@media (max-width: 64rem) {\n .filters {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n\n .search {\n grid-column: 1 / -1;\n }\n\n .item {\n grid-template-columns: auto minmax(0, 1fr);\n }\n\n .meta {\n grid-column: 2;\n grid-auto-flow: row;\n grid-template-columns: repeat(2, minmax(0, max-content));\n }\n\n .shareLink {\n grid-column: 2;\n justify-self: start;\n }\n\n .shareForm,\n .shareResult {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n align-items: end;\n }\n\n .shareForm > div,\n .shareResult > div {\n grid-column: 1 / -1;\n }\n}\n\n@media (max-width: 40rem) {\n .filters {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .search {\n grid-column: auto;\n }\n\n .meta,\n .shareForm,\n .shareResult {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .shareForm > div,\n .shareResult > div {\n grid-column: auto;\n }\n}\n","import { Button, StateLabel, Text } from \"@knpkv/rly/primitives\"\nimport * as DateTime from \"effect/DateTime\"\nimport { type FormEvent, type ReactElement, useEffect, useMemo, useRef, useState } from \"react\"\nimport { Link } from \"react-router\"\n\nimport type { WorkspaceEntityOwner } from \"../../api/deliveryGraph.js\"\nimport type { EntityId, ShareId, WorkspaceId } from \"../../domain/identifiers.js\"\nimport { PersonId } from \"../../domain/identifiers.js\"\nimport {\n browserAuthorizedShareTransport,\n type AuthorizedShareLifetime,\n type AuthorizedShareTransport,\n type CreateAuthorizedShareTransportInput\n} from \"./authorizedShareTransport.js\"\nimport styles from \"./ItemsPage.module.css\"\n\ninterface ShareGrantee {\n readonly displayName: string\n readonly personId: PersonId\n}\n\ntype AuthorizedSharePanelState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"creating\" }\n | { readonly _tag: \"failed\" }\n | { readonly _tag: \"ready\"; readonly shareId: ShareId; readonly expiresAt: string }\n | { readonly _tag: \"revoking\"; readonly shareId: ShareId; readonly expiresAt: string }\n | { readonly _tag: \"revoked\" }\n\nexport interface AuthorizedSharePanelProps {\n readonly currentPersonId: PersonId\n readonly entityId: EntityId\n readonly grantees: ReadonlyArray<WorkspaceEntityOwner>\n readonly transport?: AuthorizedShareTransport\n readonly workspaceId: WorkspaceId\n}\n\nconst shareLifetime = (value: string): AuthorizedShareLifetime => (value === \"hour\" || value === \"week\" ? value : \"day\")\n\nconst shareGrantees = (\n currentPersonId: PersonId,\n grantees: ReadonlyArray<WorkspaceEntityOwner>\n): ReadonlyArray<ShareGrantee> => {\n const byId = new Map<PersonId, ShareGrantee>()\n byId.set(currentPersonId, { displayName: \"You\", personId: currentPersonId })\n for (const grantee of grantees) {\n byId.set(grantee.personId, { displayName: grantee.displayName, personId: grantee.personId })\n }\n return [...byId.values()]\n}\n\n/** Owner-only creation and revocation controls for one exact item share. */\nexport const AuthorizedSharePanel = ({\n currentPersonId,\n entityId,\n grantees,\n transport = browserAuthorizedShareTransport,\n workspaceId\n}: AuthorizedSharePanelProps): ReactElement => {\n const options = useMemo(() => shareGrantees(currentPersonId, grantees), [currentPersonId, grantees])\n const [granteePersonId, setGranteePersonId] = useState<PersonId>(options[0]?.personId ?? currentPersonId)\n const [lifetime, setLifetime] = useState<AuthorizedShareLifetime>(\"day\")\n const [state, setState] = useState<AuthorizedSharePanelState>({ _tag: \"idle\" })\n const createIntent = useRef<CreateAuthorizedShareTransportInput | null>(null)\n const currentRequest = useRef<AbortController | null>(null)\n const statusRegion = useRef<HTMLElement | null>(null)\n\n useEffect(() => () => currentRequest.current?.abort(), [])\n useEffect(() => {\n if (state._tag === \"ready\" || state._tag === \"revoked\") statusRegion.current?.focus()\n }, [state._tag])\n\n const create = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault()\n currentRequest.current?.abort()\n const request = new AbortController()\n currentRequest.current = request\n setState({ _tag: \"creating\" })\n const existingIntent = createIntent.current\n const intent =\n existingIntent !== null &&\n existingIntent.entityId === entityId &&\n existingIntent.granteePersonId === granteePersonId &&\n existingIntent.lifetime === lifetime\n ? Promise.resolve(existingIntent)\n : transport.prepareCreate({ entityId, granteePersonId, lifetime }).then((nextIntent) => {\n createIntent.current = nextIntent\n return nextIntent\n })\n intent\n .then((currentIntent) => transport.create(currentIntent, request.signal))\n .then(\n (share) => {\n if (request.signal.aborted) return\n const currentIntent = createIntent.current\n if (\n currentIntent === null ||\n share.shareId !== currentIntent.shareId ||\n share.entityId !== currentIntent.entityId ||\n share.granteePersonId !== currentIntent.granteePersonId\n ) {\n setState({ _tag: \"failed\" })\n return\n }\n if (share.revokedAt !== null) {\n setState({ _tag: \"revoked\" })\n return\n }\n setState({\n _tag: \"ready\",\n shareId: share.shareId,\n expiresAt: DateTime.formatIso(share.expiresAt)\n })\n },\n () => {\n if (!request.signal.aborted) setState({ _tag: \"failed\" })\n }\n )\n }\n\n const revoke = (shareId: ShareId, expiresAt: string): void => {\n currentRequest.current?.abort()\n const request = new AbortController()\n currentRequest.current = request\n setState({ _tag: \"revoking\", shareId, expiresAt })\n transport.revoke(workspaceId, shareId, request.signal).then(\n () => {\n if (!request.signal.aborted) setState({ _tag: \"revoked\" })\n },\n () => {\n if (!request.signal.aborted) setState({ _tag: \"ready\", shareId, expiresAt })\n }\n )\n }\n\n const selectGrantee = (value: string): void => {\n createIntent.current = null\n setGranteePersonId(PersonId.make(value))\n }\n const selectLifetime = (value: string): void => {\n createIntent.current = null\n setLifetime(shareLifetime(value))\n }\n const createAnother = (): void => {\n createIntent.current = null\n setState({ _tag: \"idle\" })\n }\n\n if (state._tag === \"ready\" || state._tag === \"revoking\") {\n const sharePath = `/shares/${workspaceId}/${state.shareId}`\n return (\n <section\n aria-label=\"Authorized share\"\n aria-live=\"polite\"\n className={styles.shareResult}\n ref={statusRegion}\n role=\"status\"\n tabIndex={-1}\n >\n <div>\n <Text as=\"h3\" variant=\"body-large\">\n Authorized link ready\n </Text>\n <Text tone=\"secondary\">Only the selected person can open this exact item. Expires {state.expiresAt}.</Text>\n </div>\n <Link to={sharePath}>{sharePath}</Link>\n <Button disabled={state._tag === \"revoking\"} onClick={() => revoke(state.shareId, state.expiresAt)}>\n {state._tag === \"revoking\" ? \"Revoking…\" : \"Revoke link\"}\n </Button>\n </section>\n )\n }\n\n if (state._tag === \"revoked\") {\n return (\n <section\n aria-label=\"Authorized share\"\n aria-live=\"polite\"\n className={styles.shareResult}\n ref={statusRegion}\n role=\"status\"\n tabIndex={-1}\n >\n <StateLabel label=\"Revoked\" size=\"compact\" tone=\"neutral\" />\n <Text tone=\"secondary\">This link no longer resolves.</Text>\n <Button onClick={createAnother}>Create another</Button>\n </section>\n )\n }\n\n return (\n <form className={styles.shareForm} onSubmit={create}>\n <div>\n <Text as=\"h3\" variant=\"body-large\">\n Share this exact item\n </Text>\n <Text tone=\"secondary\">Authenticated access only. Related releases and relationships stay private.</Text>\n </div>\n <label>\n <span>Person</span>\n <select\n disabled={state._tag === \"creating\"}\n onChange={(event) => selectGrantee(event.currentTarget.value)}\n value={granteePersonId}\n >\n {options.map((option) => (\n <option key={option.personId} value={option.personId}>\n {option.displayName}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>Expires</span>\n <select\n disabled={state._tag === \"creating\"}\n onChange={(event) => selectLifetime(event.currentTarget.value)}\n value={lifetime}\n >\n <option value=\"hour\">In 1 hour</option>\n <option value=\"day\">In 1 day</option>\n <option value=\"week\">In 7 days</option>\n </select>\n </label>\n <Button disabled={state._tag === \"creating\"} type=\"submit\">\n {state._tag === \"creating\" ? \"Creating…\" : \"Create authorized link\"}\n </Button>\n {state._tag === \"failed\" ? (\n <Text role=\"alert\" tone=\"secondary\">\n Could not create the link. Check the person and try again.\n </Text>\n ) : null}\n </form>\n )\n}\n","import { PeopleStrip, ServiceMark } from \"@knpkv/rly/patterns\"\nimport { Button, Skeleton, StateLabel, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as Option from \"effect/Option\"\nimport * as Schema from \"effect/Schema\"\nimport { type ReactElement, useMemo, useState } from \"react\"\nimport { Link, useLocation, useNavigate, useOutletContext, useSearchParams } from \"react-router\"\n\nimport type { DeliveryEntityKind, DeliveryEntityService } from \"../../domain/deliveryGraph.js\"\nimport { PersonId } from \"../../domain/identifiers.js\"\nimport { useBrowserSession } from \"../BrowserSession.js\"\nimport { PortfolioOverviewView, type PortfolioOverviewState } from \"../portfolio/PortfolioOverview.js\"\nimport type { WorkspaceReleaseOutletContext } from \"../releases/WorkspaceReleaseLayout.js\"\nimport { makeReleaseRouteState, releaseOriginFromLocation } from \"../releases/releaseRoutes.js\"\nimport { releaseWorksetSessionKey } from \"../releases/ReleaseWorkset.js\"\nimport { rememberWorkspaceScrollPosition, shouldRememberWorkspaceScrollPosition } from \"../workspaceScrollCapture.js\"\nimport {\n type WorkspaceItemPresentation,\n type WorkspaceItemStatus,\n workspaceItemReleaseHref\n} from \"./presentWorkspaceItems.js\"\nimport { browserWorkspaceItemsTransport, useWorkspaceItems, type WorkspaceItemsTransport } from \"./useWorkspaceItems.js\"\nimport { AuthorizedSharePanel } from \"./AuthorizedSharePanel.js\"\nimport type { AuthorizedShareTransport } from \"./authorizedShareTransport.js\"\nimport styles from \"./ItemsPage.module.css\"\nimport { entityOriginFromLocation, makeWorkspaceEntityRouteState } from \"./workspaceEntityRoutes.js\"\n\ninterface ItemFilters {\n readonly query: string\n readonly owner: PersonId | \"all\"\n readonly service: DeliveryEntityService | \"all\"\n readonly status: WorkspaceItemStatus | \"all\"\n readonly type: DeliveryEntityKind | \"all\"\n}\n\nexport interface ItemsPageProps {\n readonly shareTransport?: AuthorizedShareTransport\n readonly transport?: WorkspaceItemsTransport\n}\n\nconst entityKinds: ReadonlyArray<DeliveryEntityKind> = [\n \"issue\",\n \"pull-request\",\n \"page\",\n \"pipeline-execution\",\n \"deployment\",\n \"time-entry\"\n]\nconst services: ReadonlyArray<DeliveryEntityService> = [\"jira\", \"codecommit\", \"confluence\", \"codepipeline\", \"clockify\"]\nconst freshnessFormatter = new Intl.DateTimeFormat(\"en-GB\", {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n timeZone: \"UTC\"\n})\n\nexport const formatItemFreshness = (freshness: string): string => freshnessFormatter.format(Date.parse(freshness))\n\nexport const itemsLocationWithSearch = (location: Pick<Location, \"hash\" | \"pathname\">, params: URLSearchParams) => ({\n hash: location.hash,\n pathname: location.pathname,\n search: params.size === 0 ? \"\" : `?${params.toString()}`\n})\n\nexport const unlinkedItemLocation = (pathname: string, params: URLSearchParams, entityId: string) => {\n const next = new URLSearchParams(params)\n next.set(\"object\", entityId)\n return {\n hash: \"#item-details\",\n pathname,\n search: `?${next.toString()}`\n }\n}\n\nconst entityKind = (value: string | null): DeliveryEntityKind | \"all\" =>\n entityKinds.find((candidate) => candidate === value) ?? \"all\"\n\nconst itemStatus = (value: string | null): WorkspaceItemStatus | \"all\" =>\n value === \"active\" || value === \"done\" || value === \"failed\" ? value : \"all\"\n\nconst itemOwner = (value: string | null): PersonId | \"all\" => {\n const decoded = Schema.decodeUnknownOption(PersonId)(value)\n return Option.isSome(decoded) ? decoded.value : \"all\"\n}\n\nconst filtersFrom = (params: URLSearchParams): ItemFilters => ({\n owner: itemOwner(params.get(\"owner\")),\n query: params.get(\"q\")?.trim() ?? \"\",\n service: services.find((candidate) => candidate === params.get(\"service\")) ?? \"all\",\n status: itemStatus(params.get(\"status\")),\n type: entityKind(params.get(\"type\"))\n})\n\nexport const filterWorkspaceItems = (\n items: ReadonlyArray<WorkspaceItemPresentation>,\n filters: ItemFilters\n): ReadonlyArray<WorkspaceItemPresentation> => {\n const query = filters.query.toLocaleLowerCase(\"en-US\")\n return items.filter(\n (item) =>\n (query.length === 0 || `${item.key} ${item.title} ${item.status}`.toLocaleLowerCase(\"en-US\").includes(query)) &&\n (filters.service === \"all\" || item.service === filters.service) &&\n (filters.owner === \"all\" || item.owners.some(({ id }) => id === filters.owner)) &&\n (filters.status === \"all\" || item.statusGroup === filters.status) &&\n (filters.type === \"all\" || item.kind === filters.type)\n )\n}\n\nconst ItemOwners = ({ item }: { readonly item: WorkspaceItemPresentation }): ReactElement => {\n const [expanded, setExpanded] = useState(false)\n if (item.owners.length === 0) return <span>Unassigned</span>\n return (\n <span className={styles.ownerGroup}>\n <PeopleStrip\n aria-label={`${item.key} collaborators${item.ownersTruncated ? \", more collaborators not shown\" : \"\"}`}\n className={styles.owners}\n expanded={expanded}\n limit={2}\n onExpandedChange={setExpanded}\n people={item.owners}\n size=\"compact\"\n />\n {item.ownersTruncated ? <span className={styles.ownerLimit}>20+ people · More not shown</span> : null}\n </span>\n )\n}\n\nexport const selectWorkspaceItem = (\n items: ReadonlyArray<WorkspaceItemPresentation>,\n entityId: string | null\n): WorkspaceItemPresentation | null =>\n entityId === null ? null : (items.find((item) => item.entityId === entityId) ?? null)\n\nconst labelForKind = (kind: DeliveryEntityKind): string =>\n kind\n .split(\"-\")\n .map((part) => `${part.charAt(0).toLocaleUpperCase(\"en-US\")}${part.slice(1)}`)\n .join(\" \")\n\nexport const workspaceItemMembershipDescription = (item: WorkspaceItemPresentation): string => {\n if (item.releaseIds.length === 0) {\n return \"This current object is not linked to a release yet. Its provider-specific full view will remain available here when that integration is connected.\"\n }\n if (item.routableReleaseIds.length === 0) {\n return `This object is linked to ${item.releaseIds.length}${item.releaseMembershipsTruncated ? \"+\" : \"\"} release${item.releaseIds.length === 1 ? \"\" : \"s\"} outside the current portfolio. Its membership remains visible without routing to an unavailable release page.`\n }\n if (item.releaseIds.length === 1) {\n return \"This object is linked to one release and can be opened in its complete delivery context.\"\n }\n return `This object is linked to ${item.releaseIds.length}${item.releaseMembershipsTruncated ? \"+\" : \"\"} releases. Choose the exact release context to avoid silently substituting another delivery trace.`\n}\n\n/** Compact workspace-wide index of normalized delivery objects. */\nexport const ItemsPage = ({\n shareTransport,\n transport = browserWorkspaceItemsTransport\n}: ItemsPageProps = {}): ReactElement => {\n const context = useOutletContext<WorkspaceReleaseOutletContext>()\n const browserSession = useBrowserSession()\n const location = useLocation()\n const navigate = useNavigate()\n const [searchParams] = useSearchParams()\n const portfolio = context.controller.state._tag === \"ready\" ? context.controller.state.portfolio : null\n const releaseById = useMemo(\n () => new Map(portfolio?.releases.map((release) => [release.id, release]) ?? []),\n [portfolio]\n )\n const routableReleaseIds = useMemo(() => new Set(portfolio?.releases.map(({ id }) => id) ?? []), [portfolio])\n const refreshKey =\n context.controller.state._tag === \"ready\" ? context.controller.state.portfolio.generatedAt : \"pending\"\n const sessionKey = releaseWorksetSessionKey(browserSession.state)\n const filters = filtersFrom(searchParams)\n const controller = useWorkspaceItems(\n context.workspaceId,\n routableReleaseIds,\n filters,\n refreshKey,\n sessionKey,\n browserSession.invalidateSession,\n transport\n )\n const replaceSearch = (next: URLSearchParams): void => {\n navigate(itemsLocationWithSearch(location, next), { replace: true })\n }\n const update = (key: keyof ItemFilters, value: string): void => {\n const next = new URLSearchParams(searchParams)\n if (value.length === 0 || value === \"all\") next.delete(key === \"query\" ? \"q\" : key)\n else next.set(key === \"query\" ? \"q\" : key, value)\n replaceSearch(next)\n }\n\n const portfolioBoundary: PortfolioOverviewState | null =\n context.controller.state._tag !== \"ready\"\n ? context.controller.state\n : sessionKey === null\n ? {\n _tag: \"session\",\n reason: browserSession.state._tag === \"authenticated\" ? \"checking\" : browserSession.state._tag\n }\n : null\n if (portfolioBoundary?._tag === \"loading\") {\n return (\n <section aria-label=\"Loading delivery items\" className={styles.page}>\n <Skeleton height=\"8rem\" variant=\"block\" />\n <Skeleton height=\"20rem\" variant=\"block\" />\n </section>\n )\n }\n if (portfolioBoundary !== null) {\n return (\n <PortfolioOverviewView\n onPreviewRelease={() => undefined}\n onRetry={context.controller.onRetry}\n state={portfolioBoundary}\n />\n )\n }\n if (controller.state._tag === \"idle\" || controller.state._tag === \"loading\") {\n return (\n <section aria-label=\"Loading delivery items\" className={styles.page}>\n <Skeleton height=\"8rem\" variant=\"block\" />\n <Skeleton height=\"20rem\" variant=\"block\" />\n </section>\n )\n }\n if (controller.state._tag === \"failed\") {\n return (\n <StatePanel\n action={<Button onClick={controller.retry}>Try again</Button>}\n description=\"Control Center could not read the normalized delivery index. Saved source facts remain unchanged.\"\n title=\"Items unavailable\"\n tone=\"caution\"\n />\n )\n }\n\n const visibleItems = controller.state.items\n const hasSelectedOwnerOption =\n filters.owner === \"all\" || controller.state.ownerOptions.some(({ personId }) => personId === filters.owner)\n const selectedOwner =\n filters.owner === \"all\"\n ? undefined\n : controller.state.items.flatMap(({ owners }) => owners).find(({ id }) => id === filters.owner)\n const selectedEntityId = searchParams.get(\"object\")\n const selectedItem = selectWorkspaceItem(controller.state.items, selectedEntityId)\n const shareOwnerPersonId =\n browserSession.state._tag === \"authenticated\" &&\n browserSession.state.session.permission === \"workspace-owner\" &&\n browserSession.state.session.actor._tag === \"human\"\n ? browserSession.state.session.actor.personId\n : null\n const clearSelection = (): void => {\n const next = new URLSearchParams(searchParams)\n next.delete(\"object\")\n navigate(\n {\n hash: \"#results\",\n pathname: location.pathname,\n search: next.size === 0 ? \"\" : `?${next.toString()}`\n },\n { replace: true }\n )\n }\n return (\n <article className={styles.page}>\n <header className={styles.hero}>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n Workspace items\n </Text>\n <Text as=\"h1\" variant=\"verdict\">\n Find release work.\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n One quiet index across tickets, pull requests, docs, pipelines, deployments, and time.\n </Text>\n </header>\n\n <section aria-label=\"Item filters\" className={styles.filters}>\n <label className={styles.search}>\n <span>Search</span>\n <input\n maxLength={200}\n onChange={(event) => update(\"query\", event.currentTarget.value)}\n placeholder=\"Key, title, or status\"\n type=\"search\"\n value={filters.query}\n />\n </label>\n <label>\n <span>Service</span>\n <select onChange={(event) => update(\"service\", event.currentTarget.value)} value={filters.service}>\n <option value=\"all\">All services</option>\n {services.map((service) => (\n <option key={service} value={service}>\n {service}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>Owner</span>\n <select onChange={(event) => update(\"owner\", event.currentTarget.value)} value={filters.owner}>\n <option value=\"all\">Anyone</option>\n {filters.owner !== \"all\" && !hasSelectedOwnerOption ? (\n <option value={filters.owner}>{selectedOwner?.name ?? `Owner …${filters.owner.slice(-6)}`}</option>\n ) : null}\n {controller.state.ownerOptions.map((owner) => (\n <option key={owner.personId} value={owner.personId}>\n {owner.displayName}\n </option>\n ))}\n {controller.state.ownerOptionsTruncated ? <option disabled>More owners not shown</option> : null}\n </select>\n </label>\n <label>\n <span>Type</span>\n <select onChange={(event) => update(\"type\", event.currentTarget.value)} value={filters.type}>\n <option value=\"all\">All types</option>\n {entityKinds.map((kind) => (\n <option key={kind} value={kind}>\n {labelForKind(kind)}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>Status</span>\n <select onChange={(event) => update(\"status\", event.currentTarget.value)} value={filters.status}>\n <option value=\"all\">Any status</option>\n <option value=\"active\">Active</option>\n <option value=\"done\">Done</option>\n <option value=\"failed\">Needs attention</option>\n </select>\n </label>\n </section>\n\n {selectedEntityId === null ? null : selectedItem === null ? (\n <div id=\"item-details\">\n <StatePanel\n action={<Button onClick={clearSelection}>Back to items</Button>}\n description=\"This item is not present in the current bounded workspace index. It may have been deleted or fall outside this result prefix.\"\n title=\"Item unavailable\"\n tone=\"caution\"\n />\n </div>\n ) : (\n <Surface as=\"section\" className={styles.selection} id=\"item-details\" padding=\"spacious\" tone=\"secondary\">\n <div className={styles.selectionHeader}>\n <ServiceMark service={selectedItem.service} size=\"compact\" />\n <StateLabel label={selectedItem.status} size=\"compact\" tone={selectedItem.tone} />\n </div>\n <Text as=\"p\" tone=\"secondary\" variant=\"label\">\n {selectedItem.key} · {labelForKind(selectedItem.kind)}\n </Text>\n <Text as=\"h2\" variant=\"section-title\">\n {selectedItem.title}\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n {workspaceItemMembershipDescription(selectedItem)}\n </Text>\n <ItemOwners item={selectedItem} />\n {shareOwnerPersonId === null ? null : (\n <AuthorizedSharePanel\n key={selectedItem.entityId}\n currentPersonId={shareOwnerPersonId}\n entityId={selectedItem.entityId}\n grantees={controller.state.ownerOptions}\n workspaceId={context.workspaceId}\n {...(shareTransport === undefined ? {} : { transport: shareTransport })}\n />\n )}\n <div className={styles.selectionActions}>\n <div className={styles.membershipChoices}>\n {selectedItem.routableReleaseIds.map((releaseId) => {\n const release = releaseById.get(releaseId)\n return (\n <Link\n key={releaseId}\n state={makeReleaseRouteState(context.workspaceId, releaseId, releaseOriginFromLocation(location))}\n to={workspaceItemReleaseHref(context.workspaceId, releaseId, selectedItem.entityId)}\n >\n Open {release === undefined ? `release ${releaseId.slice(-6)}` : release.relay.codename}\n {release === undefined ? null : <span>{release.version}</span>}\n </Link>\n )\n })}\n </div>\n <Button onClick={clearSelection}>Back to items</Button>\n </div>\n </Surface>\n )}\n\n <div className={styles.resultHeading} id=\"results\">\n <Text as=\"h2\" variant=\"section-title\">\n {controller.state.matchedCount} of {controller.state.totalCount} workspace items\n </Text>\n <StateLabel\n label={\n controller.state.refreshing\n ? \"Updating results\"\n : controller.state.truncated\n ? \"Bounded workspace result\"\n : \"Workspace scope\"\n }\n size=\"compact\"\n tone={controller.state.truncated && !controller.state.refreshing ? \"caution\" : \"neutral\"}\n />\n </div>\n\n {visibleItems.length === 0 ? (\n <StatePanel\n action={<Button onClick={() => replaceSearch(new URLSearchParams())}>Clear filters</Button>}\n description=\"Try a broader word, owner, service, type, or status. No demo object is substituted.\"\n title=\"No matching items\"\n />\n ) : (\n <div className={styles.items}>\n {visibleItems.map((item) => (\n <Surface as=\"article\" className={styles.item} key={item.entityId} padding=\"none\" tone=\"secondary\">\n <ServiceMark service={item.service} size=\"compact\" />\n <Link\n className={styles.itemLink}\n onClick={(event) => {\n if (shouldRememberWorkspaceScrollPosition(event, event.currentTarget.target)) {\n rememberWorkspaceScrollPosition(location, item.href)\n }\n }}\n state={makeWorkspaceEntityRouteState(\n location.state,\n context.workspaceId,\n item.entityId,\n entityOriginFromLocation(location)\n )}\n to={item.href}\n >\n <span>{item.key}</span>\n <strong>{item.title}</strong>\n </Link>\n <div className={styles.meta}>\n <StateLabel label={item.status} size=\"compact\" tone={item.tone} />\n <span>{labelForKind(item.kind)}</span>\n <span>\n {item.releaseIds.length === 0\n ? \"Unlinked\"\n : `${item.releaseIds.length}${item.releaseMembershipsTruncated ? \"+\" : \"\"} release${item.releaseIds.length === 1 ? \"\" : \"s\"}`}\n </span>\n <ItemOwners item={item} />\n <time dateTime={item.freshness} title={`Synchronized ${item.freshness}`}>\n {formatItemFreshness(item.freshness)}\n </time>\n </div>\n {shareOwnerPersonId === null ? null : (\n <Link\n className={styles.shareLink}\n to={unlinkedItemLocation(location.pathname, searchParams, item.entityId)}\n >\n Share\n </Link>\n )}\n </Surface>\n ))}\n </div>\n )}\n </article>\n )\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-CwJFpaho.js";import{o as n}from"./hooks-K-sIfGqH.js";import{t as r}from"./jsx-runtime-NZYk81nU.js";import{g as i,r as a}from"./Dialog-DSwimdwG-BeHnBpPp.js";import{p as o}from"./index-BVikncBH.js";import{n as s,t as c}from"./primitives-DYGtIZqB-r-Glkv2i.js";import{Oa as l,Ya as u,nr as d}from"./agent-api-CUWP1qs8.js";import{n as f}from"./Domain-cJ5aJFpE.js";import{n as p}from"./workspaceEntityPaths-xAl2jRFm.js";import{browserOpenPullRequestTransport as m}from"./openPullRequest-BMlmibLP.js";var h=e(t(),1),g={page:`_page_1u3g0_1`,hero:`_hero_1u3g0_2`,form:`_form_1u3g0_3`,matches:`_matches_1u3g0_4`,card:`_card_1u3g0_23`},_=r(),v=({transport:e=m}={})=>{let t=o(),r=n(),[v,y]=(0,h.useState)(``),[b,x]=(0,h.useState)(``),[S,C]=(0,h.useState)({_tag:`idle`}),[w,T]=(0,h.useState)(0),E=t.state._tag===`authenticated`||t.state._tag===`storage-unavailable`?t.state.session:null,D=t.state._tag===`authenticated`&&(t.state.session.permission===`workspace-owner`||t.state.session.permission===`workspace-approver`)?t.state.session:null;return(0,h.useEffect)(()=>{if(b.length===0){C({_tag:`idle`});return}if(D===null)return;let n=l(d(f)(b));if(n===null){C({_tag:`invalid`});return}let i=new AbortController;return C({_tag:`loading`}),e.resolve(n,i.signal).then(e=>{if(!i.signal.aborted){if(e._tag===`found`){r(p(D.workspaceId,e.candidate.entityId),{replace:!0});return}C(e)}},e=>{if(!i.signal.aborted){if(u(`UnauthorizedApiError`)(e)){t.invalidateSession(D.sessionId);return}C({_tag:`failed`})}}),()=>i.abort()},[t,w,r,b,D,e]),E===null?(0,_.jsx)(i,{description:`Pair this browser with Control Center before resolving a private CodeCommit pull request.`,title:`Browser session required`,tone:`caution`}):t.state._tag===`storage-unavailable`?(0,_.jsx)(i,{description:`Enable session storage, then pair this browser again before resolving a private CodeCommit pull request.`,title:`Browser storage required`,tone:`caution`}):D===null?(0,_.jsx)(i,{description:`Opening a shared CodeCommit PR requires workspace-wide read access.`,title:`Workspace reader required`,tone:`caution`}):(0,_.jsxs)(`section`,{className:g.page,children:[(0,_.jsxs)(`header`,{className:g.hero,children:[(0,_.jsx)(s,{as:`h1`,variant:`page-title`,children:`Open CodeCommit PR`}),(0,_.jsx)(s,{tone:`secondary`,variant:`body-large`,children:`Paste a CodeCommit PR URL from any AWS region. Control Center resolves it inside this workspace; no PR search required.`})]}),(0,_.jsx)(c,{as:`section`,className:g.card,form:`grouped`,padding:`spacious`,tone:`secondary`,children:(0,_.jsxs)(`form`,{className:g.form,onSubmit:e=>{e.preventDefault();let t=v.trim();x(t),T(e=>e+1)},children:[(0,_.jsxs)(`label`,{children:[(0,_.jsx)(`span`,{children:`Pull request URL`}),(0,_.jsx)(`input`,{autoComplete:`url`,onChange:e=>y(e.currentTarget.value),placeholder:`https://REGION.console.aws.amazon.com/codesuite/codecommit/repositories/…`,spellCheck:!1,type:`url`,value:v})]}),(0,_.jsx)(a,{loading:S._tag===`loading`,size:`principal`,type:`submit`,variant:`primary`,children:`Open pull request`})]})}),S._tag===`invalid`?(0,_.jsx)(i,{description:`Use the full AWS CodeCommit pull-request console URL.`,title:`Link not recognized`,tone:`caution`}):S._tag===`failed`?(0,_.jsx)(i,{description:`The workspace index could not be read. Nothing was changed.`,title:`Lookup failed`,tone:`caution`}):S._tag===`not-found`?(0,_.jsx)(i,{description:S.indexTruncated?`The bounded workspace result was incomplete. Narrow the followed CodeCommit resources, then retry.`:`This PR is not synchronized into the current workspace yet. Follow its CodeCommit account or repository, then retry.`,title:`PR not found`,tone:`neutral`}):S._tag===`account-identity-unavailable`?(0,_.jsx)(i,{description:`Control Center could not map every match to a browser-safe AWS account identity. Refresh Services, then retry.`,title:`Account identity unavailable`,tone:`caution`}):S._tag===`ambiguous`?(0,_.jsxs)(c,{as:`section`,className:g.matches,form:`grouped`,padding:`spacious`,tone:`secondary`,children:[(0,_.jsx)(s,{as:`h2`,variant:`section-title`,children:`Choose the connected account`}),(0,_.jsx)(s,{tone:`secondary`,variant:`body`,children:`AWS Console links omit the account. These followed connections contain the same repository and PR number.`}),S.candidates.map(e=>(0,_.jsx)(a,{onClick:()=>r(p(D.workspaceId,e.entityId)),variant:`secondary`,children:`${e.accountLabel} · ${e.title}`},e.entityId))]}):null]})};export{v as OpenPullRequestPage};
|
|
2
|
+
//# sourceMappingURL=OpenPullRequestPage-BYoRmtui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenPullRequestPage-BYoRmtui.js","names":[],"sources":["../../../src/client/openPullRequest/OpenPullRequestPage.module.css","../../../src/client/openPullRequest/OpenPullRequestPage.tsx"],"sourcesContent":[".page,\n.hero,\n.form,\n.matches {\n display: grid;\n}\n\n.page {\n gap: var(--rly-space-32);\n}\n\n.hero,\n.matches {\n gap: var(--rly-space-8);\n max-inline-size: 52rem;\n}\n\n.hero > *,\n.matches > * {\n margin: 0;\n}\n\n.card {\n max-inline-size: 52rem;\n}\n\n.form {\n gap: var(--rly-space-16);\n}\n\n.form label {\n display: grid;\n gap: var(--rly-space-6);\n color: var(--rly-color-text-2);\n font: var(--rly-type-label-weight) var(--rly-type-label-size) / var(--rly-type-label-line-height)\n var(--rly-type-label-font);\n}\n\n.form input {\n min-block-size: 3.5rem;\n inline-size: 100%;\n padding-inline: var(--rly-space-16);\n border: 1px solid var(--rly-color-border-2);\n border-radius: var(--rly-radius-control);\n background: var(--rly-color-surface-1);\n color: var(--rly-color-text-1);\n font: inherit;\n}\n\n.form input:focus-visible {\n outline: 2px solid var(--rly-color-focus);\n outline-offset: var(--rly-space-2);\n}\n","import * as Domain from \"@knpkv/codecommit-core/Domain.js\"\nimport { Button, StatePanel, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as Option from \"effect/Option\"\nimport * as Predicate from \"effect/Predicate\"\nimport * as Schema from \"effect/Schema\"\nimport { type FormEvent, type ReactElement, useEffect, useState } from \"react\"\nimport { useNavigate } from \"react-router\"\n\nimport { useBrowserSession } from \"../BrowserSession.js\"\nimport { workspaceEntityPath } from \"../workspaceEntityPaths.js\"\nimport {\n browserOpenPullRequestTransport,\n type OpenPullRequestResolution,\n type OpenPullRequestTransport\n} from \"./openPullRequest.js\"\nimport styles from \"./OpenPullRequestPage.module.css\"\n\ntype LookupState =\n | { readonly _tag: \"idle\" }\n | { readonly _tag: \"loading\" }\n | { readonly _tag: \"invalid\" }\n | { readonly _tag: \"failed\" }\n | OpenPullRequestResolution\n\nexport interface OpenPullRequestPageProps {\n readonly transport?: OpenPullRequestTransport\n}\n\n/** Open one followed CodeCommit PR from the console URL another person shared. */\nexport const OpenPullRequestPage = ({\n transport = browserOpenPullRequestTransport\n}: OpenPullRequestPageProps = {}): ReactElement => {\n const browserSession = useBrowserSession()\n const navigate = useNavigate()\n const [input, setInput] = useState(\"\")\n const [requestedUrl, setRequestedUrl] = useState(\"\")\n const [lookup, setLookup] = useState<LookupState>({ _tag: \"idle\" })\n const [lookupAttempt, setLookupAttempt] = useState(0)\n const readableSession =\n browserSession.state._tag === \"authenticated\" || browserSession.state._tag === \"storage-unavailable\"\n ? browserSession.state.session\n : null\n const session =\n browserSession.state._tag === \"authenticated\" &&\n (browserSession.state.session.permission === \"workspace-owner\" ||\n browserSession.state.session.permission === \"workspace-approver\")\n ? browserSession.state.session\n : null\n\n useEffect(() => {\n if (requestedUrl.length === 0) {\n setLookup({ _tag: \"idle\" })\n return\n }\n if (session === null) return\n const locator = Option.getOrNull(Schema.decodeUnknownOption(Domain.CodeCommitPullRequestUrl)(requestedUrl))\n if (locator === null) {\n setLookup({ _tag: \"invalid\" })\n return\n }\n const abort = new AbortController()\n setLookup({ _tag: \"loading\" })\n transport.resolve(locator, abort.signal).then(\n (resolution) => {\n if (abort.signal.aborted) return\n if (resolution._tag === \"found\") {\n navigate(workspaceEntityPath(session.workspaceId, resolution.candidate.entityId), { replace: true })\n return\n }\n setLookup(resolution)\n },\n (failure) => {\n if (abort.signal.aborted) return\n if (Predicate.isTagged(\"UnauthorizedApiError\")(failure)) {\n browserSession.invalidateSession(session.sessionId)\n return\n }\n setLookup({ _tag: \"failed\" })\n }\n )\n return () => abort.abort()\n }, [browserSession, lookupAttempt, navigate, requestedUrl, session, transport])\n\n const submit = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault()\n const url = input.trim()\n setRequestedUrl(url)\n setLookupAttempt((current) => current + 1)\n }\n\n if (readableSession === null) {\n return (\n <StatePanel\n description=\"Pair this browser with Control Center before resolving a private CodeCommit pull request.\"\n title=\"Browser session required\"\n tone=\"caution\"\n />\n )\n }\n\n if (browserSession.state._tag === \"storage-unavailable\") {\n return (\n <StatePanel\n description=\"Enable session storage, then pair this browser again before resolving a private CodeCommit pull request.\"\n title=\"Browser storage required\"\n tone=\"caution\"\n />\n )\n }\n\n if (session === null) {\n return (\n <StatePanel\n description=\"Opening a shared CodeCommit PR requires workspace-wide read access.\"\n title=\"Workspace reader required\"\n tone=\"caution\"\n />\n )\n }\n\n return (\n <section className={styles.page}>\n <header className={styles.hero}>\n <Text as=\"h1\" variant=\"page-title\">\n Open CodeCommit PR\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n Paste a CodeCommit PR URL from any AWS region. Control Center resolves it inside this workspace; no PR search\n required.\n </Text>\n </header>\n <Surface as=\"section\" className={styles.card} form=\"grouped\" padding=\"spacious\" tone=\"secondary\">\n <form className={styles.form} onSubmit={submit}>\n <label>\n <span>Pull request URL</span>\n <input\n autoComplete=\"url\"\n onChange={(event) => setInput(event.currentTarget.value)}\n placeholder=\"https://REGION.console.aws.amazon.com/codesuite/codecommit/repositories/…\"\n spellCheck={false}\n type=\"url\"\n value={input}\n />\n </label>\n <Button loading={lookup._tag === \"loading\"} size=\"principal\" type=\"submit\" variant=\"primary\">\n Open pull request\n </Button>\n </form>\n </Surface>\n {lookup._tag === \"invalid\" ? (\n <StatePanel\n description=\"Use the full AWS CodeCommit pull-request console URL.\"\n title=\"Link not recognized\"\n tone=\"caution\"\n />\n ) : lookup._tag === \"failed\" ? (\n <StatePanel\n description=\"The workspace index could not be read. Nothing was changed.\"\n title=\"Lookup failed\"\n tone=\"caution\"\n />\n ) : lookup._tag === \"not-found\" ? (\n <StatePanel\n description={\n lookup.indexTruncated\n ? \"The bounded workspace result was incomplete. Narrow the followed CodeCommit resources, then retry.\"\n : \"This PR is not synchronized into the current workspace yet. Follow its CodeCommit account or repository, then retry.\"\n }\n title=\"PR not found\"\n tone=\"neutral\"\n />\n ) : lookup._tag === \"account-identity-unavailable\" ? (\n <StatePanel\n description=\"Control Center could not map every match to a browser-safe AWS account identity. Refresh Services, then retry.\"\n title=\"Account identity unavailable\"\n tone=\"caution\"\n />\n ) : lookup._tag === \"ambiguous\" ? (\n <Surface as=\"section\" className={styles.matches} form=\"grouped\" padding=\"spacious\" tone=\"secondary\">\n <Text as=\"h2\" variant=\"section-title\">\n Choose the connected account\n </Text>\n <Text tone=\"secondary\" variant=\"body\">\n AWS Console links omit the account. These followed connections contain the same repository and PR number.\n </Text>\n {lookup.candidates.map((candidate) => (\n <Button\n key={candidate.entityId}\n onClick={() => navigate(workspaceEntityPath(session.workspaceId, candidate.entityId))}\n variant=\"secondary\"\n >\n {`${candidate.accountLabel} · ${candidate.title}`}\n </Button>\n ))}\n </Surface>\n ) : null}\n </section>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./lib-6h955hh9.js";import{t}from"./jsx-runtime-NZYk81nU.js";import{
|
|
2
|
-
//# sourceMappingURL=Pages-
|
|
1
|
+
import{t as e}from"./lib-6h955hh9.js";import{t}from"./jsx-runtime-NZYk81nU.js";import{g as n}from"./Dialog-DSwimdwG-BeHnBpPp.js";import{t as r}from"./pages.module-CpW6k_pw.js";var i=t(),a=()=>(0,i.jsx)(`section`,{className:r.page,children:(0,i.jsx)(n,{action:(0,i.jsx)(e,{className:r.textLink,to:`/`,children:`Return to Control Center`}),description:`The requested page does not exist. Check the address or return home.`,title:`Page not found`})});export{a as NotFoundPage};
|
|
2
|
+
//# sourceMappingURL=Pages-DrDuXLFH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pages-
|
|
1
|
+
{"version":3,"file":"Pages-DrDuXLFH.js","names":[],"sources":["../../../src/client/Pages.tsx"],"sourcesContent":["import { StatePanel } from \"@knpkv/rly/primitives\"\nimport type { ReactElement } from \"react\"\nimport { Link } from \"react-router\"\nimport styles from \"./pages.module.css\"\n\n/** Keep an unknown application URL visible and recoverable without substituting another page. */\nexport const NotFoundPage = (): ReactElement => (\n <section className={styles.page}>\n <StatePanel\n action={\n <Link className={styles.textLink} to=\"/\">\n Return to Control Center\n </Link>\n }\n description=\"The requested page does not exist. Check the address or return home.\"\n title=\"Page not found\"\n />\n </section>\n)\n"],"mappings":"0LAMa,OACX,EAAA,EAAA,IAAA,CAAC,UAAD,CAAS,UAAW,EAAO,KACzB,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,UAAW,EAAO,SAAU,GAAG,IAAI,SAAA,0BAEnC,CAAA,EAER,YAAY,uEACZ,MAAM,gBACP,CAAA,CACM,CAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-CwJFpaho.js";import{o as n}from"./hooks-K-sIfGqH.js";import{a as r}from"./lib-6h955hh9.js";import{t as i}from"./jsx-runtime-NZYk81nU.js";import{l as a,r as o}from"./Dialog-DSwimdwG-BeHnBpPp.js";import{p as s}from"./index-BVikncBH.js";import{n as c,t as l}from"./primitives-DYGtIZqB-r-Glkv2i.js";import{Ga as u,Ja as d,Ti as f,_i as p,f as m,ki as h,mi as g,tr as _}from"./agent-api-CUWP1qs8.js";import{a as v,t as y}from"./client-D3WRV6yl.js";import{c as b,u as x}from"./serviceOnboarding-F9Lj6a7y.js";import{t as S}from"./pages.module-CpW6k_pw.js";var C=e(t(),1),w=new Set([`ConflictApiError`,`InvalidRequestApiError`,`ParseError`,`UnauthorizedApiError`]),T=e=>{if(u(e,`_tag`))return d(e._tag)?e._tag:void 0},E=e=>{let t=T(e);return t!==void 0&&w.has(t)?`That code is invalid, expired, or already used.`:t===`ForbiddenApiError`?`Pairing is blocked on this connection. Open Control Center through trusted HTTPS and try again.`:`Control Center is unavailable right now. Check that the server is running, then try again.`},D=i(),O=g(`PairPage.pairBrowser`)(e=>p(function*(){let t=yield*_(m)(e.trim());return yield*(yield*y()).session.pair({payload:{pairingCode:t}})}).pipe(f(v))),k=e=>e===null?`/`:x(e),A=()=>{let e=n(),[t]=r(),{establishSession:i}=s(),[u,d]=(0,C.useState)(``),[f,p]=(0,C.useState)(),[m,g]=(0,C.useState)(!1);return(0,D.jsxs)(`section`,{"aria-labelledby":`pair-title`,className:S.page,children:[(0,D.jsxs)(`header`,{className:S.sectionHeading,children:[(0,D.jsx)(c,{as:`h1`,id:`pair-title`,variant:`page-title`,children:`Pair this browser`}),(0,D.jsx)(c,{tone:`secondary`,variant:`body-large`,children:`Use the one-time code printed by the local Control Center server. It expires after ten minutes.`})]}),(0,D.jsx)(l,{as:`section`,className:S.pairCard,padding:`spacious`,form:`grouped`,tone:`secondary`,children:(0,D.jsxs)(`form`,{className:S.pairForm,onSubmit:n=>{n.preventDefault(),p(void 0),g(!0),h(O(u)).then(n=>{i(n.csrfToken,n.session);let r=b(t,`service`);e(k(r),{replace:!0})},e=>{p(E(e)),g(!1)})},children:[(0,D.jsx)(a,{description:`The code stays in this request and is never placed in a URL.`,label:`Pairing code`,required:!0,...f===void 0?{}:{error:f},children:e=>(0,D.jsx)(`input`,{...e,autoComplete:`one-time-code`,inputMode:`text`,maxLength:64,onChange:e=>d(e.currentTarget.value),spellCheck:!1,value:u})}),(0,D.jsx)(o,{disabled:u.trim().length!==64,loading:m,size:`principal`,type:`submit`,variant:`primary`,children:`Pair browser`})]})})]})};export{A as PairPage,k as pairedBrowserDestination};
|
|
2
|
+
//# sourceMappingURL=PairPage-ByOBKuBB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PairPage-
|
|
1
|
+
{"version":3,"file":"PairPage-ByOBKuBB.js","names":[],"sources":["../../../src/client/PairingFailure.ts","../../../src/client/PairPage.tsx"],"sourcesContent":["import * as Predicate from \"effect/Predicate\"\n\nconst CREDENTIAL_FAILURE_TAGS = new Set([\n \"ConflictApiError\",\n \"InvalidRequestApiError\",\n \"ParseError\",\n \"UnauthorizedApiError\"\n])\n\nconst failureTag = <UnparsedInput>(failure: UnparsedInput): string | undefined => {\n if (!Predicate.hasProperty(failure, \"_tag\")) return undefined\n return Predicate.isString(failure._tag) ? failure._tag : undefined\n}\n\n/** Convert pairing failures into honest, actionable browser copy. */\nexport const pairingFailureMessage = <UnparsedInput>(failure: UnparsedInput): string => {\n const tag = failureTag(failure)\n if (tag !== undefined && CREDENTIAL_FAILURE_TAGS.has(tag)) {\n return \"That code is invalid, expired, or already used.\"\n }\n if (tag === \"ForbiddenApiError\") {\n return \"Pairing is blocked on this connection. Open Control Center through trusted HTTPS and try again.\"\n }\n return \"Control Center is unavailable right now. Check that the server is running, then try again.\"\n}\n","import { Button, Field, Surface, Text } from \"@knpkv/rly/primitives\"\nimport * as Effect from \"effect/Effect\"\nimport * as Schema from \"effect/Schema\"\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\"\nimport { type FormEvent, type ReactElement, useState } from \"react\"\nimport { useNavigate, useSearchParams } from \"react-router\"\n\nimport { makeControlCenterApiClient } from \"../api/client.js\"\nimport { PairingCode } from \"../api/session.js\"\nimport type { ProviderId } from \"../domain/sourceRevision.js\"\nimport { useBrowserSession } from \"./BrowserSession.js\"\nimport { pairingFailureMessage } from \"./PairingFailure.js\"\nimport { selectedServiceProvider, serviceSetupPath } from \"./services/serviceOnboarding.js\"\nimport styles from \"./pages.module.css\"\n\nconst pairBrowser = Effect.fn(\"PairPage.pairBrowser\")((rawPairingCode: string) =>\n Effect.gen(function* () {\n const pairingCode = yield* Schema.decodeUnknownEffect(PairingCode)(rawPairingCode.trim())\n const client = yield* makeControlCenterApiClient()\n return yield* client.session.pair({ payload: { pairingCode } })\n }).pipe(Effect.provide(FetchHttpClient.layer))\n)\n\n/** Preserve explicit service onboarding while ordinary pairing resolves workspace settings. */\nexport const pairedBrowserDestination = (selectedProvider: ProviderId | null): string =>\n selectedProvider === null ? \"/\" : serviceSetupPath(selectedProvider)\n\n/** Pair the current tab without ever exposing the opaque session cookie to JavaScript. */\nexport const PairPage = (): ReactElement => {\n const navigate = useNavigate()\n const [searchParams] = useSearchParams()\n const { establishSession } = useBrowserSession()\n const [pairingCode, setPairingCode] = useState(\"\")\n const [error, setError] = useState<string | undefined>()\n const [isPairing, setIsPairing] = useState(false)\n\n const submit = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault()\n setError(undefined)\n setIsPairing(true)\n Effect.runPromise(pairBrowser(pairingCode)).then(\n (result) => {\n establishSession(result.csrfToken, result.session)\n const selectedProvider = selectedServiceProvider(searchParams, \"service\")\n navigate(pairedBrowserDestination(selectedProvider), { replace: true })\n },\n (failure) => {\n setError(pairingFailureMessage(failure))\n setIsPairing(false)\n }\n )\n }\n\n return (\n <section aria-labelledby=\"pair-title\" className={styles.page}>\n <header className={styles.sectionHeading}>\n <Text as=\"h1\" id=\"pair-title\" variant=\"page-title\">\n Pair this browser\n </Text>\n <Text tone=\"secondary\" variant=\"body-large\">\n Use the one-time code printed by the local Control Center server. It expires after ten minutes.\n </Text>\n </header>\n <Surface as=\"section\" className={styles.pairCard} padding=\"spacious\" form=\"grouped\" tone=\"secondary\">\n <form className={styles.pairForm} onSubmit={submit}>\n <Field\n description=\"The code stays in this request and is never placed in a URL.\"\n label=\"Pairing code\"\n required\n {...(error === undefined ? {} : { error })}\n >\n {(controlProps) => (\n <input\n {...controlProps}\n autoComplete=\"one-time-code\"\n inputMode=\"text\"\n maxLength={64}\n onChange={(event) => setPairingCode(event.currentTarget.value)}\n spellCheck={false}\n value={pairingCode}\n />\n )}\n </Field>\n <Button\n disabled={pairingCode.trim().length !== 64}\n loading={isPairing}\n size=\"principal\"\n type=\"submit\"\n variant=\"primary\"\n >\n Pair browser\n </Button>\n </form>\n </Surface>\n </section>\n )\n}\n"],"mappings":"6nBAEM,EAA0B,IAAI,IAAI,CACtC,mBACA,yBACA,aACA,sBACF,CAAC,EAEK,EAA6B,GAA+C,CAC3E,KAAsB,EAAS,MAAM,EAC1C,OAAO,EAAmB,EAAQ,IAAI,EAAI,EAAQ,KAAO,IAAA,EAC3D,EAGa,EAAwC,GAAmC,CACtF,IAAM,EAAM,EAAW,CAAO,EAO9B,OANI,IAAQ,IAAA,IAAa,EAAwB,IAAI,CAAG,EAC/C,kDAEL,IAAQ,oBACH,kGAEF,4FACT,QCTM,EAAc,EAAU,sBAAsB,CAAC,CAAE,GACrD,EAAW,WAAa,CACtB,IAAM,EAAc,MAAO,EAA2B,CAAW,CAAC,CAAC,EAAe,KAAK,CAAC,EAExF,OAAO,OAAO,MADQ,EAA2B,EAAA,CAC5B,QAAQ,KAAK,CAAE,QAAS,CAAE,aAAY,CAAE,CAAC,CAChE,CAAC,CAAC,CAAC,KAAK,EAAe,CAAqB,CAAC,CAC/C,EAGa,EAA4B,GACvC,IAAqB,KAAO,IAAM,EAAiB,CAAgB,EAGxD,MAA+B,CAC1C,IAAM,EAAW,EAAY,EACvB,CAAC,GAAgB,EAAgB,EACjC,CAAE,oBAAqB,EAAkB,EACzC,CAAC,EAAa,IAAA,EAAkB,EAAA,SAAA,CAAS,EAAE,EAC3C,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAA6B,EACjD,CAAC,EAAW,IAAA,EAAgB,EAAA,SAAA,CAAS,EAAK,EAmBhD,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,kBAAgB,aAAa,UAAW,EAAO,KAAxD,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,eAA1B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,KAAK,GAAG,aAAa,QAAQ,aAAa,SAAA,mBAE7C,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAK,YAAY,QAAQ,aAAa,SAAA,iGAEtC,CAAA,CACA,CACR,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,GAAG,UAAU,UAAW,EAAO,SAAU,QAAQ,WAAW,KAAK,UAAU,KAAK,YACvF,UAAA,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAU,SA5BxB,GAA4C,CAC1D,EAAM,eAAe,EACrB,EAAS,IAAA,EAAS,EAClB,EAAa,EAAI,EACjB,EAAkB,EAAY,CAAW,CAAC,CAAC,CAAC,KACzC,GAAW,CACV,EAAiB,EAAO,UAAW,EAAO,OAAO,EACjD,IAAM,EAAmB,EAAwB,EAAc,SAAS,EACxE,EAAS,EAAyB,CAAgB,EAAG,CAAE,QAAS,EAAK,CAAC,CACxE,EACC,GAAY,CACX,EAAS,EAAsB,CAAO,CAAC,EACvC,EAAa,EAAK,CACpB,CACF,CACF,EAaM,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,YAAY,+DACZ,MAAM,eACN,SAAA,GACA,GAAK,IAAU,IAAA,GAAY,CAAC,EAAI,CAAE,OAAM,EAEtC,SAAA,IACA,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,GAAI,EACJ,aAAa,gBACb,UAAU,OACV,UAAW,GACX,SAAW,GAAU,EAAe,EAAM,cAAc,KAAK,EAC7D,WAAY,GACZ,MAAO,CACR,CAAA,CAEE,CAAA,GACP,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,SAAU,EAAY,KAAK,CAAC,CAAC,SAAW,GACxC,QAAS,EACT,KAAK,YACL,KAAK,SACL,QAAQ,UACT,SAAA,cAEO,CAAA,CACJ,GACC,CAAA,CACF,GAEb"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-CwJFpaho.js";import{i as n,n as r,r as i,t as a}from"./loader-circle-Dem7LJJw.js";import{t as o}from"./jsx-runtime-NZYk81nU.js";var s=e(n(),1),c=e(t(),1),l=Object.defineProperty,u=(e,t)=>l(e,`name`,{value:t,configurable:!0});function d(e,t){if(typeof e==`function`)return e(t);e!=null&&(e.current=t)}u(d,`setRef`);function f(...e){return t=>{let n=!1,r=e.map(e=>{let r=d(e,t);return!n&&typeof r==`function`&&(n=!0),r});if(n)return()=>{for(let t=0;t<r.length;t++){let n=r[t];typeof n==`function`?n():d(e[t],null)}}}}u(f,`composeRefs`);function p(...e){return c.useCallback(f(...e),e)}u(p,`useComposedRefs`);var ee=Object.defineProperty,m=(e,t)=>ee(e,`name`,{value:t,configurable:!0});function h(e){let t=c.forwardRef((t,n)=>{let{children:r,...i}=t,a=null,o=!1,s=[];C(r)&&typeof T==`function`&&(r=T(r._payload)),c.Children.forEach(r,e=>{if(x(e)){o=!0;let t=e,n=`child`in t.props?t.props.child:t.props.children;C(n)&&typeof T==`function`&&(n=T(n._payload)),a=v(t,n),s.push(a?.props?.children)}else s.push(e)}),a?a=c.cloneElement(a,void 0,s):!o&&c.Children.count(r)===1&&c.isValidElement(r)&&(a=r);let l=a?b(a):void 0,u=p(n,l);if(!a){if(r||r===0)throw Error(o?re(e):ne(e));return r}let d=y(i,a.props??{});return a.type!==c.Fragment&&(d.ref=n?u:l),c.cloneElement(a,d)});return t.displayName=`${e}.Slot`,t}m(h,`createSlot`);var g=h(`Slot`),_=Symbol.for(`radix.slottable`);function te(e){let t=m(e=>`child`in e?e.children(e.child):e.children,`Slottable`);return t.displayName=`${e}.Slottable`,t.__radixId=_,t}m(te,`createSlottable`);var v=m((e,t)=>{if(`child`in e.props){let t=e.props.child;return c.isValidElement(t)?c.cloneElement(t,void 0,e.props.children(t.props.children)):null}return c.isValidElement(t)?t:null},`getSlottableElementFromSlottable`);function y(e,t){let n={...t};for(let r in t){let i=e[r],a=t[r];/^on[A-Z]/.test(r)?i&&a?n[r]=(...e)=>{let t=a(...e);return i(...e),t}:i&&(n[r]=i):r===`style`?n[r]={...i,...a}:r===`className`&&(n[r]=[i,a].filter(Boolean).join(` `))}return{...e,...n}}m(y,`mergeProps`);function b(e){let t=Object.getOwnPropertyDescriptor(e.props,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}m(b,`getElementRef`);function x(e){return c.isValidElement(e)&&typeof e.type==`function`&&`__radixId`in e.type&&e.type.__radixId===_}m(x,`isSlottable`);var S=Symbol.for(`react.lazy`);function C(e){return typeof e==`object`&&!!e&&`$$typeof`in e&&e.$$typeof===S&&`_payload`in e&&w(e._payload)}m(C,`isLazyComponent`);function w(e){return typeof e==`object`&&!!e&&`then`in e}m(w,`isPromiseLike`);var ne=m(e=>`${e} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,`createSlotError`),re=m(e=>`${e} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,`createSlottableError`),T=c.use,E=o(),D=Object.defineProperty,O=(e,t)=>D(e,`name`,{value:t,configurable:!0}),k=[`a`,`button`,`div`,`form`,`h2`,`h3`,`img`,`input`,`label`,`li`,`nav`,`ol`,`p`,`select`,`span`,`svg`,`ul`].reduce((e,t)=>{let n=h(`Primitive.${t}`),r=c.forwardRef((e,r)=>{let{asChild:i,...a}=e,o=i?n:t;return typeof window<`u`&&(window[Symbol.for(`radix-ui`)]=!0),(0,E.jsx)(o,{...a,ref:r})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{});function A(e,t){e&&s.flushSync(()=>e.dispatchEvent(t))}O(A,`dispatchDiscreteCustomEvent`);var j=Object.defineProperty,M=(e,t)=>j(e,`name`,{value:t,configurable:!0}),N=Object.freeze({position:`absolute`,border:0,width:1,height:1,padding:0,margin:-1,overflow:`hidden`,clip:`rect(0, 0, 0, 0)`,whiteSpace:`nowrap`,wordWrap:`normal`}),P=c.forwardRef(M(function(e,t){return(0,E.jsx)(k.span,{...e,ref:t,style:{...N,...e.style}})},`VisuallyHidden`)),F=Object.defineProperty,I=((e,t)=>F(e,`name`,{value:t,configurable:!0}))(({children:e,label:t})=>{let n=c.Children.only(e);return(0,E.jsxs)(E.Fragment,{children:[c.cloneElement(n,{"aria-hidden":`true`,focusable:`false`}),(0,E.jsx)(P,{children:t})]})},`AccessibleIcon`),L=i(`arrow-down`,[[`path`,{d:`M12 5v14`,key:`s699le`}],[`path`,{d:`m19 12-7 7-7-7`,key:`1idqje`}]]),R=i(`arrow-left`,[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]]),z=i(`arrow-right`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`m12 5 7 7-7 7`,key:`xquz4c`}]]),B=i(`arrow-up`,[[`path`,{d:`m5 12 7-7 7 7`,key:`hav0vg`}],[`path`,{d:`M12 19V5`,key:`x0mq9r`}]]),V=i(`check`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]),H=i(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),ie=i(`chevron-left`,[[`path`,{d:`m15 18-6-6 6-6`,key:`1wnfg3`}]]),U=i(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),W=i(`chevron-up`,[[`path`,{d:`m18 15-6-6-6 6`,key:`153udz`}]]),G=i(`clock`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 6v6l4 2`,key:`mmk7yg`}]]),K=i(`external-link`,[[`path`,{d:`M15 3h6v6`,key:`1q9fwt`}],[`path`,{d:`M10 14 21 3`,key:`gplh6r`}],[`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`,key:`a6xqqp`}]]),q=i(`file`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}]]),J=i(`link`,[[`path`,{d:`M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71`,key:`1cjeqo`}],[`path`,{d:`M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71`,key:`19qd67`}]]),Y=i(`menu`,[[`path`,{d:`M4 5h16`,key:`1tepv9`}],[`path`,{d:`M4 12h16`,key:`1lakjw`}],[`path`,{d:`M4 19h16`,key:`1djgab`}]]),ae=i(`minus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}]]),oe=i(`plus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),se=i(`search`,[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]),ce=i(`user`,[[`path`,{d:`M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2`,key:`975kel`}],[`circle`,{cx:`12`,cy:`7`,r:`4`,key:`17ys0d`}]]),le=i(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]),X={size:{small:{pixels:16,purpose:`Dense metadata and supporting controls`},default:{pixels:20,purpose:`Standard interface controls`},large:{pixels:24,purpose:`Prominent standalone indicators`}}},ue={size:`default`},de={"arrow-down":L,"arrow-left":R,"arrow-right":z,"arrow-up":B,check:V,"chevron-down":H,"chevron-left":ie,"chevron-right":U,"chevron-up":W,alert:r,clock:G,"external-link":K,file:q,link:J,loader:a,menu:Y,minus:ae,plus:oe,search:se,user:ce,close:le},fe=e=>X.size[e??ue.size].pixels,pe=e=>{let t=de[e.name],n=fe(e.size),r={className:e.className,color:`currentColor`,focusable:!1,height:n,strokeWidth:1.75,width:n};if(e.decorative)return(0,E.jsx)(t,{...r,"aria-hidden":`true`});if(e.label.trim().length===0)throw Error(`Informative Icon labels must contain visible text`);return(0,E.jsx)(I,{label:e.label,children:(0,E.jsx)(t,{...r})})},Z={available:!1},Q=(0,c.createContext)(Z),$=()=>(0,c.useContext)(Q),me=({children:e})=>{let t=$();return t.available?e(t.container):null},he=({children:e,container:t})=>{let[n,r]=(0,c.useState)(null),i=t===void 0?n:t,a=i===null?Z:{available:!0,container:i};return(0,E.jsxs)(Q.Provider,{value:a,children:[e,t===void 0?(0,E.jsx)(`div`,{"data-rly-portal-root":``,ref:r}):null]})};export{N as a,g as c,pe as i,h as l,me as n,k as o,he as r,A as s,$ as t,p as u};
|
|
2
|
+
//# sourceMappingURL=PortalProvider-CN_81Fy3-D_japesx.js.map
|