import * as GitHubUtils from "../../Utils/GitHubUtils"; import * as React from "react"; import { IPinnedRepo } from "../../Juno/JunoClient"; import { ResourceTreeAdapter } from "../Tree/ResourceTreeAdapter"; import { Stack, Label, Text, Dropdown, IDropdownProps, IDropdownOption, SelectableOptionMenuItemType, IRenderFunction, ISelectableOption, } from "office-ui-fabric-react"; interface Location { type: "MyNotebooks" | "GitHub"; // GitHub owner?: string; repo?: string; branch?: string; } export interface CopyNotebookPaneProps { name: string; pinnedRepos: IPinnedRepo[]; onDropDownChange: (_: React.FormEvent, option?: IDropdownOption) => void; } export class CopyNotebookPaneComponent extends React.Component { private static readonly BranchNameWhiteSpace = " "; public render(): JSX.Element { const dropDownProps: IDropdownProps = { label: "Location", ariaLabel: "Location", placeholder: "Select an option", onRenderTitle: this.onRenderDropDownTitle, onRenderOption: this.onRenderDropDownOption, options: this.getDropDownOptions(), onChange: this.props.onDropDownChange, }; return (
{this.props.name}
); } private onRenderDropDownTitle: IRenderFunction = (options: IDropdownOption[]): JSX.Element => { return {options.length && options[0].title}; }; private onRenderDropDownOption: IRenderFunction = (option: ISelectableOption): JSX.Element => { return {option.text}; }; private getDropDownOptions = (): IDropdownOption[] => { const options: IDropdownOption[] = []; options.push({ key: "MyNotebooks-Item", text: ResourceTreeAdapter.MyNotebooksTitle, title: ResourceTreeAdapter.MyNotebooksTitle, data: { type: "MyNotebooks", } as Location, }); if (this.props.pinnedRepos && this.props.pinnedRepos.length > 0) { options.push({ key: "GitHub-Header-Divider", text: undefined, itemType: SelectableOptionMenuItemType.Divider, }); options.push({ key: "GitHub-Header", text: ResourceTreeAdapter.GitHubReposTitle, itemType: SelectableOptionMenuItemType.Header, }); this.props.pinnedRepos.forEach((pinnedRepo) => { const repoFullName = GitHubUtils.toRepoFullName(pinnedRepo.owner, pinnedRepo.name); options.push({ key: `GitHub-Repo-${repoFullName}`, text: repoFullName, disabled: true, }); pinnedRepo.branches.forEach((branch) => options.push({ key: `GitHub-Repo-${repoFullName}-${branch.name}`, text: `${CopyNotebookPaneComponent.BranchNameWhiteSpace}${branch.name}`, title: `${repoFullName} - ${branch.name}`, data: { type: "GitHub", owner: pinnedRepo.owner, repo: pinnedRepo.name, branch: branch.name, } as Location, }) ); }); } return options; }; }