@activecollab/components 2.0.342 → 2.0.344

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.
Files changed (45) hide show
  1. package/dist/cjs/components/Icons/collection/{SourceCode.js → GitRepository.js} +13 -11
  2. package/dist/cjs/components/Icons/collection/GitRepository.js.map +1 -0
  3. package/dist/cjs/components/Icons/collection/index.js +7 -7
  4. package/dist/cjs/components/Icons/collection/index.js.map +1 -1
  5. package/dist/cjs/presentation/shared/ConnectRepositoryDialog.js +272 -0
  6. package/dist/cjs/presentation/shared/ConnectRepositoryDialog.js.map +1 -0
  7. package/dist/cjs/presentation/shared/LinkBranchOrPullRequestDialog.js +690 -0
  8. package/dist/cjs/presentation/shared/LinkBranchOrPullRequestDialog.js.map +1 -0
  9. package/dist/cjs/presentation/shared/headers.js +259 -32
  10. package/dist/cjs/presentation/shared/headers.js.map +1 -1
  11. package/dist/cjs/presentation/shared/index.js +51 -0
  12. package/dist/cjs/presentation/shared/index.js.map +1 -1
  13. package/dist/esm/components/Icons/collection/GitRepository.d.ts +16 -0
  14. package/dist/esm/components/Icons/collection/GitRepository.d.ts.map +1 -0
  15. package/dist/esm/components/Icons/collection/{SourceCode.js → GitRepository.js} +13 -11
  16. package/dist/esm/components/Icons/collection/GitRepository.js.map +1 -0
  17. package/dist/esm/components/Icons/collection/index.d.ts +1 -1
  18. package/dist/esm/components/Icons/collection/index.d.ts.map +1 -1
  19. package/dist/esm/components/Icons/collection/index.js +1 -1
  20. package/dist/esm/components/Icons/collection/index.js.map +1 -1
  21. package/dist/esm/presentation/shared/ConnectRepositoryDialog.d.ts +51 -0
  22. package/dist/esm/presentation/shared/ConnectRepositoryDialog.d.ts.map +1 -0
  23. package/dist/esm/presentation/shared/ConnectRepositoryDialog.js +225 -0
  24. package/dist/esm/presentation/shared/ConnectRepositoryDialog.js.map +1 -0
  25. package/dist/esm/presentation/shared/LinkBranchOrPullRequestDialog.d.ts +7 -0
  26. package/dist/esm/presentation/shared/LinkBranchOrPullRequestDialog.d.ts.map +1 -0
  27. package/dist/esm/presentation/shared/LinkBranchOrPullRequestDialog.js +579 -0
  28. package/dist/esm/presentation/shared/LinkBranchOrPullRequestDialog.js.map +1 -0
  29. package/dist/esm/presentation/shared/headers.d.ts +8 -1
  30. package/dist/esm/presentation/shared/headers.d.ts.map +1 -1
  31. package/dist/esm/presentation/shared/headers.js +224 -30
  32. package/dist/esm/presentation/shared/headers.js.map +1 -1
  33. package/dist/esm/presentation/shared/index.d.ts +4 -0
  34. package/dist/esm/presentation/shared/index.d.ts.map +1 -1
  35. package/dist/esm/presentation/shared/index.js +2 -0
  36. package/dist/esm/presentation/shared/index.js.map +1 -1
  37. package/dist/index.js +229 -227
  38. package/dist/index.js.map +1 -1
  39. package/dist/index.min.js +1 -1
  40. package/dist/index.min.js.map +1 -1
  41. package/package.json +1 -1
  42. package/dist/cjs/components/Icons/collection/SourceCode.js.map +0 -1
  43. package/dist/esm/components/Icons/collection/SourceCode.d.ts +0 -16
  44. package/dist/esm/components/Icons/collection/SourceCode.d.ts.map +0 -1
  45. package/dist/esm/components/Icons/collection/SourceCode.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinkBranchOrPullRequestDialog.js","names":["_react","_interopRequireWildcard","require","_styledComponents","_ConnectRepositoryDialog","_Button","_ChooseV","_Dialog","_Input","_Label","_Loaders","_Select","_SelectTrigger","_Typography","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","a","_arrayLikeToArray","toString","slice","constructor","name","Array","from","test","length","l","Symbol","iterator","u","next","done","push","value","return","isArray","SANS","LINKABLES","id","kind","repoId","updatedMinutesAgo","author","MONTHS","pad","String","padStart","formatAgo","minutesAgo","now","Date","then","getTime","concat","Math","floor","time","getHours","getMinutes","toDateString","yesterday","monthDay","getMonth","getDate","getFullYear","linkableDetail","item","GROUPED_OPTIONS","PROJECT_REPOSITORIES","map","repo","connection","CONNECTIONS","find","c","connectionId","items","filter","sort","b","additionalInfo","serviceLabel","service","options","group","localeCompare","ALL_ITEMS","BRANCHES","isDefault","repoBranches","repoDefaultBranchId","_repoBranches$find$id","_repoBranches$find","baseBranchOptions","branches","defaults","rest","sourceBranchOptions","StyledLinkBody","styled","div","withConfig","displayName","componentId","MenuGlobalStyle","createGlobalStyle","_ref","$menuWidth","BranchMenuGlobalStyle","p","$cls","$w","BranchSelectWrap","BranchSelect","_ref2","_options$find$name","_options$find","selected","onChange","_ref2$placeholder","placeholder","wrapRef","useRef","_useState","useState","_useState2","menuWidth","setMenuWidth","_useState3","random","_useState4","menuCls","measure","useCallback","current","offsetWidth","useEffect","selectedName","createElement","ref","Select","undefined","v","selectClassName","onSelectOpen","disabledInternalSort","forceCloseMenu","target","SelectTrigger","className","typographyProps","color","MODE_OPTIONS","LinkBranchOrPullRequestDialog","exports","_ref3","_ALL_ITEMS$find$name","_ALL_ITEMS$find","open","onClose","_useState5","_useState6","mode","setMode","_useState7","_useState8","setSelected","_useState9","_useState0","branchName","setBranchName","_useState1","_useState10","prTitle","setPrTitle","_useState11","_useState12","attempted","setAttempted","_useState13","_useState14","loading","setLoading","_useState15","_useState16","_useState17","_useState18","setRepo","_useState19","_useState20","connectOpen","setConnectOpen","_useState21","_useState22","extraRepos","setExtraRepos","_useState23","_useState24","createFrom","setCreateFrom","_useState25","_useState26","sourceBranch","setSourceBranch","_useState27","_useState28","mergeInto","setMergeInto","defaultId","fieldRef","timer","window","setTimeout","clearTimeout","measureMenu","existingInvalid","branchInvalid","trim","titleInvalid","primaryLabel","close","handleSubmit","valid","changeMode","selectedLabel","projectRepos","connectableRepos","CONNECTABLE_REPOSITORIES","some","handleConnected","connected","prev","renderRepositoryField","Label","size","RepositorySelect","repositories","connections","Caption1","type","onClick","Fragment","Dialog","disableCloseOnEsc","Title","ContentDivider","Content","SkeletonLoader","ChooseV2","required","ids","invalid","Input","Actions","Button","variant","style","marginRight","disabled","ConnectRepositoryDialog","onConnect"],"sources":["../../../../src/presentation/shared/LinkBranchOrPullRequestDialog.tsx"],"sourcesContent":["import React, {\n ReactElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\n\nimport styled, { createGlobalStyle } from \"styled-components\";\n\nimport {\n CONNECTABLE_REPOSITORIES,\n CONNECTIONS,\n ConnectRepositoryDialog,\n PROJECT_REPOSITORIES,\n Repository,\n RepositorySelect,\n serviceLabel,\n} from \"./ConnectRepositoryDialog\";\nimport { Button } from \"../../components/Button\";\nimport { ChooseV2 } from \"../../components/ChooseV2\";\nimport { Dialog } from \"../../components/Dialog\";\nimport { Input } from \"../../components/Input\";\nimport { Label } from \"../../components/Label\";\nimport { SkeletonLoader } from \"../../components/Loaders\";\nimport { Select } from \"../../components/Select\";\nimport { SelectTrigger } from \"../../components/SelectTrigger\";\nimport { Caption1 } from \"../../components/Typography\";\n\n/**\n * \"Link Branch or Pull Request\" dialog — shared by every `Presentation/Task\n * Source` story (the empty state and the populated Source Code section) so the\n * flow lives in one place.\n *\n * Three modes (ChooseV2): **Link Existing** (default), **New Branch**, **New\n * Pull Request**. The primary button is always enabled; validation runs on\n * click and outlines the offending field. Esc does not close the dialog (it\n * would lose entered data) — this is an action dialog.\n *\n * On open the body shows a ~1s skeleton, standing in for the future API loads\n * that will drive the repository / branch / PR pickers.\n *\n * The **Link Existing** picker is a grouped, multi-level select: options are\n * grouped by repository (with the connection name in parentheses), each option\n * carries a branch or pull-request icon, everything is sorted by name and\n * filterable via the search box at the top. The menu is sized to match the\n * trigger width.\n */\n\nconst SANS =\n '-apple-system, BlinkMacSystemFont, \"Roboto\", \"Helvetica Neue\", Arial, sans-serif';\n\n/* ---- Mock data ------------------------------------------------------- */\n\ntype LinkableKind = \"branch\" | \"pr\";\n\ninterface Linkable {\n id: string;\n kind: LinkableKind;\n name: string;\n /** Repository this branch / PR belongs to (references PROJECT_REPOSITORIES). */\n repoId: string;\n /** Minutes since the last activity — drives the Ago label and the ordering. */\n updatedMinutesAgo: number;\n /** Author, shown for pull requests (\"… by Name\"). */\n author?: string;\n}\n\nconst LINKABLES: Linkable[] = [\n {\n id: \"pr-500\",\n kind: \"pr\",\n // Deliberately long, to show the name truncating with an ellipsis while the\n // right-aligned detail and radio stay visible.\n name: \"#500 Refactor rank recalculation to support multi-region contract archival and backfill\",\n repoId: \"backend\",\n updatedMinutesAgo: 8,\n author: \"Nikola M.\",\n },\n {\n id: \"branch-cache\",\n kind: \"branch\",\n name: \"spike/rank-cache\",\n repoId: \"backend\",\n updatedMinutesAgo: 30,\n },\n {\n id: \"branch-export\",\n kind: \"branch\",\n name: \"feature/retainer-export-34\",\n repoId: \"backend\",\n updatedMinutesAgo: 5 * 60,\n },\n {\n id: \"pr-119900\",\n kind: \"pr\",\n name: \"#119900 Rank API endpoints\",\n repoId: \"backend\",\n updatedMinutesAgo: 2 * 24 * 60,\n author: \"Ilija S.\",\n },\n {\n id: \"branch-fe-retainers\",\n kind: \"branch\",\n name: \"feature/retainers-ui-34\",\n repoId: \"frontend\",\n updatedMinutesAgo: 2 * 60,\n },\n {\n id: \"pr-412\",\n kind: \"pr\",\n name: \"#412 Contract list filters\",\n repoId: \"frontend\",\n updatedMinutesAgo: 24 * 60,\n author: \"Marko K.\",\n },\n {\n id: \"mr-88\",\n kind: \"pr\",\n name: \"!88 Bump worker memory\",\n repoId: \"infra\",\n updatedMinutesAgo: 3 * 24 * 60,\n author: \"Ana P.\",\n },\n {\n id: \"branch-deploy\",\n kind: \"branch\",\n name: \"chore/deploy-rank-cache\",\n repoId: \"infra\",\n updatedMinutesAgo: 24 * 60,\n },\n];\n\nconst MONTHS = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nconst pad = (n: number): string => String(n).padStart(2, \"0\");\n\n/**\n * Reproduces the format of ActiveCollab's standard `Ago` component\n * (`Angie.functions.ago()`) for the mock: \"Just now\", \"N minutes ago\",\n * \"Today HH:mm\", \"Yesterday HH:mm\", \"MMM D. HH:mm\", else \"MMM D. YYYY HH:mm\".\n * Production must use the real component.\n */\nconst formatAgo = (minutesAgo: number): string => {\n const now = new Date();\n const then = new Date(now.getTime() - minutesAgo * 60000);\n if (minutesAgo < 2) {\n return \"Just now\";\n }\n if (minutesAgo < 60) {\n return `${Math.floor(minutesAgo)} minutes ago`;\n }\n const time = `${pad(then.getHours())}:${pad(then.getMinutes())}`;\n if (then.toDateString() === now.toDateString()) {\n return `Today ${time}`;\n }\n const yesterday = new Date(now.getTime() - 24 * 60 * 60000);\n if (then.toDateString() === yesterday.toDateString()) {\n return `Yesterday ${time}`;\n }\n const monthDay = `${MONTHS[then.getMonth()]} ${then.getDate()}.`;\n if (then.getFullYear() === now.getFullYear()) {\n return `${monthDay} ${time}`;\n }\n return `${monthDay} ${then.getFullYear()} ${time}`;\n};\n\n/**\n * The detail shown on the right of an option: a branch keeps just the time of\n * its last activity; a pull request appends the author (\"… by Name\").\n */\nconst linkableDetail = (item: Linkable): string =>\n item.kind === \"pr\" && item.author\n ? `${formatAgo(item.updatedMinutesAgo)} by ${item.author}`\n : formatAgo(item.updatedMinutesAgo);\n\n/**\n * Grouped options for the Select. One group per repository, labelled\n * \"repo (Org, Type)\" and sorted by name; inside a group, branches and PRs are\n * ordered by latest activity (freshest first). Standard option rendering shows\n * the name (truncated) with the detail right-aligned and a radio.\n */\nconst GROUPED_OPTIONS = PROJECT_REPOSITORIES.map((repo) => {\n const connection = CONNECTIONS.find((c) => c.id === repo.connectionId);\n const items = LINKABLES.filter((l) => l.repoId === repo.id)\n .sort((a, b) => a.updatedMinutesAgo - b.updatedMinutesAgo)\n .map((l) => ({\n id: l.id,\n name: l.name,\n additionalInfo: linkableDetail(l),\n }));\n return {\n id: repo.id,\n name: connection\n ? `${repo.name} (${connection.name}, ${serviceLabel(connection.service)})`\n : repo.name,\n options: items,\n };\n})\n .filter((group) => group.options.length > 0)\n .sort((a, b) => a.name.localeCompare(b.name));\n\nconst ALL_ITEMS: Linkable[] = LINKABLES;\n\n/* ---- Branch mock data (for the New Branch / New Pull Request bases) --- */\n\ninterface Branch {\n id: string;\n name: string;\n repoId: string;\n /** The repository's default branch (main / master). */\n isDefault?: boolean;\n updatedMinutesAgo: number;\n}\n\nconst BRANCHES: Branch[] = [\n // activecollab/backend\n {\n id: \"backend-main\",\n name: \"main\",\n repoId: \"backend\",\n isDefault: true,\n updatedMinutesAgo: 60,\n },\n {\n id: \"backend-cache\",\n name: \"spike/rank-cache\",\n repoId: \"backend\",\n updatedMinutesAgo: 30,\n },\n {\n id: \"backend-export\",\n name: \"feature/retainer-export-34\",\n repoId: \"backend\",\n updatedMinutesAgo: 5 * 60,\n },\n {\n id: \"backend-hotfix\",\n name: \"hotfix/rank-typo\",\n repoId: \"backend\",\n updatedMinutesAgo: 3 * 24 * 60,\n },\n // activecollab/frontend\n {\n id: \"frontend-main\",\n name: \"main\",\n repoId: \"frontend\",\n isDefault: true,\n updatedMinutesAgo: 90,\n },\n {\n id: \"frontend-retainers\",\n name: \"feature/retainers-ui-34\",\n repoId: \"frontend\",\n updatedMinutesAgo: 2 * 60,\n },\n {\n id: \"frontend-filters\",\n name: \"feature/contract-filters\",\n repoId: \"frontend\",\n updatedMinutesAgo: 24 * 60,\n },\n // activecollab/infrastructure\n {\n id: \"infra-master\",\n name: \"master\",\n repoId: \"infra\",\n isDefault: true,\n updatedMinutesAgo: 6 * 60,\n },\n {\n id: \"infra-deploy\",\n name: \"chore/deploy-rank-cache\",\n repoId: \"infra\",\n updatedMinutesAgo: 24 * 60,\n },\n];\n\nconst repoBranches = (repoId: string): Branch[] =>\n BRANCHES.filter((b) => b.repoId === repoId);\n\nconst repoDefaultBranchId = (repoId: string): string | null =>\n repoBranches(repoId).find((b) => b.isDefault)?.id ?? null;\n\ninterface BranchOption {\n id: string;\n name: string;\n additionalInfo?: string;\n}\n\n/**\n * Base-branch options (Create From / Merge Into): the default branch first with\n * no timestamp, then the rest sorted by latest activity (freshest first), each\n * with a muted \"last activity\" time.\n */\nconst baseBranchOptions = (repoId: string): BranchOption[] => {\n const branches = repoBranches(repoId);\n const defaults = branches\n .filter((b) => b.isDefault)\n .map((b) => ({ id: b.id, name: b.name }));\n const rest = branches\n .filter((b) => !b.isDefault)\n .sort((a, b) => a.updatedMinutesAgo - b.updatedMinutesAgo)\n .map((b) => ({\n id: b.id,\n name: b.name,\n additionalInfo: formatAgo(b.updatedMinutesAgo),\n }));\n return [...defaults, ...rest];\n};\n\n/**\n * Source-branch options (New Pull Request): the default branch is excluded — you\n * don't open a PR to merge the trunk into a feature branch — and the rest are\n * sorted by latest activity, each with a muted \"last activity\" time.\n */\nconst sourceBranchOptions = (repoId: string): BranchOption[] =>\n repoBranches(repoId)\n .filter((b) => !b.isDefault)\n .sort((a, b) => a.updatedMinutesAgo - b.updatedMinutesAgo)\n .map((b) => ({\n id: b.id,\n name: b.name,\n additionalInfo: formatAgo(b.updatedMinutesAgo),\n }));\n\n/* ---- Styles ---------------------------------------------------------- */\n\nconst StyledLinkBody = styled.div`\n font-family: ${SANS};\n\n .lk-tabbody {\n margin-top: 18px;\n }\n\n .lk-field {\n margin-bottom: 16px;\n }\n .lk-field:last-child {\n margin-bottom: 0;\n }\n .lk-label {\n display: block;\n margin-bottom: 6px;\n }\n /* DS Input wrapper is 360px and SelectTrigger 300px — fill the dialog. */\n .lk-control,\n .lk-control.c-input-wrapper {\n width: 100%;\n max-width: none;\n }\n\n /* Explainer + inline connect link under the repository picker. */\n .lk-repo-hint {\n display: block;\n margin-top: 8px;\n }\n .lk-repo-link {\n background: none;\n border: none;\n padding: 0;\n font: inherit;\n color: var(--color-primary);\n cursor: pointer;\n }\n .lk-repo-link:hover {\n text-decoration: underline;\n }\n\n /* Skeleton placeholder shown for ~1s while the pickers \"load\". */\n .lk-skeleton .sk-row {\n margin-bottom: 18px;\n }\n .lk-skeleton .sk-choose {\n width: 100%;\n height: 36px;\n border-radius: 6px;\n }\n .lk-skeleton .sk-label {\n width: 160px;\n height: 12px;\n margin-bottom: 8px;\n }\n .lk-skeleton .sk-control {\n width: 100%;\n height: 40px;\n border-radius: 6px;\n }\n`;\n\n/**\n * The grouped select menu renders through a portal, so the \"match the trigger\n * width\" override has to be global, scoped to the menu's class. `$menuWidth` is\n * measured from the trigger and injected here.\n */\nconst MenuGlobalStyle = createGlobalStyle<{ $menuWidth?: number }>`\n .c-select.lk-existing-select-menu {\n ${({ $menuWidth }) =>\n $menuWidth\n ? `width: ${$menuWidth}px !important; max-width: none !important;`\n : \"\"}\n }\n\n /* Standard secondary styling for the right-aligned detail (last activity /\n author). The DS AdditionalInfo span ships unstyled and otherwise inherits\n the option name's dark weight; mute it so it reads as a secondary detail. */\n .c-select.lk-existing-select-menu .c-option--text + span {\n color: var(--color-theme-600);\n font-size: 12px;\n }\n`;\n\n/**\n * Per-instance global style for a branch select menu: matches the trigger width\n * and applies the standard muted styling to the right-aligned \"last activity\".\n */\nconst BranchMenuGlobalStyle = createGlobalStyle<{ $cls: string; $w?: number }>`\n .c-select.${(p) => p.$cls} {\n ${(p) =>\n p.$w ? `width: ${p.$w}px !important; max-width: none !important;` : \"\"}\n }\n .c-select.${(p) => p.$cls} .c-option--text + span {\n color: var(--color-theme-600);\n font-size: 12px;\n }\n`;\n\nconst BranchSelectWrap = styled.div`\n font-family: ${SANS};\n\n .branch-trigger {\n width: 100%;\n max-width: none;\n }\n`;\n\ninterface BranchSelectProps {\n options: BranchOption[];\n selected: string | null;\n onChange: (id: string) => void;\n placeholder?: string;\n}\n\n/**\n * Flat branch picker (Create From / Source Branch / Merge Into). The caller\n * supplies the option order (default-first or activity-sorted); the DS internal\n * alphabetical sort is disabled so that order is preserved.\n */\nconst BranchSelect = ({\n options,\n selected,\n onChange,\n placeholder = \"Select branch\",\n}: BranchSelectProps): ReactElement => {\n const wrapRef = useRef<HTMLDivElement>(null);\n const [menuWidth, setMenuWidth] = useState<number | undefined>();\n const [menuCls] = useState(\n () => `branch-select-menu-${Math.random().toString(36).slice(2)}`\n );\n\n const measure = useCallback(() => {\n if (wrapRef.current) {\n setMenuWidth(wrapRef.current.offsetWidth);\n }\n }, []);\n\n useEffect(() => {\n measure();\n }, [measure]);\n\n const selectedName =\n options.find((o) => o.id === selected)?.name ?? placeholder;\n\n return (\n <BranchSelectWrap ref={wrapRef}>\n <BranchMenuGlobalStyle $cls={menuCls} $w={menuWidth} />\n <Select\n options={options}\n selected={selected === null ? undefined : selected}\n onChange={(v) => onChange(String(v))}\n placeholder=\"Search branches\"\n selectClassName={menuCls}\n onSelectOpen={measure}\n disabledInternalSort\n forceCloseMenu\n target={\n <SelectTrigger\n className=\"branch-trigger\"\n typographyProps={\n selected === null ? { color: \"tertiary\" } : undefined\n }\n >\n {selectedName}\n </SelectTrigger>\n }\n />\n </BranchSelectWrap>\n );\n};\n\ntype LinkMode = \"existing\" | \"branch\" | \"pr\";\n\nconst MODE_OPTIONS = [\n { id: \"existing\", name: \"Link Existing\" },\n { id: \"branch\", name: \"New Branch\" },\n { id: \"pr\", name: \"New Pull Request\" },\n];\n\nexport interface LinkBranchOrPullRequestDialogProps {\n open: boolean;\n onClose: () => void;\n}\n\nexport const LinkBranchOrPullRequestDialog = ({\n open,\n onClose,\n}: LinkBranchOrPullRequestDialogProps): ReactElement => {\n const [mode, setMode] = useState<LinkMode>(\"existing\");\n const [selected, setSelected] = useState<string | null>(null);\n const [branchName, setBranchName] = useState(\"feature/retainers-34\");\n const [prTitle, setPrTitle] = useState(\n \"#34 Retainers & Contracts functionality\"\n );\n const [attempted, setAttempted] = useState(false);\n const [loading, setLoading] = useState(true);\n const [menuWidth, setMenuWidth] = useState<number | undefined>();\n\n // Repository picker (New Branch / New Pull Request) + connect-repository flow.\n const [repo, setRepo] = useState<string>(\"backend\");\n const [connectOpen, setConnectOpen] = useState(false);\n const [extraRepos, setExtraRepos] = useState<Repository[]>([]);\n\n // Branch bases. Create From / Merge Into default to the repo's default branch;\n // Source Branch starts unselected.\n const [createFrom, setCreateFrom] = useState<string | null>(() =>\n repoDefaultBranchId(\"backend\")\n );\n const [sourceBranch, setSourceBranch] = useState<string | null>(null);\n const [mergeInto, setMergeInto] = useState<string | null>(() =>\n repoDefaultBranchId(\"backend\")\n );\n\n // When the repository changes, reset the bases: default branch for\n // Create From / Merge Into, nothing for Source Branch.\n useEffect(() => {\n const defaultId = repoDefaultBranchId(repo);\n setCreateFrom(defaultId);\n setMergeInto(defaultId);\n setSourceBranch(null);\n }, [repo]);\n\n const fieldRef = useRef<HTMLDivElement>(null);\n\n // Simulate the API loads that will drive the pickers: a ~1s skeleton on open.\n useEffect(() => {\n if (!open) {\n return undefined;\n }\n setLoading(true);\n const timer = window.setTimeout(() => setLoading(false), 1000);\n return () => window.clearTimeout(timer);\n }, [open]);\n\n const measureMenu = useCallback(() => {\n if (fieldRef.current) {\n setMenuWidth(fieldRef.current.offsetWidth);\n }\n }, []);\n\n // Keep the menu width in sync with the trigger once the form is visible.\n useEffect(() => {\n if (open && !loading && mode === \"existing\") {\n measureMenu();\n }\n }, [open, loading, mode, measureMenu]);\n\n // Submit is always enabled; validation runs on click and outlines fields.\n const existingInvalid = attempted && mode === \"existing\" && selected === null;\n const branchInvalid =\n attempted && mode === \"branch\" && branchName.trim() === \"\";\n const titleInvalid = attempted && mode === \"pr\" && prTitle.trim() === \"\";\n\n const primaryLabel =\n mode === \"existing\"\n ? \"Link\"\n : mode === \"branch\"\n ? \"Create Branch\"\n : \"Create Pull Request\";\n\n const close = () => {\n setAttempted(false);\n onClose();\n };\n\n const handleSubmit = () => {\n const valid =\n mode === \"existing\"\n ? selected !== null\n : mode === \"branch\"\n ? branchName.trim() !== \"\"\n : prTitle.trim() !== \"\";\n if (!valid) {\n setAttempted(true);\n return;\n }\n close();\n };\n\n const changeMode = (next: LinkMode) => {\n setMode(next);\n setAttempted(false);\n };\n\n const selectedLabel =\n ALL_ITEMS.find((o) => o.id === selected)?.name ??\n \"Select branch or pull request\";\n\n // Repositories already on the project (plus any just connected), and the\n // remaining ones that can still be connected from here.\n const projectRepos = [...PROJECT_REPOSITORIES, ...extraRepos];\n const connectableRepos = CONNECTABLE_REPOSITORIES.filter(\n (r) => !projectRepos.some((p) => p.id === r.id)\n );\n\n const handleConnected = (connected: Repository) => {\n setExtraRepos((prev) =>\n prev.some((r) => r.id === connected.id) ? prev : [...prev, connected]\n );\n // The repository just connected becomes the selection in the picker.\n setRepo(connected.id);\n };\n\n const renderRepositoryField = (): ReactElement => (\n <div className=\"lk-field\">\n <Label size=\"small\" className=\"lk-label\">\n Repository\n </Label>\n <RepositorySelect\n repositories={projectRepos}\n connections={CONNECTIONS}\n selected={repo}\n onChange={setRepo}\n />\n <Caption1 color=\"tertiary\" className=\"lk-repo-hint\">\n Only repositories connected to this project are listed.{\" \"}\n <button\n type=\"button\"\n className=\"lk-repo-link\"\n onClick={() => setConnectOpen(true)}\n >\n Connect a repository\n </button>{\" \"}\n if the one you need is missing.\n </Caption1>\n </div>\n );\n\n return (\n <>\n <Dialog open={open} onClose={close} disableCloseOnEsc>\n <MenuGlobalStyle $menuWidth={menuWidth} />\n <Dialog.Title>Link Branch or Pull Request</Dialog.Title>\n <Dialog.ContentDivider />\n <Dialog.Content>\n <StyledLinkBody>\n {loading ? (\n <div className=\"lk-skeleton\">\n <div className=\"sk-row\">\n <SkeletonLoader className=\"sk-choose\" />\n </div>\n <div className=\"sk-row\">\n <SkeletonLoader className=\"sk-label\" />\n <SkeletonLoader className=\"sk-control\" />\n </div>\n </div>\n ) : (\n <>\n <ChooseV2\n required\n options={MODE_OPTIONS}\n selected={[mode]}\n onChange={(ids) => changeMode(ids[0] as LinkMode)}\n />\n\n <div className=\"lk-tabbody\">\n {mode === \"existing\" ? (\n <div className=\"lk-field\" ref={fieldRef}>\n <Label\n size=\"small\"\n className=\"lk-label\"\n invalid={existingInvalid}\n >\n Branch or Pull Request\n </Label>\n <Select\n options={GROUPED_OPTIONS}\n selected={selected === null ? undefined : selected}\n onChange={(v) => setSelected(v as string)}\n placeholder=\"Search branches and pull requests\"\n selectClassName=\"lk-existing-select-menu\"\n onSelectOpen={measureMenu}\n disabledInternalSort\n forceCloseMenu\n target={\n <SelectTrigger\n className=\"lk-control\"\n invalid={existingInvalid}\n typographyProps={\n selected === null\n ? { color: \"tertiary\" }\n : undefined\n }\n >\n {selectedLabel}\n </SelectTrigger>\n }\n />\n </div>\n ) : mode === \"branch\" ? (\n <>\n {renderRepositoryField()}\n <div className=\"lk-field\">\n <Label\n size=\"small\"\n className=\"lk-label\"\n invalid={branchInvalid}\n >\n Branch Name\n </Label>\n <Input\n className=\"lk-control\"\n value={branchName}\n invalid={branchInvalid}\n onChange={(e) => setBranchName(e.target.value)}\n />\n </div>\n <div className=\"lk-field\">\n <Label size=\"small\" className=\"lk-label\">\n Create From\n </Label>\n <BranchSelect\n options={baseBranchOptions(repo)}\n selected={createFrom}\n onChange={setCreateFrom}\n placeholder=\"Select base branch\"\n />\n </div>\n </>\n ) : (\n <>\n {renderRepositoryField()}\n <div className=\"lk-field\">\n <Label size=\"small\" className=\"lk-label\">\n Source Branch\n </Label>\n <BranchSelect\n options={sourceBranchOptions(repo)}\n selected={sourceBranch}\n onChange={setSourceBranch}\n placeholder=\"Select source branch\"\n />\n </div>\n <div className=\"lk-field\">\n <Label size=\"small\" className=\"lk-label\">\n Merge Into\n </Label>\n <BranchSelect\n options={baseBranchOptions(repo)}\n selected={mergeInto}\n onChange={setMergeInto}\n placeholder=\"Select base branch\"\n />\n </div>\n <div className=\"lk-field\">\n <Label\n size=\"small\"\n className=\"lk-label\"\n invalid={titleInvalid}\n >\n Title\n </Label>\n <Input\n className=\"lk-control\"\n value={prTitle}\n invalid={titleInvalid}\n onChange={(e) => setPrTitle(e.target.value)}\n />\n </div>\n </>\n )}\n </div>\n </>\n )}\n </StyledLinkBody>\n </Dialog.Content>\n <Dialog.ContentDivider />\n <Dialog.Actions>\n <Button\n variant=\"primary\"\n style={{ marginRight: 12 }}\n disabled={loading}\n onClick={handleSubmit}\n >\n {primaryLabel}\n </Button>\n <Button variant=\"secondary\" onClick={close}>\n Cancel\n </Button>\n </Dialog.Actions>\n </Dialog>\n\n <ConnectRepositoryDialog\n open={connectOpen}\n onClose={() => setConnectOpen(false)}\n onConnect={handleConnected}\n repositories={connectableRepos}\n connections={CONNECTIONS}\n />\n </>\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -6,11 +6,14 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.TabHeader = exports.ProjectPageHeader = exports.PageHeader = void 0;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _styledComponents = _interopRequireDefault(require("styled-components"));
9
+ var _ConnectRepositoryDialog = require("./ConnectRepositoryDialog");
10
+ var _RoundAvatar = require("./RoundAvatar");
9
11
  var _tokens = require("./tokens");
10
12
  var _Button = require("../../components/Button");
11
13
  var _GlobalAddButton = require("../../components/Button/GlobalAddButton");
12
- var _Checkbox = require("../../components/Checkbox");
14
+ var _CompleteCheckbox = require("../../components/CompleteCheckbox");
13
15
  var _CounterButton = require("../../components/CounterButton");
16
+ var _Dialog = require("../../components/Dialog");
14
17
  var _Header = require("../../components/Header");
15
18
  var _IconButton = require("../../components/IconButton");
16
19
  var _Icons = require("../../components/Icons");
@@ -28,6 +31,9 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
28
31
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
29
32
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
30
33
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
34
+ /** Gold used for the project-leader cues (a data colour, not a theme token). */
35
+ var LEADER_GOLD = "#FFCC6B";
36
+
31
37
  /* ------------------------------------------------------------------ */
32
38
  /* Page header row (mirrors PageHeader.jsx) */
33
39
  /* ------------------------------------------------------------------ */
@@ -68,13 +74,122 @@ var StyledProjectHeaderChildren = _styledComponents.default.div.withConfig({
68
74
  var StyledProjectMenu = _styledComponents.default.div.withConfig({
69
75
  displayName: "headers__StyledProjectMenu",
70
76
  componentId: "sc-yf6o6n-2"
71
- })([".toggle-item{justify-content:space-between;}.toggle-item .opt-left{display:flex;align-items:center;min-width:0;}.toggle-item .opt-left svg{margin-right:8px;flex-shrink:0;}"]);
72
- var ProjectOptionsMenu = function ProjectOptionsMenu() {
77
+ })([".toggle-item{justify-content:space-between;}.toggle-item .opt-left{display:flex;align-items:center;min-width:0;}.toggle-item .opt-left svg{margin-right:8px;flex-shrink:0;}.toggle-item .c-complete-checkbox{width:16px;height:16px;border-radius:3px;align-self:center;flex-shrink:0;}.submenu-item{justify-content:space-between;}.submenu-item .repo-caret{flex-shrink:0;fill:var(--color-theme-600);}.repo-row{min-width:0;}.repo-row > svg{flex-shrink:0;}.repo-name{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}"]);
78
+
79
+ /** Submenu row label for a connected repository: "path (Connection, Type)",
80
+ * matching the grouped picker headers in the Link Branch / Pull Request
81
+ * dialog. */
82
+ var repositoryMenuLabel = function repositoryMenuLabel(repo) {
83
+ var connection = _ConnectRepositoryDialog.CONNECTIONS.find(function (c) {
84
+ return c.id === repo.connectionId;
85
+ });
86
+ return connection ? "".concat(repo.name, " (").concat(connection.name, ", ").concat((0, _ConnectRepositoryDialog.serviceLabel)(connection.service), ")") : repo.name;
87
+ };
88
+
89
+ /**
90
+ * The "Repositories" item and its fly-out submenu. Rendered only when the
91
+ * `source` module is loaded. The item carries a right caret and opens a
92
+ * submenu that lists the project's connected repositories (sorted by name)
93
+ * above a "Connect Repository" action, separated by a divider. Connecting a
94
+ * repository adds it to the list; clicking a repository closes the menu (and,
95
+ * in production, opens the repository in a new tab).
96
+ */
97
+ var RepositoriesMenuItem = function RepositoriesMenuItem(_ref2) {
98
+ var repositories = _ref2.repositories,
99
+ onConnect = _ref2.onConnect,
100
+ onOpenRepository = _ref2.onOpenRepository;
73
101
  var _useState = (0, _react.useState)(false),
74
102
  _useState2 = _slicedToArray(_useState, 2),
75
103
  open = _useState2[0],
76
104
  setOpen = _useState2[1];
77
105
  return /*#__PURE__*/_react.default.createElement(_Menu.Menu, {
106
+ open: open,
107
+ onOpen: function onOpen() {
108
+ return setOpen(true);
109
+ },
110
+ onClose: function onClose() {
111
+ return setOpen(false);
112
+ },
113
+ position: "right-start",
114
+ mode: "wider",
115
+ target: /*#__PURE__*/_react.default.createElement(_List.ListItem, {
116
+ className: "toggle-item submenu-item"
117
+ }, /*#__PURE__*/_react.default.createElement("span", {
118
+ className: "opt-left"
119
+ }, /*#__PURE__*/_react.default.createElement(_Icons.GitRepositoryIcon, null), "Repositories"), /*#__PURE__*/_react.default.createElement(_Icons.CaretRightIcon, {
120
+ className: "repo-caret",
121
+ width: 16,
122
+ height: 16
123
+ }))
124
+ }, /*#__PURE__*/_react.default.createElement(StyledProjectMenu, null, /*#__PURE__*/_react.default.createElement(_List.List, {
125
+ style: {
126
+ padding: "8px 0"
127
+ },
128
+ tabIndex: -1
129
+ }, repositories.map(function (repo) {
130
+ return /*#__PURE__*/_react.default.createElement(_List.ListItem, {
131
+ key: repo.id,
132
+ className: "repo-row",
133
+ onClick: function onClick() {
134
+ return onOpenRepository(repo);
135
+ }
136
+ }, /*#__PURE__*/_react.default.createElement(_Icons.GitRepositoryIcon, null), /*#__PURE__*/_react.default.createElement("span", {
137
+ className: "repo-name"
138
+ }, repositoryMenuLabel(repo)));
139
+ }), repositories.length > 0 ? /*#__PURE__*/_react.default.createElement(_List.ListSeparator, null) : null, /*#__PURE__*/_react.default.createElement(_List.ListItem, {
140
+ onClick: onConnect
141
+ }, /*#__PURE__*/_react.default.createElement(_Icons.AddCrossIcon, null), "Connect Repository"))));
142
+ };
143
+ var ProjectOptionsMenu = function ProjectOptionsMenu(_ref3) {
144
+ var _ref3$sourceModuleLoa = _ref3.sourceModuleLoaded,
145
+ sourceModuleLoaded = _ref3$sourceModuleLoa === void 0 ? false : _ref3$sourceModuleLoa;
146
+ var _useState3 = (0, _react.useState)(false),
147
+ _useState4 = _slicedToArray(_useState3, 2),
148
+ open = _useState4[0],
149
+ setOpen = _useState4[1];
150
+ var _useState5 = (0, _react.useState)([]),
151
+ _useState6 = _slicedToArray(_useState5, 2),
152
+ connectedRepos = _useState6[0],
153
+ setConnectedRepos = _useState6[1];
154
+ var _useState7 = (0, _react.useState)(false),
155
+ _useState8 = _slicedToArray(_useState7, 2),
156
+ connectOpen = _useState8[0],
157
+ setConnectOpen = _useState8[1];
158
+ var _useState9 = (0, _react.useState)(false),
159
+ _useState0 = _slicedToArray(_useState9, 2),
160
+ infoOpen = _useState0[0],
161
+ setInfoOpen = _useState0[1];
162
+
163
+ // Repositories still available to connect (not already on the project).
164
+ var connectableRepos = _ConnectRepositoryDialog.CONNECTABLE_REPOSITORIES.filter(function (r) {
165
+ return !connectedRepos.some(function (c) {
166
+ return c.id === r.id;
167
+ });
168
+ });
169
+
170
+ // Connected repositories are listed in the submenu sorted by name.
171
+ var sortedRepos = [...connectedRepos].sort(function (a, b) {
172
+ return a.name.localeCompare(b.name);
173
+ });
174
+ var handleConnected = function handleConnected(repo) {
175
+ setConnectedRepos(function (prev) {
176
+ return prev.some(function (r) {
177
+ return r.id === repo.id;
178
+ }) ? prev : [...prev, repo];
179
+ });
180
+ };
181
+ var handleConnect = function handleConnect() {
182
+ setOpen(false);
183
+ setConnectOpen(true);
184
+ };
185
+
186
+ // In production this closes the menu and opens the repository in a new tab;
187
+ // in the mock we surface that behaviour in a small dialog instead.
188
+ var handleOpenRepository = function handleOpenRepository() {
189
+ setOpen(false);
190
+ setInfoOpen(true);
191
+ };
192
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Menu.Menu, {
78
193
  open: open,
79
194
  onOpen: function onOpen() {
80
195
  return setOpen(true);
@@ -97,26 +212,142 @@ var ProjectOptionsMenu = function ProjectOptionsMenu() {
97
212
  className: "toggle-item"
98
213
  }, /*#__PURE__*/_react.default.createElement("span", {
99
214
  className: "opt-left"
100
- }, /*#__PURE__*/_react.default.createElement(_Icons.StarIcon, null), "Mark as Favorite"), /*#__PURE__*/_react.default.createElement(_Checkbox.Checkbox, {
101
- id: "proj-favorite",
102
- onChange: function onChange() {
103
- return undefined;
104
- }
215
+ }, /*#__PURE__*/_react.default.createElement(_Icons.StarIcon, null), "Mark as Favorite"), /*#__PURE__*/_react.default.createElement(_CompleteCheckbox.CompleteCheckbox, {
216
+ primary: true,
217
+ completed: true
105
218
  })), /*#__PURE__*/_react.default.createElement(_List.ListItem, {
106
219
  className: "toggle-item"
107
220
  }, /*#__PURE__*/_react.default.createElement("span", {
108
221
  className: "opt-left"
109
- }, /*#__PURE__*/_react.default.createElement(_Icons.NotificationBellIcon, null), "Subscribe to Everything"), /*#__PURE__*/_react.default.createElement(_Checkbox.Checkbox, {
110
- id: "proj-subscribe",
111
- onChange: function onChange() {
112
- return undefined;
222
+ }, /*#__PURE__*/_react.default.createElement(_Icons.NotificationBellIcon, null), "Subscribe to Everything"), /*#__PURE__*/_react.default.createElement(_CompleteCheckbox.CompleteCheckbox, {
223
+ primary: true,
224
+ completed: false
225
+ })), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.LabelsIcon, null), "Manage Task Labels"), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.InsertLinkIcon, null), "Copy Link"), /*#__PURE__*/_react.default.createElement(_List.ListSeparator, null), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.CheckboxBlankTogglerIcon, null), "Complete"), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.DownloadIcon, null), "Export"), sourceModuleLoaded ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_List.ListSeparator, null), /*#__PURE__*/_react.default.createElement(RepositoriesMenuItem, {
226
+ repositories: sortedRepos,
227
+ onConnect: handleConnect,
228
+ onOpenRepository: handleOpenRepository
229
+ })) : null, /*#__PURE__*/_react.default.createElement(_List.ListSeparator, null), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.DuplicateIcon, null), "Duplicate"), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.ProjectTemplateIcon, null), "Apply Template"), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.ProjectTemplateConvertIcon, null), "Convert to Template"), /*#__PURE__*/_react.default.createElement(_List.ListSeparator, null), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.TrashIcon, null), "Delete")))), /*#__PURE__*/_react.default.createElement(_ConnectRepositoryDialog.ConnectRepositoryDialog, {
230
+ open: connectOpen,
231
+ onClose: function onClose() {
232
+ return setConnectOpen(false);
233
+ },
234
+ onConnect: handleConnected,
235
+ repositories: connectableRepos,
236
+ connections: _ConnectRepositoryDialog.CONNECTIONS
237
+ }), /*#__PURE__*/_react.default.createElement(_Dialog.Dialog, {
238
+ open: infoOpen,
239
+ onClose: function onClose() {
240
+ return setInfoOpen(false);
241
+ },
242
+ enableBackgroundClick: true
243
+ }, /*#__PURE__*/_react.default.createElement(_Dialog.Dialog.Title, null, "Open Repository"), /*#__PURE__*/_react.default.createElement(_Dialog.Dialog.ContentDivider, null), /*#__PURE__*/_react.default.createElement(_Dialog.Dialog.Content, null, /*#__PURE__*/_react.default.createElement(_Typography.Body2, null, "In production, this click would close the menu and open the repository in a new browser tab.")), /*#__PURE__*/_react.default.createElement(_Dialog.Dialog.ContentDivider, null), /*#__PURE__*/_react.default.createElement(_Dialog.Dialog.Actions, null, /*#__PURE__*/_react.default.createElement(_Button.Button, {
244
+ variant: "primary",
245
+ onClick: function onClick() {
246
+ return setInfoOpen(false);
113
247
  }
114
- })), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.LabelsIcon, null), "Manage Task Labels"), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.InsertLinkIcon, null), "Copy Link"), /*#__PURE__*/_react.default.createElement(_List.ListSeparator, null), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.CheckboxBlankTogglerIcon, null), "Complete"), /*#__PURE__*/_react.default.createElement(_List.ListSeparator, null), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.DuplicateIcon, null), "Duplicate"), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.ProjectTemplateIcon, null), "Apply Template"), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.ProjectTemplateConvertIcon, null), "Convert to Template"), /*#__PURE__*/_react.default.createElement(_List.ListSeparator, null), /*#__PURE__*/_react.default.createElement(_List.ListItem, null, /*#__PURE__*/_react.default.createElement(_Icons.TrashIcon, null), "Delete"))));
248
+ }, "Got it"))));
249
+ };
250
+
251
+ /* People popover (mirrors the project header People dropdown): a header row
252
+ ("People" + add button), a "Members" section and a row per member. The
253
+ project leader shows a gold crown; other members reveal a "set as leader"
254
+ crown and a remove button on hover. Clicks are no-ops. */
255
+
256
+ var PROJECT_MEMBERS = [{
257
+ name: "Theo Brandt",
258
+ initials: "TB",
259
+ color: _tokens.AVATAR_COLORS.blue,
260
+ leader: true
261
+ }, {
262
+ name: "Iris Calloway",
263
+ initials: "IC",
264
+ color: _tokens.AVATAR_COLORS.purple
265
+ }, {
266
+ name: "Account Director",
267
+ initials: "AD",
268
+ color: "#8A8F98"
269
+ }, {
270
+ name: "Grace Bennett",
271
+ initials: "GB",
272
+ color: _tokens.AVATAR_COLORS.orange
273
+ }];
274
+ var StyledPeopleMenu = _styledComponents.default.div.withConfig({
275
+ displayName: "headers__StyledPeopleMenu",
276
+ componentId: "sc-yf6o6n-3"
277
+ })(["width:256px;.members-label{display:block;margin:8px 0;padding:0 16px;}.member-row{position:relative;display:flex;align-items:center;min-height:40px;margin:0 8px;padding:2px 8px;border-radius:4px;cursor:default;transition:background-color ", ";}.member-row:hover{background-color:var(--color-theme-200);}.member-row.leader::before{content:\"\";position:absolute;top:4px;bottom:4px;left:0;width:4px;border-radius:4px;background-color:", ";}.member-row.leader .member-avatar{outline:2px solid ", ";outline-offset:-2px;}.member-name{flex:1;margin-left:12px;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}.member-right{display:flex;align-items:center;gap:2px;flex-shrink:0;margin-left:8px;}.leader-crown{flex-shrink:0;}.member-options{display:none;align-items:center;gap:2px;}.member-row:hover .member-options{display:flex;}"], _tokens.TRANSITION, LEADER_GOLD, LEADER_GOLD);
278
+ var PeoplePopover = function PeoplePopover() {
279
+ var _useState1 = (0, _react.useState)(false),
280
+ _useState10 = _slicedToArray(_useState1, 2),
281
+ open = _useState10[0],
282
+ setOpen = _useState10[1];
283
+ return /*#__PURE__*/_react.default.createElement(_Menu.Menu, {
284
+ open: open,
285
+ onOpen: function onOpen() {
286
+ return setOpen(true);
287
+ },
288
+ onClose: function onClose() {
289
+ return setOpen(false);
290
+ },
291
+ position: "bottom-end",
292
+ target: /*#__PURE__*/_react.default.createElement(_CounterButton.CounterButton, {
293
+ label: String(PROJECT_MEMBERS.length),
294
+ icon: /*#__PURE__*/_react.default.createElement(_Icons.PeopleIcon, null),
295
+ active: open,
296
+ onClearAll: function onClearAll() {
297
+ return undefined;
298
+ }
299
+ })
300
+ }, /*#__PURE__*/_react.default.createElement(StyledPeopleMenu, null, /*#__PURE__*/_react.default.createElement(_Menu.MenuHeader, {
301
+ title: "People",
302
+ rightElement: /*#__PURE__*/_react.default.createElement(_IconButton.IconButton, {
303
+ type: "button",
304
+ variant: "text gray",
305
+ size: "small",
306
+ "aria-label": "Add People"
307
+ }, /*#__PURE__*/_react.default.createElement(_Icons.AddCrossTinyIcon, null))
308
+ }), /*#__PURE__*/_react.default.createElement(_Typography.Caption1, {
309
+ weight: "bold",
310
+ className: "members-label"
311
+ }, "Members"), PROJECT_MEMBERS.map(function (member) {
312
+ return /*#__PURE__*/_react.default.createElement("div", {
313
+ className: member.leader ? "member-row leader" : "member-row",
314
+ key: member.name
315
+ }, /*#__PURE__*/_react.default.createElement(_RoundAvatar.RoundAvatar, {
316
+ className: "member-avatar",
317
+ $bg: member.color,
318
+ $bordered: false
319
+ }, member.initials), /*#__PURE__*/_react.default.createElement(_Typography.Body2, {
320
+ className: "member-name"
321
+ }, member.name), /*#__PURE__*/_react.default.createElement("span", {
322
+ className: "member-right"
323
+ }, member.leader && /*#__PURE__*/_react.default.createElement(_Icons.CrownSelectedIcon, {
324
+ className: "leader-crown",
325
+ style: {
326
+ fill: LEADER_GOLD
327
+ }
328
+ }), /*#__PURE__*/_react.default.createElement("span", {
329
+ className: "member-options"
330
+ }, !member.leader && /*#__PURE__*/_react.default.createElement(_Tooltip.Tooltip, {
331
+ title: "Set as Project Leader"
332
+ }, /*#__PURE__*/_react.default.createElement(_IconButton.IconButton, {
333
+ type: "button",
334
+ variant: "text gray",
335
+ size: "small"
336
+ }, /*#__PURE__*/_react.default.createElement(_Icons.CrownBlankIcon, null))), /*#__PURE__*/_react.default.createElement(_Tooltip.Tooltip, {
337
+ title: "Remove from Project"
338
+ }, /*#__PURE__*/_react.default.createElement(_IconButton.IconButton, {
339
+ type: "button",
340
+ variant: "text gray",
341
+ size: "small"
342
+ }, /*#__PURE__*/_react.default.createElement(_Icons.CloseSmallIcon, null))))));
343
+ })));
115
344
  };
116
345
  /** The project page header: back arrow, title, progress, info, people, options. */
117
- var ProjectPageHeader = exports.ProjectPageHeader = function ProjectPageHeader(_ref2) {
118
- var _ref2$title = _ref2.title,
119
- title = _ref2$title === void 0 ? "#131: Ime projekta" : _ref2$title;
346
+ var ProjectPageHeader = exports.ProjectPageHeader = function ProjectPageHeader(_ref4) {
347
+ var _ref4$title = _ref4.title,
348
+ title = _ref4$title === void 0 ? "#131: Ime projekta" : _ref4$title,
349
+ _ref4$sourceModuleLoa = _ref4.sourceModuleLoaded,
350
+ sourceModuleLoaded = _ref4$sourceModuleLoa === void 0 ? false : _ref4$sourceModuleLoa;
120
351
  return /*#__PURE__*/_react.default.createElement(StyledPageHeader, null, /*#__PURE__*/_react.default.createElement("div", {
121
352
  className: "page-header-left"
122
353
  }, /*#__PURE__*/_react.default.createElement(_IconButton.IconButton, {
@@ -139,13 +370,9 @@ var ProjectPageHeader = exports.ProjectPageHeader = function ProjectPageHeader(_
139
370
  title: "Project Info"
140
371
  }, /*#__PURE__*/_react.default.createElement(_IconButton.IconButton, {
141
372
  variant: "text gray"
142
- }, /*#__PURE__*/_react.default.createElement(_Icons.InfoIcon, null))), /*#__PURE__*/_react.default.createElement(_CounterButton.CounterButton, {
143
- label: "5",
144
- icon: /*#__PURE__*/_react.default.createElement(_Icons.PeopleIcon, null),
145
- onClearAll: function onClearAll() {
146
- return undefined;
147
- }
148
- }), /*#__PURE__*/_react.default.createElement(ProjectOptionsMenu, null)))), /*#__PURE__*/_react.default.createElement("div", {
373
+ }, /*#__PURE__*/_react.default.createElement(_Icons.InfoIcon, null))), /*#__PURE__*/_react.default.createElement(PeoplePopover, null), /*#__PURE__*/_react.default.createElement(ProjectOptionsMenu, {
374
+ sourceModuleLoaded: sourceModuleLoaded
375
+ })))), /*#__PURE__*/_react.default.createElement("div", {
149
376
  className: "page-header-spacer"
150
377
  }));
151
378
  };
@@ -158,20 +385,20 @@ ProjectPageHeader.displayName = "ProjectPageHeader";
158
385
  var NAV_TABS = ["Tasks", "Discussions", "Files", "Notes", "Activity"];
159
386
  var StyledTabHeader = (0, _styledComponents.default)(_Header.Header).withConfig({
160
387
  displayName: "headers__StyledTabHeader",
161
- componentId: "sc-yf6o6n-3"
388
+ componentId: "sc-yf6o6n-4"
162
389
  })(["justify-content:space-between;align-items:center;margin-bottom:16px;min-height:64px;flex-shrink:0;"]);
163
390
  var StyledTabControls = _styledComponents.default.div.withConfig({
164
391
  displayName: "headers__StyledTabControls",
165
- componentId: "sc-yf6o6n-4"
392
+ componentId: "sc-yf6o6n-5"
166
393
  })(["display:flex;align-items:center;flex-shrink:0;gap:4px;.vertical-separator{width:1px;height:24px;background-color:var(--color-theme-400);margin:0 8px;}.filter-button{display:flex;align-items:center;gap:6px;}"]);
167
394
  /** The Tasks/Discussions/… tab bar plus the right-hand view toolbar. */
168
- var TabHeader = exports.TabHeader = function TabHeader(_ref3) {
169
- var _ref3$activeView = _ref3.activeView,
170
- activeView = _ref3$activeView === void 0 ? "list" : _ref3$activeView;
171
- var _useState3 = (0, _react.useState)(0),
172
- _useState4 = _slicedToArray(_useState3, 2),
173
- active = _useState4[0],
174
- setActive = _useState4[1];
395
+ var TabHeader = exports.TabHeader = function TabHeader(_ref5) {
396
+ var _ref5$activeView = _ref5.activeView,
397
+ activeView = _ref5$activeView === void 0 ? "list" : _ref5$activeView;
398
+ var _useState11 = (0, _react.useState)(0),
399
+ _useState12 = _slicedToArray(_useState11, 2),
400
+ active = _useState12[0],
401
+ setActive = _useState12[1];
175
402
  return /*#__PURE__*/_react.default.createElement(StyledTabHeader, null, /*#__PURE__*/_react.default.createElement(_Nav.Nav, {
176
403
  onSelect: setActive
177
404
  }, NAV_TABS.map(function (label, index) {