Wildcard V2: <Link /> Manual migration (#30190)

Co-authored-by: gitstart-sourcegraph <gitstart@users.noreply.github.com>
This commit is contained in:
GitStart-SourceGraph 2022-02-01 03:58:03 +08:00 committed by GitHub
parent 21cdb17879
commit 0409318994
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
135 changed files with 692 additions and 641 deletions

View File

@ -49,6 +49,11 @@ const config = {
importNames: ['animationFrameScheduler'],
message: 'Code using animationFrameScheduler breaks in Firefox when using Sentry.',
},
{
name: 'react-router-dom',
importNames: ['Link'],
message: "Use the Link component from the @sourcegraph/wildcard package instead of react-router-dom's Link",
},
],
patterns: [
{

18
.github/ISSUE_TEMPLATE/flaky_test.md vendored Normal file
View File

@ -0,0 +1,18 @@
---
name: Flaky Test
about: Capture information about a flaky test that has been disabled.
title: 'Flake: $TEST_NAME disabled'
labels:
- 'testing'
- 'flake'
assignees: ''
---
- **Name of test:** <!-- Name of the test that was disabled -->
- **Example failure:** <!-- Buildkite link to an example faiure -->
- **PR**: <!-- Link to PR that disabled the test. E.g., #1234 >
#### Additional details
<!-- Notes and/or screenshot describing the problem -->

View File

@ -1,36 +0,0 @@
name: Flaky test
description: Capture information about a flaky test that has been disabled.
title: 'ci/flake: $TEST_NAME disabled'
labels:
- 'dx'
- 'ci/flake'
- 'testing'
body:
- type: input
id: test
attributes:
label: Test
description: Name of test or link to test that was disabled
validations:
required: true
- type: input
id: example
attributes:
label: Example failure
description: Buildkite link to an example faiure
validations:
required: true
- type: input
id: pr
attributes:
label: Disabling PR
description: Link to PR that disables the test
validations:
required: true
- type: textarea
id: details
attributes:
label: Additional details
description: Notes and/or screenshot describing the problem, links to log queries indicating repeat occurrences, etc.
validations:
required: false

View File

@ -11,13 +11,6 @@ jobs:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.sha }}
- uses: sourcegraph/codenotify@v0.5.1
with:
filename: 'CODENOTIFY'
env:
GITHUB_TOKEN: ${{ secrets.CODENOTIFY_GITHUB_TOKEN }}
- uses: sourcegraph/codenotify@v0.5.1
with:
filename: 'OWNERS'
- uses: sourcegraph/codenotify@v0.4
env:
GITHUB_TOKEN: ${{ secrets.CODENOTIFY_GITHUB_TOKEN }}

View File

@ -5,21 +5,5 @@ module.exports = {
...baseConfig.parserOptions,
project: [__dirname + '/tsconfig.json'],
},
rules: {
'no-restricted-imports': [
'error',
{
paths: [
...baseConfig.rules['no-restricted-imports'][1].paths,
{
name: 'react-router-dom',
importNames: ['Link'],
message:
"Use the shared/src/shared/components/Link component instead of react-router-dom's Link. Reason: Shared branded code runs on platforms that don't use react-router (such as in the browser extension).",
},
],
},
],
},
overrides: baseConfig.overrides,
}

View File

@ -11,7 +11,7 @@ import 'storybook-addon-designs'
import { registerHighlightContributions } from '@sourcegraph/shared/src/highlight/contributions'
import { highlightCodeSafe } from '@sourcegraph/shared/src/util/markdown'
import { TextArea, Button } from '@sourcegraph/wildcard'
import { TextArea, Button, Link } from '@sourcegraph/wildcard'
import { BrandedStory } from '../../components/BrandedStory'
import { CodeSnippet } from '../../components/CodeSnippet'
@ -149,26 +149,30 @@ export const Layout: Story = () => (
<h2>Spacing</h2>
<p>
Use margin <code>m-*</code> and padding <code>p-*</code> utilities to align with the{' '}
<a
href="https://builttoadapt.io/intro-to-the-8-point-grid-system-d2573cde8632"
<Link
to="https://builttoadapt.io/intro-to-the-8-point-grid-system-d2573cde8632"
target="_blank"
rel="noopener noreferrer"
>
8pt grid
</a>
</Link>
. When hand-writing CSS, use <code>rem</code> units in multiples of <code>0.25</code>.
</p>
<h2>One-dimensional layout</h2>
<p>
Use{' '}
<a href="https://css-tricks.com/snippets/css/a-guide-to-flexbox/" target="_blank" rel="noopener noreferrer">
<Link
to="https://css-tricks.com/snippets/css/a-guide-to-flexbox/"
target="_blank"
rel="noopener noreferrer"
>
Flexbox
</a>{' '}
</Link>{' '}
for one-dimensional layouts (single rows or columns, with optional wrapping). You can use{' '}
<a href="https://getbootstrap.com/docs/4.5/utilities/flex/" target="_blank" rel="noopener noreferrer">
<Link to="https://getbootstrap.com/docs/4.5/utilities/flex/" target="_blank" rel="noopener noreferrer">
utility classes
</a>{' '}
</Link>{' '}
for simple flexbox layouts.
</p>
@ -207,7 +211,7 @@ export const Layout: Story = () => (
<h2>Two-dimensional layout</h2>
<p>
Use <a href="https://learncssgrid.com/">CSS Grid</a> for complex two-dimensional layouts.
Use <Link to="https://learncssgrid.com/">CSS Grid</Link> for complex two-dimensional layouts.
</p>
<div
className="p-2 border overflow-hidden"
@ -240,7 +244,7 @@ export const ButtonGroups: Story = () => {
<h1>Button groups</h1>
<p>
Group a series of buttons together on a single line with the button group.{' '}
<a href="https://getbootstrap.com/docs/4.5/components/buttons/">Bootstrap documentation</a>
<Link to="https://getbootstrap.com/docs/4.5/components/buttons/">Bootstrap documentation</Link>
</p>
<h2>Example</h2>
@ -369,7 +373,7 @@ export const InputGroups: Story = () => (
<p>
Easily extend form controls by adding text, buttons, or button groups on either side of textual inputs,
custom selects, and custom file inputs.{' '}
<a href="https://getbootstrap.com/docs/4.5/components/input-group/">Bootstrap documentation</a>
<Link to="https://getbootstrap.com/docs/4.5/components/input-group/">Bootstrap documentation</Link>
</p>
<h2>Example</h2>
@ -393,9 +397,9 @@ export const Forms: Story = () => (
<h1>Forms</h1>
<p>
Forms are validated using native HTML validation. Submit the below form with invalid input to try it out.{' '}
<a href="https://getbootstrap.com/docs/4.5/components/forms/" target="_blank" rel="noopener noreferrer">
<Link to="https://getbootstrap.com/docs/4.5/components/forms/" target="_blank" rel="noopener noreferrer">
Bootstrap documentation
</a>
</Link>
</p>
<Form onSubmit={preventDefault}>
<div className="form-group">
@ -570,13 +574,13 @@ export const Meter: Story = () => {
<h1>Meter</h1>
<p>
The HTML{' '}
<a
href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meter"
<Link
to="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meter"
target="_blank"
rel="noopener noreferrer"
>
<code>{'<meter>'}</code>
</a>{' '}
</Link>{' '}
element represents either a scalar value within a known range or a fractional value.
</p>
<h2>Examples</h2>

View File

@ -1,6 +1,8 @@
import React from 'react'
import 'storybook-addon-designs'
import { Link } from '@sourcegraph/wildcard'
import { SEMANTIC_COLORS } from './constants'
import { TextVariants } from './TextVariants'
@ -45,7 +47,7 @@ export const TextStory: React.FunctionComponent = () => (
</p>
<p>
Text can contain links, which <a href="/">trigger a navigation to a different page</a>.
Text can contain links, which <Link to="/">trigger a navigation to a different page</Link>.
</p>
<p>
@ -54,12 +56,12 @@ export const TextStory: React.FunctionComponent = () => (
<p>
Text can be <i>idiomatic</i> with <code>{'<i>'}</code>. See{' '}
<a
<Link
target="__blank"
href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/em#%3Ci%3E_vs._%3Cem%3E"
to="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/em#%3Ci%3E_vs._%3Cem%3E"
>
{'<i>'} vs. {'<em>'}
</a>{' '}
</Link>{' '}
for more info.
</p>

View File

@ -11,6 +11,7 @@ import React, { VideoHTMLAttributes } from 'react'
import { SourcegraphLogo } from '@sourcegraph/branded/src/components/SourcegraphLogo'
import { PhabricatorIcon } from '@sourcegraph/shared/src/components/icons'
import { ThemeProps } from '@sourcegraph/shared/src/theme'
import { Link } from '@sourcegraph/wildcard'
import { getPlatformName } from '../../shared/util/context'
@ -53,12 +54,12 @@ export const AfterInstallPageContent: React.FunctionComponent<ThemeProps> = prop
return (
<div className="after-install-page-content">
<div className="d-flex w-100 p-3 justify-content-between align-items-center">
<a href="https://sourcegraph.com/search" target="_blank" rel="noopener">
<Link to="https://sourcegraph.com/search" target="_blank" rel="noopener">
<SourcegraphLogo className={styles.sourcegraphLogo} />
</a>
<a href="https://docs.sourcegraph.com/integration/browser_extension" target="_blank" rel="noopener">
</Link>
<Link to="https://docs.sourcegraph.com/integration/browser_extension" target="_blank" rel="noopener">
Browser extension docs <ExternalLinkIcon className="icon-inline" />
</a>
</Link>
</div>
<div className="container mt-3">
@ -172,20 +173,20 @@ export const AfterInstallPageContent: React.FunctionComponent<ThemeProps> = prop
<ol className="m-0 d-flex flex-column justify-content-around">
<li>
<strong>Install Sourcegraph</strong> (
<a
href="https://docs.sourcegraph.com/admin/install"
<Link
to="https://docs.sourcegraph.com/admin/install"
target="_blank"
rel="noopener"
>
visit our docs for instructions
</a>
</Link>
).Skip this step if you already have a private Sourcegraph instance.
</li>
<li>
Click the Sourcegraph extension icon in the browser toolbar to{' '}
<a href="./options.html" rel="noopener" target="_blank">
<Link to="./options.html" rel="noopener" target="_blank">
open the settings page
</a>
</Link>
.
</li>
<li>
@ -212,13 +213,13 @@ export const AfterInstallPageContent: React.FunctionComponent<ThemeProps> = prop
</div>
<p className="m-0 ml-3">
Read the{' '}
<a
href="https://docs.sourcegraph.com/integration/browser_extension"
<Link
to="https://docs.sourcegraph.com/integration/browser_extension"
rel="noopener"
target="_blank"
>
Sourcegraph docs
</a>{' '}
</Link>{' '}
to learn more about how we respect your privacy, troubleshooting and extension features.
</p>
</div>

View File

@ -12,7 +12,7 @@ import { LoaderInput } from '@sourcegraph/branded/src/components/LoaderInput'
import { SourcegraphLogo } from '@sourcegraph/branded/src/components/SourcegraphLogo'
import { Toggle } from '@sourcegraph/branded/src/components/Toggle'
import { useInputValidation, deriveInputClassName } from '@sourcegraph/shared/src/util/useInputValidation'
import { Button } from '@sourcegraph/wildcard'
import { Button, Link } from '@sourcegraph/wildcard'
import { OptionsPageContainer } from './components/OptionsPageContainer'
import styles from './OptionsPage.module.scss'
@ -95,9 +95,9 @@ export const OptionsPage: React.FunctionComponent<OptionsPageProps> = ({
</section>
<section className={styles.section}>
Get code intelligence tooltips while browsing and reviewing code on your code host.{' '}
<a href="https://docs.sourcegraph.com/integration/browser_extension#features" {...NEW_TAB_LINK_PROPS}>
<Link to="https://docs.sourcegraph.com/integration/browser_extension#features" {...NEW_TAB_LINK_PROPS}>
Learn more
</a>{' '}
</Link>{' '}
about the extension and compatible code hosts.
</section>
<section className={classNames('border-0', styles.section)}>
@ -120,13 +120,13 @@ export const OptionsPage: React.FunctionComponent<OptionsPageProps> = ({
{showPrivateRepositoryAlert && <PrivateRepositoryAlert />}
<section className={styles.section}>
<a
href="https://docs.sourcegraph.com/integration/browser_extension#privacy"
<Link
to="https://docs.sourcegraph.com/integration/browser_extension#privacy"
{...NEW_TAB_LINK_PROPS}
className="d-block mb-1"
>
<small>How do we keep your code private?</small> <OpenInNewIcon size="0.75rem" className="ml-2" />
</a>
</Link>
<p className="mb-0">
<Button
className="p-0 shadow-none font-weight-normal"
@ -143,16 +143,16 @@ export const OptionsPage: React.FunctionComponent<OptionsPageProps> = ({
</section>
<section className="d-flex">
<div className={styles.splitSectionPart}>
<a href="https://sourcegraph.com/search" {...NEW_TAB_LINK_PROPS}>
<Link to="https://sourcegraph.com/search" {...NEW_TAB_LINK_PROPS}>
<EarthIcon className="icon-inline mr-2" />
Sourcegraph Cloud
</a>
</Link>
</div>
<div className={styles.splitSectionPart}>
<a href="https://docs.sourcegraph.com" {...NEW_TAB_LINK_PROPS}>
<Link to="https://docs.sourcegraph.com" {...NEW_TAB_LINK_PROPS}>
<BookOpenPageVariantIcon className="icon-inline mr-2" />
Documentation
</a>
</Link>
</div>
</section>
</OptionsPageContainer>
@ -195,9 +195,9 @@ const PrivateRepositoryAlert: React.FunctionComponent = () => (
</p>
<ol>
<li className="mb-2">
<a href="https://docs.sourcegraph.com/" rel="noopener" target="_blank">
<Link to="https://docs.sourcegraph.com/" rel="noopener" target="_blank">
Install and configure Sourcegraph
</a>
</Link>
. Skip this step if you already have a private Sourcegraph instance.
</li>
<li className="mb-2">Click the Sourcegraph icon in the browser toolbar to bring up this popup again.</li>
@ -323,9 +323,9 @@ export const SourcegraphURLForm: React.FunctionComponent<SourcegraphURLFormProps
) : urlState.reason === URL_AUTH_ERROR ? (
<>
Authentication to Sourcegraph failed.{' '}
<a href={urlState.value} {...NEW_TAB_LINK_PROPS}>
<Link to={urlState.value} {...NEW_TAB_LINK_PROPS}>
Sign in to your instance
</a>{' '}
</Link>{' '}
to continue
</>
) : urlInputReference.current?.validity.typeMismatch ? (

View File

@ -4,6 +4,7 @@ import * as React from 'react'
import { Controller as ClientController } from '@sourcegraph/shared/src/extensions/controller'
import { ExtensionDevelopmentToolsPopover } from '@sourcegraph/shared/src/extensions/devtools'
import { PlatformContextProps } from '@sourcegraph/shared/src/platform/context'
import { Link } from '@sourcegraph/wildcard'
import { ShortcutProvider } from './ShortcutProvider'
@ -16,7 +17,7 @@ interface Props extends PlatformContextProps<'sideloadedExtensionURL' | 'setting
const makeExtensionLink = (sourcegraphURL: string): React.FunctionComponent<{ id: string }> => props => {
const extensionURL = new URL(sourcegraphURL)
extensionURL.pathname = `extensions/${props.id}`
return <a href={extensionURL.href}>{props.id}</a>
return <Link to={extensionURL.href}>{props.id}</Link>
}
/**

View File

@ -1,6 +1,6 @@
import * as React from 'react'
import { SourcegraphIcon } from '@sourcegraph/wildcard'
import { SourcegraphIcon, Link } from '@sourcegraph/wildcard'
export interface SourcegraphIconButtonProps
extends Pick<JSX.IntrinsicElements['a'], 'href' | 'title' | 'rel' | 'className' | 'onClick' | 'target'> {
@ -26,8 +26,8 @@ export const SourcegraphIconButton: React.FunctionComponent<SourcegraphIconButto
title,
dataTestId,
}) => (
<a
href={href}
<Link
to={href ?? ''}
className={className}
target={target ?? '_blank'}
rel={rel ?? 'noopener noreferrer'}
@ -37,5 +37,5 @@ export const SourcegraphIconButton: React.FunctionComponent<SourcegraphIconButto
data-testid={dataTestId}
>
<SourcegraphIcon className={iconClassName} /> {label}
</a>
</Link>
)

View File

@ -16,17 +16,17 @@ module.exports = {
},
rules: {
'react/forbid-elements': [
'off', // Currently disabled until first `<Button />` component is migrated: https://github.com/sourcegraph/codemod/issues/31
'error',
{
forbid: [
{
element: 'button',
message: 'Use the <Button /> component from @sourcegraph/wildcard instead.',
},
{
element: 'textarea',
message: 'Use the <TextArea /> component from @sourcegraph/wildcard instead.',
},
{
element: 'a',
message: 'Use the <Link /> component from @sourcegraph/wildcard instead.',
},
],
},
],
@ -41,6 +41,18 @@ module.exports = {
],
},
],
'no-restricted-imports': [
'error',
{
paths: [
{
name: 'react-router-dom',
importNames: ['Link'],
message: 'Use the <Link /> component from @sourcegraph/wildcard instead.',
},
],
},
],
},
},
},

View File

@ -4,7 +4,7 @@ import React, { useCallback, useState } from 'react'
import { DropdownItem, DropdownMenu, DropdownToggle, ButtonDropdown } from 'reactstrap'
import { TelemetryProps } from '@sourcegraph/shared/src/telemetry/telemetryService'
import { Alert } from '@sourcegraph/wildcard'
import { Link, Alert } from '@sourcegraph/wildcard'
interface SearchHelpDropdownButtonProps extends TelemetryProps {
isSourcegraphDotCom?: boolean
@ -115,15 +115,15 @@ export const SearchHelpDropdownButton: React.FunctionComponent<SearchHelpDropdow
</li>
</ul>
<DropdownItem divider={true} className="mb-0" />
<a
<Link
target="_blank"
rel="noopener"
href={`${documentationUrlPrefix}/code_search/reference/queries`}
to={`${documentationUrlPrefix}/code_search/reference/queries`}
className="dropdown-item"
onClick={onQueryDocumentationLinkClicked}
>
<ExternalLinkIcon className="icon-inline small" /> All search keywords
</a>
</Link>
{isSourcegraphDotCom && (
<Alert className="small rounded-0 mb-0 mt-1" variant="info">
On Sourcegraph.com, use a <code>repo:</code> filter to narrow your search to &le;500

View File

@ -5,6 +5,7 @@ import * as React from 'react'
import { Progress } from '@sourcegraph/shared/src/search/stream'
import { pluralize } from '@sourcegraph/shared/src/util/strings'
import { Link } from '@sourcegraph/wildcard'
import { StreamingProgressProps } from './StreamingProgress'
import styles from './StreamingProgressCount.module.scss'
@ -53,10 +54,10 @@ export const StreamingProgressCount: React.FunctionComponent<
</small>
{showTrace && progress.trace && (
<small className="d-flex ml-2">
<a href={progress.trace}>
<Link to={progress.trace}>
<ClipboardPulseOutlineIcon className="mr-2 icon-inline" />
View trace
</a>
</Link>
</small>
)}
</>

View File

@ -149,6 +149,7 @@ exports[`StreamingProgressCount should render correctly when a trace url is prov
class="d-flex ml-2"
>
<a
class=""
href="https://sourcegraph.test:3443/-/debug/jaeger/trace/abcdefg"
>
<svg

View File

@ -5,6 +5,7 @@ import * as H from 'history'
import React from 'react'
import webMainStyles from '@sourcegraph/web/src/SourcegraphWebApp.scss'
import { Link } from '@sourcegraph/wildcard'
import { subtypeOf } from '../../util/types'
@ -23,7 +24,7 @@ const baseActivation = (): Activation => ({
title: 'Search your code',
detail: (
<span>
Head to the <a href="/search">homepage</a> and perform a search query on your code.{' '}
Head to the <Link to="/search">homepage</Link> and perform a search query on your code.{' '}
<strong>Example:</strong> type 'lang:' and select a language
</span>
),

View File

@ -2,7 +2,7 @@ import classNames from 'classnames'
import React from 'react'
import { HoverAlert } from 'sourcegraph'
import { Alert } from '@sourcegraph/wildcard'
import { Link, Alert } from '@sourcegraph/wildcard'
import { NotificationType } from '../../api/extension/extensionHostApi'
import { renderMarkdown } from '../../util/markdown'
@ -77,9 +77,9 @@ export const HoverOverlayAlerts: React.FunctionComponent<HoverOverlayAlertsProps
<div className={classNames(hoverOverlayStyle.alertDismiss)}>
{/* Ideally this should a <button> but we can't guarantee we have the .btn-link class here. */}
{/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
<a href="" onClick={createAlertDismissedHandler(type)} role="button">
<Link to="" onClick={createAlertDismissedHandler(type)} role="button">
<small>Dismiss</small>
</a>
</Link>
</div>
)}
</Alert>

View File

@ -283,6 +283,7 @@ exports[`HoverOverlay actions, hover and alert present 1`] = `
class="alertDismiss"
>
<a
class=""
href=""
role="button"
>

View File

@ -185,13 +185,13 @@ export const CloudSignUpPage: React.FunctionComponent<Props> = ({
<small className="text-muted">
By registering, you agree to our{' '}
<a href="https://about.sourcegraph.com/terms" target="_blank" rel="noopener">
<Link to="https://about.sourcegraph.com/terms" target="_blank" rel="noopener">
Terms of Service
</a>{' '}
</Link>{' '}
and{' '}
<a href="https://about.sourcegraph.com/privacy" target="_blank" rel="noopener">
<Link to="https://about.sourcegraph.com/privacy" target="_blank" rel="noopener">
Privacy Policy
</a>
</Link>
.
</small>

View File

@ -2,6 +2,8 @@ import classNames from 'classnames'
import GithubIcon from 'mdi-react/GithubIcon'
import React from 'react'
import { Link } from '@sourcegraph/wildcard'
import { AuthProvider, SourcegraphContext } from '../jscontext'
import styles from './CloudSignUpPage.module.scss'
@ -68,8 +70,8 @@ const ExternalsAuth: React.FunctionComponent<ExternalsAuthProps> = ({
return (
<>
{githubProvider && (
<a
href={maybeAddPostSignUpRedirect(githubProvider.authenticationURL)}
<Link
to={maybeAddPostSignUpRedirect(githubProvider.authenticationURL)}
className={classNames(
'text-decoration-none',
withCenteredText && 'd-flex justify-content-center',
@ -79,12 +81,12 @@ const ExternalsAuth: React.FunctionComponent<ExternalsAuthProps> = ({
onClick={() => onClick('github')}
>
<GithubIcon className="mr-3" /> {githubLabel}
</a>
</Link>
)}
{gitlabProvider && (
<a
href={maybeAddPostSignUpRedirect(gitlabProvider.authenticationURL)}
<Link
to={maybeAddPostSignUpRedirect(gitlabProvider.authenticationURL)}
className={classNames(
'text-decoration-none',
withCenteredText && 'd-flex justify-content-center',
@ -94,7 +96,7 @@ const ExternalsAuth: React.FunctionComponent<ExternalsAuthProps> = ({
onClick={() => onClick('gitlab')}
>
<GitlabColorIcon className="mr-3" /> {gitlabLabel}
</a>
</Link>
)}
</>
)

View File

@ -16,7 +16,7 @@ import {
ValidationOptions,
deriveInputClassName,
} from '@sourcegraph/shared/src/util/useInputValidation'
import { Button } from '@sourcegraph/wildcard'
import { Button, Link } from '@sourcegraph/wildcard'
import { LoaderButton } from '../components/LoaderButton'
import { FeatureFlagProps } from '../featureFlags/featureFlags'
@ -237,10 +237,10 @@ export const SignUpForm: React.FunctionComponent<SignUpFormProps> = ({
/>
Try Sourcegraph Enterprise free for{' '}
<span className="text-nowrap">
30 days {/* eslint-disable-next-line react/jsx-no-target-blank */}
<a target="_blank" rel="noopener" href="https://about.sourcegraph.com/pricing">
30 days{' '}
<Link target="_blank" rel="noopener" to="https://about.sourcegraph.com/pricing">
<HelpCircleOutlineIcon className="icon-inline" />
</a>
</Link>
</span>
</label>
</div>
@ -285,14 +285,14 @@ export const SignUpForm: React.FunctionComponent<SignUpFormProps> = ({
{!experimental && (
<p className="mt-3 mb-0">
<small className="form-text text-muted">
By signing up, you agree to our {/* eslint-disable-next-line react/jsx-no-target-blank */}
<a href="https://about.sourcegraph.com/terms" target="_blank" rel="noopener">
By signing up, you agree to our{' '}
<Link to="https://about.sourcegraph.com/terms" target="_blank" rel="noopener">
Terms of Service
</a>{' '}
and {/* eslint-disable-next-line react/jsx-no-target-blank */}
<a href="https://about.sourcegraph.com/privacy" target="_blank" rel="noopener">
</Link>{' '}
and{' '}
<Link to="https://about.sourcegraph.com/privacy" target="_blank" rel="noopener">
Privacy Policy
</a>
</Link>
.
</small>
</p>

View File

@ -1,7 +1,7 @@
import { gql, useMutation } from '@apollo/client'
import React, { useCallback, useState } from 'react'
import { Alert } from '@sourcegraph/wildcard'
import { Link, Alert } from '@sourcegraph/wildcard'
import { LoaderButton } from '../components/LoaderButton'
@ -54,13 +54,13 @@ export const TosConsentModal: React.FunctionComponent<{ afterTosAccepted: () =>
<label className="form-check-label">
<input type="checkbox" className="form-check-input" onChange={onAgreeChanged} /> I agree
to Sourcegraph's{' '}
<a href="https://about.sourcegraph.com/terms" target="_blank" rel="noopener">
<Link to="https://about.sourcegraph.com/terms" target="_blank" rel="noopener">
Terms of Service
</a>{' '}
</Link>{' '}
and{' '}
<a href="https://about.sourcegraph.com/privacy" target="_blank" rel="noopener">
<Link to="https://about.sourcegraph.com/privacy" target="_blank" rel="noopener">
Privacy Policy
</a>{' '}
</Link>{' '}
(required)
</label>
</div>
@ -75,7 +75,7 @@ export const TosConsentModal: React.FunctionComponent<{ afterTosAccepted: () =>
/>
</form>
<p className="mt-5">
If you do not agree, <a href="/-/sign-out">sign out</a> and contact your site admin to have your
If you do not agree, <Link to="/-/sign-out">sign out</Link> and contact your site admin to have your
account deleted.
</p>
{error && (

View File

@ -1,10 +1,11 @@
import classNames from 'classnames'
import ChevronLeftIcon from 'mdi-react/ChevronLeftIcon'
import React from 'react'
import { Link, useLocation } from 'react-router-dom'
import { useLocation } from 'react-router-dom'
import { TelemetryProps } from '@sourcegraph/shared/src/telemetry/telemetryService'
import { ThemeProps } from '@sourcegraph/shared/src/theme'
import { Link } from '@sourcegraph/wildcard'
import { BrandLogo } from '../components/branding/BrandLogo'
import { FeatureFlagProps } from '../featureFlags/featureFlags'
@ -147,13 +148,13 @@ export const VsCodeSignUpPage: React.FunctionComponent<Props> = ({
{renderAuthMethod()}
<small className="text-muted">
By registering, you agree to our{' '}
<a href="https://about.sourcegraph.com/terms" target="_blank" rel="noopener">
<Link to="https://about.sourcegraph.com/terms" target="_blank" rel="noopener">
Terms of Service
</a>{' '}
</Link>{' '}
and{' '}
<a href="https://about.sourcegraph.com/privacy" target="_blank" rel="noopener">
<Link to="https://about.sourcegraph.com/privacy" target="_blank" rel="noopener">
Privacy Policy
</a>
</Link>
.
</small>
<hr className={styles.separator} />

View File

@ -93,6 +93,7 @@ exports[`SignUpPage renders sign up page (cloud) 1`] = `
>
By registering, you agree to our
<a
class=""
href="https://about.sourcegraph.com/terms"
rel="noopener"
target="_blank"
@ -101,6 +102,7 @@ exports[`SignUpPage renders sign up page (cloud) 1`] = `
</a>
and
<a
class=""
href="https://about.sourcegraph.com/privacy"
rel="noopener"
target="_blank"
@ -274,6 +276,7 @@ exports[`SignUpPage renders sign up page (server) 1`] = `
>
By signing up, you agree to our
<a
class=""
href="https://about.sourcegraph.com/terms"
rel="noopener"
target="_blank"
@ -282,6 +285,7 @@ exports[`SignUpPage renders sign up page (server) 1`] = `
</a>
and
<a
class=""
href="https://about.sourcegraph.com/privacy"
rel="noopener"
target="_blank"

View File

@ -1,5 +1,7 @@
import React from 'react'
import { Link } from '@sourcegraph/wildcard'
import { CommunitySearchContextPage, CommunitySearchContextPageProps } from './CommunitySearchContextPage'
import { CommunitySearchContextMetadata } from './types'
@ -10,9 +12,9 @@ export const cncf: CommunitySearchContextMetadata = {
description: (
<>
Search the{' '}
<a href="https://landscape.cncf.io/project=hosted" target="_blank" rel="noopener noreferrer">
<Link to="https://landscape.cncf.io/project=hosted" target="_blank" rel="noopener noreferrer">
CNCF projects
</a>
</Link>
</>
),
examples: [],

View File

@ -1,6 +1,8 @@
import { storiesOf } from '@storybook/react'
import React from 'react'
import { Link } from '@sourcegraph/wildcard'
import { Breadcrumbs } from './Breadcrumbs'
import { WebStory } from './WebStory'
@ -18,20 +20,20 @@ add(
breadcrumbs={[
{
depth: 0,
breadcrumb: { key: 'home', element: <a href="/">Home</a>, divider: null },
breadcrumb: { key: 'home', element: <Link to="/">Home</Link>, divider: null },
},
{
depth: 1,
breadcrumb: { key: 'repo_area', element: <a href="/">Repositories</a> },
breadcrumb: { key: 'repo_area', element: <Link to="/">Repositories</Link> },
},
{
depth: 2,
breadcrumb: {
key: 'repo',
element: (
<a href="/">
<Link to="/">
sourcegraph/<span className="font-weight-medium">sourcegraph</span>
</a>
</Link>
),
},
},
@ -45,14 +47,14 @@ add(
},
{
depth: 4,
breadcrumb: { key: 'directory1', element: <a href="/">path</a> },
breadcrumb: { key: 'directory1', element: <Link to="/">path</Link> },
},
{
depth: 5,
breadcrumb: {
key: 'directory2',
divider: <span className="mx-1">/</span>,
element: <a href="/">to</a>,
element: <Link to="/">to</Link>,
},
},
{
@ -60,7 +62,7 @@ add(
breadcrumb: {
key: 'fileName',
divider: <span className="mx-1">/</span>,
element: <a href="/">file.tsx</a>,
element: <Link to="/">file.tsx</Link>,
},
},
]}

View File

@ -37,7 +37,6 @@ export const CtaBanner: React.FunctionComponent<Props> = ({
<p className={bodyTextClassName}>{bodyText}</p>
<Button
href={href}
// eslint-disable-next-line react/jsx-no-target-blank
target="_blank"
rel="noreferrer"
onClick={onClick}

View File

@ -1,6 +1,8 @@
import { storiesOf } from '@storybook/react'
import React from 'react'
import { Link } from '@sourcegraph/wildcard'
import { WebStory } from '../WebStory'
import { DismissibleAlert } from './DismissibleAlert'
@ -10,7 +12,7 @@ const { add } = storiesOf('web/DismissibleAlert', module).addDecorator(story =>
add('One-line alert', () => (
<DismissibleAlert variant="info" partialStorageKey="dismissible-alert-one-line">
<span>
1 bulk operation has recently failed running. Click the <a href="?">bulk operations tab</a> to view.
1 bulk operation has recently failed running. Click the <Link to="?">bulk operations tab</Link> to view.
</span>
</DismissibleAlert>
))

View File

@ -2,6 +2,8 @@ import { DecoratorFn, Meta } from '@storybook/react'
import ArrowRightIcon from 'mdi-react/ArrowRightIcon'
import React from 'react'
import { Link } from '@sourcegraph/wildcard'
import { WebStory } from '../WebStory'
import { MarketingBlock } from './MarketingBlock'
@ -20,10 +22,10 @@ export const Basic = (): JSX.Element => (
<h3 className="pr-3">Need help getting started?</h3>
<div>
<a href="https://sourcegraph.com/search">
<Link to="https://sourcegraph.com/search">
Speak to an engineer
<ArrowRightIcon className="icon-inline ml-2" />
</a>
</Link>
</div>
</MarketingBlock>
)

View File

@ -4,6 +4,7 @@ import React from 'react'
import { TelemetryProps } from '@sourcegraph/shared/src/telemetry/telemetryService'
import { MarketingBlock } from '@sourcegraph/web/src/components/MarketingBlock'
import { Link } from '@sourcegraph/wildcard'
export interface SelfHostedCtaProps extends TelemetryProps {
className?: string
@ -47,22 +48,22 @@ export const SelfHostedCta: React.FunctionComponent<SelfHostedCtaProps> = ({
<ul>
<li>
<a
<Link
onClick={gettingStartedCTAOnClick}
href="https://docs.sourcegraph.com/admin/install"
to="https://docs.sourcegraph.com/admin/install"
{...linkProps}
>
Learn how to install
</a>
</Link>
</li>
<li>
<a
<Link
onClick={selfVsCloudDocumentsLinkOnClick}
href="https://docs.sourcegraph.com/code_search/explanations/sourcegraph_cloud#who-is-sourcegraph-cloud-for-why-should-i-use-this-over-sourcegraph-self-hosted"
to="https://docs.sourcegraph.com/code_search/explanations/sourcegraph_cloud#who-is-sourcegraph-cloud-for-why-should-i-use-this-over-sourcegraph-self-hosted"
{...linkProps}
>
Self-hosted vs. cloud features
</a>
</Link>
</li>
</ul>
</div>
@ -71,14 +72,14 @@ export const SelfHostedCta: React.FunctionComponent<SelfHostedCtaProps> = ({
<h3 className="pr-3">Need help getting started?</h3>
<div>
<a
<Link
onClick={helpGettingStartedCTAOnClick}
href=" https://info.sourcegraph.com/talk-to-a-developer?form_submission_source=inproduct?utm_campaign=inproduct-talktoadev&utm_medium=direct_traffic&utm_source=inproduct-talktoadev&utm_term=null&utm_content=talktoadevform"
to=" https://info.sourcegraph.com/talk-to-a-developer?form_submission_source=inproduct?utm_campaign=inproduct-talktoadev&utm_medium=direct_traffic&utm_source=inproduct-talktoadev&utm_term=null&utm_content=talktoadevform"
{...linkProps}
>
Speak to an engineer
<ArrowRightIcon className="icon-inline ml-2" />
</a>
</Link>
</div>
</MarketingBlock>
</div>

View File

@ -2,6 +2,7 @@ import classNames from 'classnames'
import React from 'react'
import { TelemetryProps } from '@sourcegraph/shared/src/telemetry/telemetryService'
import { Link } from '@sourcegraph/wildcard'
import styles from './SelfHostedCtaLink.module.scss'
@ -27,9 +28,9 @@ export const SelfHostedCtaLink: React.FunctionComponent<SelfHostedCtaLinkProps>
<div className={classNames(styles.container, className)}>
<span className={contentClassName}>
Get Sourcegraph for teams via our{' '}
<a onClick={gettingStartedCTAOnClick} href="https://docs.sourcegraph.com/admin/install" {...linkProps}>
<Link onClick={gettingStartedCTAOnClick} to="https://docs.sourcegraph.com/admin/install" {...linkProps}>
self-hosted installation
</a>
</Link>
.
</span>
</div>

View File

@ -23,7 +23,7 @@ export const SidebarNavItem: React.FunctionComponent<{
if (source === 'server') {
return (
<Button as="a" href={to} className={buttonClassNames}>
<Button as="a" href={to} className={classNames(buttonClassNames, className)}>
{children}
</Button>
)

View File

@ -95,8 +95,7 @@ export const FileDiffNode: React.FunctionComponent<FileDiffNodeProps> = ({
return (
<>
{/* The empty <a> tag is to allow users to anchor links to the top of this file diff node */}
{/* eslint-disable-next-line jsx-a11y/anchor-has-content, jsx-a11y/anchor-is-valid */}
<a id={anchor} aria-hidden={true} />
<Link to="" id={anchor} aria-hidden={true} />
<div className={classNames('test-file-diff-node', styles.fileDiffNode, className)}>
<div className={styles.header}>
<Button className="btn-icon mr-2" onClick={toggleExpand} size="sm">

View File

@ -3,7 +3,7 @@ import React from 'react'
import { TelemetryProps } from '@sourcegraph/shared/src/telemetry/telemetryService'
import { ThemeProps } from '@sourcegraph/shared/src/theme'
import { useLocalStorage, Button, Alert } from '@sourcegraph/wildcard'
import { useLocalStorage, Button, Link, Alert } from '@sourcegraph/wildcard'
import { Scalars } from '../../graphql-operations'
import { PageTitle } from '../PageTitle'
@ -100,24 +100,24 @@ export const AddExternalServicesPage: React.FunctionComponent<AddExternalService
<li>Periodically pulling cloned repositories to ensure search results are current.</li>
<li>
Fetching{' '}
<a
href="https://docs.sourcegraph.com/admin/repo/permissions"
<Link
to="https://docs.sourcegraph.com/admin/repo/permissions"
target="_blank"
rel="noopener noreferrer"
>
user repository access permissions
</a>
</Link>
, if you have enabled this feature.
</li>
<li>
Opening pull requests and syncing their metadata as part of{' '}
<a
href="https://docs.sourcegraph.com/user/batch_changes"
<Link
to="https://docs.sourcegraph.com/user/batch_changes"
target="_blank"
rel="noopener noreferrer"
>
batch changes
</a>
</Link>
, if you have enabled this feature.
</li>
</ul>

View File

@ -1,6 +1,6 @@
import React from 'react'
import { Alert } from '@sourcegraph/wildcard'
import { Alert, Link } from '@sourcegraph/wildcard'
import { ExternalServiceFields, ExternalServiceKind } from '../../graphql-operations'
import { CopyableText } from '../CopyableText'
@ -20,22 +20,22 @@ export const ExternalServiceWebhook: React.FunctionComponent<Props> = ({ externa
case ExternalServiceKind.BITBUCKETSERVER:
description = (
<p>
<a
href="https://docs.sourcegraph.com/admin/external_service/bitbucket_server#webhooks"
<Link
to="https://docs.sourcegraph.com/admin/external_service/bitbucket_server#webhooks"
target="_blank"
rel="noopener noreferrer"
>
Webhooks
</a>{' '}
</Link>{' '}
will be created automatically on the configured Bitbucket Server instance. In case you don't provide
an admin token,{' '}
<a
href="https://docs.sourcegraph.com/admin/external_service/bitbucket_server#manual-configuration"
<Link
to="https://docs.sourcegraph.com/admin/external_service/bitbucket_server#manual-configuration"
target="_blank"
rel="noopener noreferrer"
>
follow the docs on how to set up webhooks manually
</a>
</Link>
.
<br />
To set up another webhook manually, use the following URL:
@ -59,13 +59,13 @@ export const ExternalServiceWebhook: React.FunctionComponent<Props> = ({ externa
<CopyableText className="mb-2" text={webhookURL} size={webhookURL.length} />
<p className="mb-0">
Note that only{' '}
<a href="https://docs.sourcegraph.com/user/batch_changes" target="_blank" rel="noopener noreferrer">
<Link to="https://docs.sourcegraph.com/user/batch_changes" target="_blank" rel="noopener noreferrer">
batch changes
</a>{' '}
</Link>{' '}
make use of this webhook. To enable webhooks to trigger repository updates on Sourcegraph,{' '}
<a href="https://docs.sourcegraph.com/admin/repo/webhooks" target="_blank" rel="noopener noreferrer">
<Link to="https://docs.sourcegraph.com/admin/repo/webhooks" target="_blank" rel="noopener noreferrer">
see the docs on how to use them
</a>
</Link>
.
</p>
</Alert>
@ -76,13 +76,13 @@ function commonDescription(url: string): JSX.Element {
return (
<p>
Point{' '}
<a
href={`https://docs.sourcegraph.com/admin/external_service/${url}#webhooks`}
<Link
to={`https://docs.sourcegraph.com/admin/external_service/${url}#webhooks`}
target="_blank"
rel="noopener noreferrer"
>
webhooks
</a>{' '}
</Link>{' '}
for this code host connection at the following URL:
</p>
)

View File

@ -10,6 +10,7 @@ import NpmIcon from 'mdi-react/NpmIcon'
import React from 'react'
import { PhabricatorIcon } from '@sourcegraph/shared/src/components/icons'
import { Link } from '@sourcegraph/wildcard'
import awsCodeCommitSchemaJSON from '../../../../../schema/aws_codecommit.schema.json'
import bitbucketCloudSchemaJSON from '../../../../../schema/bitbucket_cloud.schema.json'
@ -127,13 +128,13 @@ const githubInstructions = (isEnterprise: boolean): JSX.Element => (
)}
<li>
Create a GitHub access token (
<a
href="https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line"
<Link
to="https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line"
target="_blank"
rel="noopener noreferrer"
>
instructions
</a>
</Link>
) with <b>repo</b> scope.
<li>
Set the value of the <Field>token</Field> field as your access token, in the configuration below.
@ -163,13 +164,13 @@ const githubInstructions = (isEnterprise: boolean): JSX.Element => (
</ol>
<p>
See{' '}
<a
<Link
rel="noopener noreferrer"
target="_blank"
href="https://docs.sourcegraph.com/admin/external_service/github#configuration"
to="https://docs.sourcegraph.com/admin/external_service/github#configuration"
>
the docs for more options
</a>
</Link>
, or try one of the buttons below.
</p>
</div>
@ -185,13 +186,13 @@ const gitlabInstructions = (isSelfManaged: boolean): JSX.Element => (
)}
<li>
Create a GitLab access token (
<a
href="https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#creating-a-personal-access-token"
<Link
to="https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#creating-a-personal-access-token"
target="_blank"
rel="noopener noreferrer"
>
instructions
</a>
</Link>
) with{' '}
<b>
<Field>repo</Field>
@ -203,13 +204,13 @@ const gitlabInstructions = (isSelfManaged: boolean): JSX.Element => (
<ul>
<li>
<Field>projectQuery</Field> is a list of calls to{' '}
<a
<Link
target="_blank"
rel="noopener noreferrer"
href="https://docs.gitlab.com/ee/api/projects.html"
to="https://docs.gitlab.com/ee/api/projects.html"
>
GitLab's REST API
</a>{' '}
</Link>{' '}
that return a list of projects.
<br />
<Value>"groups/&lt;mygroup&gt;/projects"</Value> selects all projects in a group.
@ -231,13 +232,13 @@ const gitlabInstructions = (isSelfManaged: boolean): JSX.Element => (
</ol>
<p>
See{' '}
<a
<Link
rel="noopener noreferrer"
target="_blank"
href="https://docs.sourcegraph.com/admin/external_service/gitlab#configuration"
to="https://docs.sourcegraph.com/admin/external_service/gitlab#configuration"
>
the docs for more options
</a>
</Link>
, or try one of the buttons below.
</p>
</div>
@ -574,13 +575,13 @@ const AWS_CODE_COMMIT: AddExternalServiceOptions = {
</li>
<li>
Create Git credentials for AWS CodeCommit (
<a
href="https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-gc.html#setting-up-gc-iam"
<Link
to="https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-gc.html#setting-up-gc-iam"
target="_blank"
rel="noopener noreferrer"
>
instructions
</a>
</Link>
) and set these in the <Field>gitCredentials</Field> field.
</li>
<li>
@ -589,13 +590,13 @@ const AWS_CODE_COMMIT: AddExternalServiceOptions = {
</ol>
<p>
See{' '}
<a
<Link
rel="noopener noreferrer"
target="_blank"
href="https://docs.sourcegraph.com/admin/external_service/aws_codecommit#configuration"
to="https://docs.sourcegraph.com/admin/external_service/aws_codecommit#configuration"
>
the docs for more options
</a>
</Link>
, or try one of the buttons below.
</p>
</div>
@ -697,13 +698,13 @@ const BITBUCKET_CLOUD: AddExternalServiceOptions = {
<ol>
<li>
Create a Bitbucket app password (
<a
href="https://confluence.atlassian.com/bitbucket/app-passwords-828781300.html"
<Link
to="https://confluence.atlassian.com/bitbucket/app-passwords-828781300.html"
target="_blank"
rel="noopener noreferrer"
>
instructions
</a>
</Link>
) with <b>read</b> scope over your repositories and teams. Set it to be the value of the{' '}
<Field>appPassword</Field> field in the configuration below.
</li>
@ -718,13 +719,13 @@ const BITBUCKET_CLOUD: AddExternalServiceOptions = {
</ol>
<p>
See{' '}
<a
<Link
rel="noopener noreferrer"
target="_blank"
href="https://docs.sourcegraph.com/admin/external_service/bitbucket_cloud#configuration"
to="https://docs.sourcegraph.com/admin/external_service/bitbucket_cloud#configuration"
>
the docs for more options
</a>
</Link>
, or try one of the buttons below.
</p>
</div>
@ -752,13 +753,13 @@ const BITBUCKET_SERVER: AddExternalServiceOptions = {
</li>
<li>
Create a personal access token (
<a
href="https://confluence.atlassian.com/bitbucketserver/personal-access-tokens-939515499.html"
<Link
to="https://confluence.atlassian.com/bitbucketserver/personal-access-tokens-939515499.html"
target="_blank"
rel="noopener noreferrer"
>
instructions
</a>
</Link>
) with <Field>read</Field> scope.
</li>
<li>
@ -777,13 +778,13 @@ const BITBUCKET_SERVER: AddExternalServiceOptions = {
A query string like{' '}
<Value>"{'?name=<repo name>&projectname=<project>&visibility=private'}"</Value> that
specifies search query parameters. See{' '}
<a
href="https://docs.atlassian.com/bitbucket-server/rest/6.1.2/bitbucket-rest.html#idp355"
<Link
to="https://docs.atlassian.com/bitbucket-server/rest/6.1.2/bitbucket-rest.html#idp355"
target="_blank"
rel="noopener noreferrer"
>
the full list of parameters
</a>
</Link>
.
</li>
<li>
@ -807,13 +808,13 @@ const BITBUCKET_SERVER: AddExternalServiceOptions = {
</ol>
<p>
See{' '}
<a
<Link
rel="noopener noreferrer"
target="_blank"
href="https://docs.sourcegraph.com/admin/external_service/bitbucket_server#configuration"
to="https://docs.sourcegraph.com/admin/external_service/bitbucket_server#configuration"
>
the docs for more options
</a>
</Link>
, or try one of the buttons below.
</p>
</div>
@ -943,9 +944,9 @@ const SRC_SERVE_GIT: AddExternalServiceOptions = {
</p>
<p>
Install the{' '}
<a rel="noopener noreferrer" target="_blank" href="https://github.com/sourcegraph/src-cli">
<Link rel="noopener noreferrer" target="_blank" to="https://github.com/sourcegraph/src-cli">
Sourcegraph CLI (src)
</a>
</Link>
. src serve-git allows you to serve any git repositories that you have on disk.
</p>
</div>
@ -986,13 +987,13 @@ const GITOLITE: AddExternalServiceOptions = {
</ol>
<p>
See{' '}
<a
<Link
rel="noopener noreferrer"
target="_blank"
href="https://docs.sourcegraph.com/admin/external_service/gitolite#configuration"
to="https://docs.sourcegraph.com/admin/external_service/gitolite#configuration"
>
the docs for more advanced options
</a>
</Link>
, or try one of the buttons below.
</p>
</div>
@ -1091,13 +1092,13 @@ const GENERIC_GIT: AddExternalServiceOptions = {
</ol>
<p>
See{' '}
<a
<Link
rel="noopener noreferrer"
target="_blank"
href="https://docs.sourcegraph.com/admin/external_service/other#configuration"
to="https://docs.sourcegraph.com/admin/external_service/other#configuration"
>
the docs for more options
</a>
</Link>
, or try one of the buttons below.
</p>
</div>
@ -1150,13 +1151,13 @@ const PERFORCE: AddExternalServiceOptions = {
</ol>
<p>
See{' '}
<a
<Link
rel="noopener noreferrer"
target="_blank"
href="https://docs.sourcegraph.com/admin/repo/perforce#configuration"
to="https://docs.sourcegraph.com/admin/repo/perforce#configuration"
>
the docs for more advanced options
</a>
</Link>
, or try one of the buttons below.
</p>
</div>

View File

@ -61,14 +61,14 @@ interface BatchSpecDownloadLinkProps extends BatchSpecProps, Pick<BatchChangeFie
export const BatchSpecDownloadLink: React.FunctionComponent<BatchSpecDownloadLinkProps> = React.memo(
function BatchSpecDownloadLink({ children, className, name, originalInput }) {
return (
<a
<Link
download={getFileName(name)}
href={'data:text/plain;charset=utf-8,' + encodeURIComponent(originalInput)}
to={'data:text/plain;charset=utf-8,' + encodeURIComponent(originalInput)}
className={className}
data-tooltip={`Download ${getFileName(name)}`}
>
{children}
</a>
</Link>
)
}
)

View File

@ -4,7 +4,7 @@ import { Settings } from '@sourcegraph/shared/src/schema/settings.schema'
import { SettingsCascadeProps } from '@sourcegraph/shared/src/settings/settings'
import { ThemeProps } from '@sourcegraph/shared/src/theme'
import { Page } from '@sourcegraph/web/src/components/Page'
import { PageHeader } from '@sourcegraph/wildcard'
import { PageHeader, Link } from '@sourcegraph/wildcard'
import { isBatchChangesExecutionEnabled } from '../../../batches'
import { BatchChangesIcon } from '../../../batches/icons'
@ -49,9 +49,9 @@ export const CreateBatchChangePage: React.FunctionComponent<CreateBatchChangePag
description={
<>
Follow these steps to create a Batch Change. Need help? View the{' '}
<a href="/help/batch_changes" rel="noopener noreferrer" target="_blank">
<Link to="/help/batch_changes" rel="noopener noreferrer" target="_blank">
documentation.
</a>
</Link>
</>
}
className="mb-3"

View File

@ -1,7 +1,7 @@
import React, { useCallback, useState } from 'react'
import { CodeSnippet } from '@sourcegraph/branded/src/components/CodeSnippet'
import { Container, Button } from '@sourcegraph/wildcard'
import { Container, Button, Link } from '@sourcegraph/wildcard'
import { SidebarGroup, SidebarGroupHeader } from '../../../components/Sidebar'
@ -58,13 +58,13 @@ export const OldBatchChangePageContent: React.FunctionComponent<{}> = () => {
<Container className="mb-3">
<p className="mb-0">
The batch spec (
<a
href="https://docs.sourcegraph.com/batch_changes/references/batch_spec_yaml_reference"
<Link
to="https://docs.sourcegraph.com/batch_changes/references/batch_spec_yaml_reference"
rel="noopener noreferrer"
target="_blank"
>
syntax reference
</a>
</Link>
) describes what the batch change does. You'll provide it when previewing, creating, and updating
batch changes. We recommend committing it to source control.
</p>
@ -91,9 +91,9 @@ export const OldBatchChangePageContent: React.FunctionComponent<{}> = () => {
<Container className="mb-3">
<p>
Use the{' '}
<a href="https://github.com/sourcegraph/src-cli" rel="noopener noreferrer" target="_blank">
<Link to="https://github.com/sourcegraph/src-cli" rel="noopener noreferrer" target="_blank">
Sourcegraph CLI (src)
</a>{' '}
</Link>{' '}
to preview the commits and changesets that your batch change will make:
</p>
<CodeSnippet code={`src batch preview -f ${selectedSample.name}`} language="bash" className="mb-3" />

View File

@ -8,7 +8,7 @@ import { Settings } from '@sourcegraph/shared/src/schema/settings.schema'
import { SettingsCascadeProps } from '@sourcegraph/shared/src/settings/settings'
import { TelemetryProps } from '@sourcegraph/shared/src/telemetry/telemetryService'
import { Page } from '@sourcegraph/web/src/components/Page'
import { Container, PageHeader, useObservable, CardBody, Card } from '@sourcegraph/wildcard'
import { Container, PageHeader, useObservable, CardBody, Card, Link } from '@sourcegraph/wildcard'
import { AuthenticatedUser } from '../../../auth'
import { isBatchChangesExecutionEnabled } from '../../../batches'
@ -261,8 +261,8 @@ const BatchChangeListTabHeader: React.FunctionComponent<{
<ul className="nav nav-tabs d-inline-flex d-sm-flex flex-nowrap text-nowrap">
<li className="nav-item">
{/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
<a
href=""
<Link
to=""
onClick={onSelectBatchChanges}
className={classNames('nav-link', selectedTab === 'batchChanges' && 'active')}
role="button"
@ -270,12 +270,12 @@ const BatchChangeListTabHeader: React.FunctionComponent<{
<span className="text-content" data-tab-content="All batch changes">
All batch changes
</span>
</a>
</Link>
</li>
<li className="nav-item">
{/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
<a
href=""
<Link
to=""
onClick={onSelectGettingStarted}
className={classNames('nav-link', selectedTab === 'gettingStarted' && 'active')}
role="button"
@ -284,7 +284,7 @@ const BatchChangeListTabHeader: React.FunctionComponent<{
<span className="text-content" data-tab-content="Getting started">
Getting started
</span>
</a>
</Link>
</li>
</ul>
</div>
@ -298,9 +298,9 @@ const GettingStartedFooter: React.FunctionComponent<{}> = () => (
<CardBody className="text-center">
<p>Create your first batch change</p>
<h2 className="mb-0">
<a href="https://docs.sourcegraph.com/batch_changes/quickstart" target="_blank" rel="noopener">
<Link to="https://docs.sourcegraph.com/batch_changes/quickstart" target="_blank" rel="noopener">
Batch Changes quickstart
</a>
</Link>
</h2>
</CardBody>
</Card>

View File

@ -2,7 +2,7 @@ import classNames from 'classnames'
import React from 'react'
import { DismissibleAlert } from '@sourcegraph/web/src/components/DismissibleAlert'
import { CardBody, Card } from '@sourcegraph/wildcard'
import { CardBody, Card, Link } from '@sourcegraph/wildcard'
import styles from './BatchChangesListIntro.module.scss'
@ -16,13 +16,13 @@ export const BatchChangesChangelogAlert: React.FunctionComponent = () => (
<h4>Batch Changes updates in version 3.36</h4>
<ul className="mb-0 pl-3">
<li>
<a
href="https://docs.sourcegraph.com/admin/config/batch_changes#forks"
<Link
to="https://docs.sourcegraph.com/admin/config/batch_changes#forks"
rel="noopener"
target="_blank"
>
Batch Changes now supports pushing changesets to forked repositories.
</a>
</Link>
</li>
</ul>
</CardBody>

View File

@ -1,7 +1,7 @@
import classNames from 'classnames'
import React from 'react'
import { CardBody, Card } from '@sourcegraph/wildcard'
import { CardBody, Card, Link } from '@sourcegraph/wildcard'
import { SourcegraphIcon } from '../../../auth/icons'
@ -49,7 +49,7 @@ const BatchChangesUnlicensedAlert: React.FunctionComponent = () => (
up to five changesets without a license.
</p>
<p className="mb-0">
<a href="https://about.sourcegraph.com/contact/sales/">Contact sales</a> to obtain a trial
<Link to="https://about.sourcegraph.com/contact/sales/">Contact sales</Link> to obtain a trial
license.
</p>
</div>

View File

@ -1,7 +1,7 @@
import classNames from 'classnames'
import React from 'react'
import { Container, CardBody, Card } from '@sourcegraph/wildcard'
import { Container, CardBody, Card, Link } from '@sourcegraph/wildcard'
import styles from './GettingStarted.module.scss'
@ -61,12 +61,12 @@ export const GettingStarted: React.FunctionComponent<GettingStartedProps> = ({ f
<FindReplaceIcon className="mr-3" />
<div>
<h4>
<a
href="https://docs.sourcegraph.com/batch_changes/tutorials/search_and_replace_specific_terms"
<Link
to="https://docs.sourcegraph.com/batch_changes/tutorials/search_and_replace_specific_terms"
rel="noopener"
>
Finding and replacing exclusionary terms
</a>
</Link>
</h4>
<p className="text-muted mb-0">
A Sourcegraph query plus a simple <code>sed</code> command creates changesets required
@ -82,18 +82,18 @@ export const GettingStarted: React.FunctionComponent<GettingStartedProps> = ({ f
<RefactorCombyIcon className="mr-3" />
<div>
<h4>
<a
href="https://docs.sourcegraph.com/batch_changes/tutorials/updating_go_import_statements"
<Link
to="https://docs.sourcegraph.com/batch_changes/tutorials/updating_go_import_statements"
rel="noopener"
>
Refactoring with language aware search
</a>
</Link>
</h4>
<p className="text-muted mb-0">
Using{' '}
<a href="https://comby.dev/" rel="noopener">
<Link to="https://comby.dev/" rel="noopener">
Comby's
</a>{' '}
</Link>{' '}
language-aware structural search to refactor Go statements to a semantically equivalent,
but clearer execution.
</p>
@ -103,9 +103,9 @@ export const GettingStarted: React.FunctionComponent<GettingStartedProps> = ({ f
</div>
<div className="col-12 mb-4 text-right">
<p>
<a href="https://docs.sourcegraph.com/batch_changes/tutorials" rel="noopener">
<Link to="https://docs.sourcegraph.com/batch_changes/tutorials" rel="noopener">
More tutorials
</a>
</Link>
</p>
</div>
</div>
@ -116,9 +116,9 @@ export const GettingStarted: React.FunctionComponent<GettingStartedProps> = ({ f
<strong>Quickstart</strong>
</p>
<p>Create your first Sourcegraph batch change in 10 minutes or less.</p>
<a href="https://docs.sourcegraph.com/batch_changes/quickstart" rel="noopener">
<Link to="https://docs.sourcegraph.com/batch_changes/quickstart" rel="noopener">
Batch Changes quickstart
</a>
</Link>
</div>
<div className="col-12 col-md-4 mt-3">
<p>
@ -126,27 +126,27 @@ export const GettingStarted: React.FunctionComponent<GettingStartedProps> = ({ f
</p>
<p>
Learn about the batch spec{' '}
<a
href="https://docs.sourcegraph.com/batch_changes/references/batch_spec_yaml_reference"
<Link
to="https://docs.sourcegraph.com/batch_changes/references/batch_spec_yaml_reference"
rel="noopener"
>
YAML reference
</a>
</Link>
, its powerful{' '}
<a href="https://docs.sourcegraph.com/batch_changes/references/batch_spec_templating">
<Link to="https://docs.sourcegraph.com/batch_changes/references/batch_spec_templating">
templating language
</a>
</Link>
,{' '}
<a
href="https://docs.sourcegraph.com/batch_changes/explanations/permissions_in_batch_changes"
<Link
to="https://docs.sourcegraph.com/batch_changes/explanations/permissions_in_batch_changes"
rel="noopener"
>
permissions
</a>{' '}
</Link>{' '}
and more in the{' '}
<a href="https://docs.sourcegraph.com/batch_changes" rel="noopener">
<Link to="https://docs.sourcegraph.com/batch_changes" rel="noopener">
Batch Changes documentation
</a>
</Link>
.
</p>
</div>
@ -160,9 +160,9 @@ export const GettingStarted: React.FunctionComponent<GettingStartedProps> = ({ f
View the product marketing page for a high-level overview of benefits and customer use
cases.
</p>
<a href="https://about.sourcegraph.com/batch-changes" rel="noopener">
<Link to="https://about.sourcegraph.com/batch-changes" rel="noopener">
Batch Changes marketing page
</a>
</Link>
</CardBody>
</Card>
</div>

View File

@ -293,8 +293,8 @@ const ExpandedSection: React.FunctionComponent<
<ul className="nav nav-tabs d-inline-flex d-sm-flex flex-nowrap text-nowrap">
<li className="nav-item">
{/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
<a
href=""
<Link
to=""
role="button"
onClick={onSelectDiff}
className={classNames(
@ -316,12 +316,12 @@ const ExpandedSection: React.FunctionComponent<
/>
</small>
)}
</a>
</Link>
</li>
<li className="nav-item">
{/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
<a
href=""
<Link
to=""
role="button"
onClick={onSelectDescription}
className={classNames(
@ -343,12 +343,12 @@ const ExpandedSection: React.FunctionComponent<
/>
</small>
)}
</a>
</Link>
</li>
<li className="nav-item">
{/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
<a
href=""
<Link
to=""
role="button"
onClick={onSelectCommits}
className={classNames(
@ -372,7 +372,7 @@ const ExpandedSection: React.FunctionComponent<
/>
</small>
)}
</a>
</Link>
</li>
</ul>
</div>

View File

@ -4,7 +4,7 @@ import React, { useCallback, useState } from 'react'
import { ErrorAlert } from '@sourcegraph/branded/src/components/alerts'
import { Form } from '@sourcegraph/branded/src/components/Form'
import { asError, isErrorLike } from '@sourcegraph/common'
import { Button, LoadingSpinner, Modal } from '@sourcegraph/wildcard'
import { Button, LoadingSpinner, Modal, Link } from '@sourcegraph/wildcard'
import { ExternalServiceKind, Scalars } from '../../../graphql-operations'
@ -32,26 +32,26 @@ const HELP_TEXT_LINK_URL = 'https://docs.sourcegraph.com/batch_changes/quickstar
const helpTexts: Record<ExternalServiceKind, JSX.Element> = {
[ExternalServiceKind.GITHUB]: (
<>
<a href={HELP_TEXT_LINK_URL} rel="noreferrer noopener" target="_blank">
<Link to={HELP_TEXT_LINK_URL} rel="noreferrer noopener" target="_blank">
Create a new access token
</a>{' '}
</Link>{' '}
with the <code>repo</code>, <code>read:org</code>, <code>user:email</code>, <code>read:discussion</code>,
and <code>workflow</code> scopes.
</>
),
[ExternalServiceKind.GITLAB]: (
<>
<a href={HELP_TEXT_LINK_URL} rel="noreferrer noopener" target="_blank">
<Link to={HELP_TEXT_LINK_URL} rel="noreferrer noopener" target="_blank">
Create a new access token
</a>{' '}
</Link>{' '}
with <code>api</code>, <code>read_repository</code>, and <code>write_repository</code> scopes.
</>
),
[ExternalServiceKind.BITBUCKETSERVER]: (
<>
<a href={HELP_TEXT_LINK_URL} rel="noreferrer noopener" target="_blank">
<Link to={HELP_TEXT_LINK_URL} rel="noreferrer noopener" target="_blank">
Create a new access token
</a>{' '}
</Link>{' '}
with <code>write</code> permissions on the project and repository level.
</>
),

View File

@ -2,7 +2,7 @@ import React, { useCallback, useMemo } from 'react'
import { RouteComponentProps } from 'react-router'
import { Observable, Subject } from 'rxjs'
import { Container } from '@sourcegraph/wildcard'
import { Container, Link } from '@sourcegraph/wildcard'
import { FilteredConnection } from '../../../components/FilteredConnection'
import {
@ -74,9 +74,13 @@ export const CodeHostConnections: React.FunctionComponent<CodeHostConnectionsPro
/>
<p className="mb-0">
Code host not present? Site admins can add a code host in{' '}
<a href="https://docs.sourcegraph.com/admin/external_service" target="_blank" rel="noopener noreferrer">
<Link
to="https://docs.sourcegraph.com/admin/external_service"
target="_blank"
rel="noopener noreferrer"
>
the manage repositories settings
</a>
</Link>
.
</p>
</Container>

View File

@ -3,7 +3,7 @@ import { noop } from 'lodash'
import ContentCopyIcon from 'mdi-react/ContentCopyIcon'
import React, { useCallback, useState } from 'react'
import { Button, TextArea } from '@sourcegraph/wildcard'
import { Button, TextArea, Link } from '@sourcegraph/wildcard'
import { ExternalServiceKind } from '../../../graphql-operations'
@ -65,9 +65,9 @@ export const CodeHostSshPublicKey: React.FunctionComponent<CodeHostSshPublicKeyP
/>
{showInstructionsLink && (
<p>
<a href={configInstructionLinks[externalServiceKind]} target="_blank" rel="noopener">
<Link to={configInstructionLinks[externalServiceKind]} target="_blank" rel="noopener">
Configuration instructions
</a>
</Link>
</p>
)}
</>

View File

@ -117,7 +117,7 @@ export const CodeMonitorList: React.FunctionComponent<CodeMonitorListProps> = ({
</div>
</div>
<div className="mt-5">
We want to hear your feedback! <a href="mailto:feedback@sourcegraph.com">Share your thoughts</a>
We want to hear your feedback! <Link to="mailto:feedback@sourcegraph.com">Share your thoughts</Link>
</div>
</>
)

View File

@ -125,9 +125,9 @@ export const CodeMonitoringGettingStarted: React.FunctionComponent<CodeMonitorin
Craft searches that will monitor your code and trigger actions such as email
notifications.
</p>
<a href="https://docs.sourcegraph.com/code_monitoring" className="link">
<Link to="https://docs.sourcegraph.com/code_monitoring" className="link">
Code monitoring documentation
</a>
</Link>
</div>
</div>
<div className="col-4">
@ -137,12 +137,12 @@ export const CodeMonitoringGettingStarted: React.FunctionComponent<CodeMonitorin
Find specific examples of useful code monitors to keep on top of security and
consistency concerns.
</p>
<a
href="https://docs.sourcegraph.com/code_monitoring/how-tos/starting_points"
<Link
to="https://docs.sourcegraph.com/code_monitoring/how-tos/starting_points"
className="link"
>
Explore starting points
</a>
</Link>
</div>
</div>
{isSignedIn ? (
@ -152,9 +152,9 @@ export const CodeMonitoringGettingStarted: React.FunctionComponent<CodeMonitorin
<p className="text-muted">
Have a question or idea about code monitoring? We want to hear your feedback!
</p>
<a href="mailto:feedback@sourcegraph.com" className="link">
<Link to="mailto:feedback@sourcegraph.com" className="link">
Share your thoughts
</a>
</Link>
</div>
</div>
) : (

View File

@ -121,8 +121,8 @@ export const CodeMonitoringPage: React.FunctionComponent<CodeMonitoringPageProps
<div className="nav nav-tabs">
<div className="nav-item">
{/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
<a
href=""
<Link
to=""
onClick={event => {
event.preventDefault()
setCurrentTab('list')
@ -133,12 +133,12 @@ export const CodeMonitoringPage: React.FunctionComponent<CodeMonitoringPageProps
<span className="text-content" data-tab-content="Code monitors">
Code monitors
</span>
</a>
</Link>
</div>
<div className="nav-item">
{/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
<a
href=""
<Link
to=""
onClick={event => {
event.preventDefault()
setCurrentTab('getting-started')
@ -149,7 +149,7 @@ export const CodeMonitoringPage: React.FunctionComponent<CodeMonitoringPageProps
<span className="text-content" data-tab-content="Getting started">
Getting started
</span>
</a>
</Link>
</div>
</div>
</div>

View File

@ -2,7 +2,7 @@ import * as H from 'history'
import React, { useCallback, useEffect, useMemo } from 'react'
import { Observable } from 'rxjs'
import { PageHeader } from '@sourcegraph/wildcard'
import { PageHeader, Link } from '@sourcegraph/wildcard'
import { AuthenticatedUser } from '../../auth'
import { withAuthenticatedUser } from '../../auth/withAuthenticatedUser'
@ -71,13 +71,13 @@ const AuthenticatedCreateCodeMonitorPage: React.FunctionComponent<CreateCodeMoni
description={
<>
Code monitors watch your code for specific triggers and run actions in response.{' '}
<a
href="https://docs.sourcegraph.com/code_monitoring/how-tos/starting_points"
<Link
to="https://docs.sourcegraph.com/code_monitoring/how-tos/starting_points"
target="_blank"
rel="noopener"
>
Learn more
</a>
</Link>
</>
}
/>

View File

@ -6,7 +6,7 @@ import { startWith, catchError, tap } from 'rxjs/operators'
import { asError, isErrorLike } from '@sourcegraph/common'
import { Scalars } from '@sourcegraph/shared/src/graphql-operations'
import { PageHeader, LoadingSpinner, useObservable } from '@sourcegraph/wildcard'
import { PageHeader, Link, LoadingSpinner, useObservable } from '@sourcegraph/wildcard'
import { AuthenticatedUser } from '../../auth'
import { withAuthenticatedUser } from '../../auth/withAuthenticatedUser'
@ -95,9 +95,9 @@ const AuthenticatedManageCodeMonitorPage: React.FunctionComponent<ManageCodeMoni
description={
<>
Code monitors watch your code for specific triggers and run actions in response.{' '}
<a href="https://docs.sourcegraph.com/code_monitoring" target="_blank" rel="noopener">
<Link to="https://docs.sourcegraph.com/code_monitoring" target="_blank" rel="noopener">
Learn more
</a>
</Link>
</>
}
/>

View File

@ -8,7 +8,7 @@ import { mergeMap, startWith, catchError, tap, filter } from 'rxjs/operators'
import { Form } from '@sourcegraph/branded/src/components/Form'
import { Toggle } from '@sourcegraph/branded/src/components/Toggle'
import { asError, isErrorLike } from '@sourcegraph/common'
import { Container, Button, useEventObservable, Alert } from '@sourcegraph/wildcard'
import { Container, Button, useEventObservable, Alert, Link } from '@sourcegraph/wildcard'
import { AuthenticatedUser } from '../../../auth'
import { CodeMonitorFields } from '../../../graphql-operations'
@ -168,13 +168,13 @@ export const CodeMonitorForm: React.FunctionComponent<CodeMonitorFormProps> = ({
<small className="text-muted">
Give it a short, descriptive name to reference events on Sourcegraph and in notifications.
Do not include{' '}
<a
href="https://docs.sourcegraph.com/code_monitoring/explanations/best_practices#do-not-include-confidential-information-in-monitor-names"
<Link
to="https://docs.sourcegraph.com/code_monitoring/explanations/best_practices#do-not-include-confidential-information-in-monitor-names"
target="_blank"
rel="noopener"
>
confidential information
</a>
</Link>
.
</small>
</div>

View File

@ -1,5 +1,7 @@
import React, { useEffect, useState } from 'react'
import { Link } from '@sourcegraph/wildcard'
import { AuthenticatedUser } from '../../../auth'
import { CodeMonitorFields } from '../../../graphql-operations'
import { useExperimentalFeatures } from '../../../stores'
@ -111,9 +113,9 @@ export const FormActionArea: React.FunctionComponent<ActionAreaProps> = ({
<small className="text-muted">
What other actions would you like to take?{' '}
<a href="mailto:feedback@sourcegraph.com" target="_blank" rel="noopener">
<Link to="mailto:feedback@sourcegraph.com" target="_blank" rel="noopener">
Share feedback.
</a>
</Link>
</small>
</>
)

View File

@ -332,9 +332,9 @@ export const FormTriggerArea: React.FunctionComponent<TriggerAreaProps> = ({
<small className="text-muted">
{' '}
What other events would you like to monitor?{' '}
<a href="mailto:feedback@sourcegraph.com" target="_blank" rel="noopener">
<Link to="mailto:feedback@sourcegraph.com" target="_blank" rel="noopener">
Share feedback.
</a>
</Link>
</small>
</>
)

View File

@ -126,6 +126,7 @@ exports[`FormActionArea Error is shown if code monitor has empty description 1`]
>
What other actions would you like to take?
<a
class=""
href="mailto:feedback@sourcegraph.com"
rel="noopener"
target="_blank"

View File

@ -294,6 +294,7 @@ exports[`FormTriggerArea Correct checkboxes shown when query does not fulfill re
>
What other events would you like to monitor?
<a
class=""
href="mailto:feedback@sourcegraph.com"
rel="noopener"
target="_blank"

View File

@ -1,6 +1,6 @@
import React, { useCallback, useState } from 'react'
import { Alert, Button, ProductStatusBadge } from '@sourcegraph/wildcard'
import { Alert, Button, Link, ProductStatusBadge } from '@sourcegraph/wildcard'
import { ActionProps } from '../FormActionArea'
@ -68,9 +68,9 @@ export const SlackWebhookAction: React.FunctionComponent<ActionProps> = ({
>
<Alert variant="info" className="mt-4">
Go to{' '}
<a href="https://api.slack.com/" target="_blank" rel="noopener">
<Link to="https://api.slack.com/" target="_blank" rel="noopener">
Slack
</a>{' '}
</Link>{' '}
to create a webhook URL. If you already have a Slack webhook URL, paste it in the field below.{' '}
Documentation coming soon. {/* TODO: Add link to documentation once #27161 is resolved */}
</Alert>

View File

@ -1,18 +1,20 @@
import MapSearchIcon from 'mdi-react/MapSearchIcon'
import React from 'react'
import { Link } from '@sourcegraph/wildcard'
export const EmptyPoliciesList: React.FunctionComponent = () => (
<p className="text-muted text-center w-100 mb-0 mt-1" data-testid="summary">
<MapSearchIcon className="mb-2" />
<br />
{'No policies have been defined. Enable precise code intelligence by '}
<a
href="https://docs.sourcegraph.com/code_intelligence/how-to/configure_data_retention"
<Link
to="https://docs.sourcegraph.com/code_intelligence/how-to/configure_data_retention"
target="_blank"
rel="noreferrer noopener"
>
configuring data retention policies
</a>
</Link>
.
</p>
)

View File

@ -1,18 +1,20 @@
import MapSearchIcon from 'mdi-react/MapSearchIcon'
import React from 'react'
import { Link } from '@sourcegraph/wildcard'
export const EmptyAutoIndex: React.FunctionComponent = () => (
<p className="text-muted text-center w-100 mb-0 mt-1" data-testid="summary">
<MapSearchIcon className="mb-2" />
<br />
{'No indexes yet. Enable precise code intelligence by '}
<a
href="https://docs.sourcegraph.com/code_intelligence/how-to/index_a_go_repository"
<Link
to="https://docs.sourcegraph.com/code_intelligence/how-to/index_a_go_repository"
target="_blank"
rel="noreferrer noopener"
>
auto-indexing LSIF data
</a>
</Link>
.
</p>
)

View File

@ -1,18 +1,20 @@
import MapSearchIcon from 'mdi-react/MapSearchIcon'
import React from 'react'
import { Link } from '@sourcegraph/wildcard'
export const EmptyUploads: React.FunctionComponent = () => (
<p className="text-muted text-center w-100 mb-0 mt-1">
<MapSearchIcon className="mb-2" />
<br />
No uploads yet. Enable precise code intelligence by{' '}
<a
href="https://docs.sourcegraph.com/code_intelligence/explanations/precise_code_intelligence"
<Link
to="https://docs.sourcegraph.com/code_intelligence/explanations/precise_code_intelligence"
target="_blank"
rel="noreferrer noopener"
>
uploading LSIF data
</a>
</Link>
.
</p>
)

View File

@ -7,7 +7,7 @@ import { ErrorAlert } from '@sourcegraph/branded/src/components/alerts'
import { asError, createAggregateError, isErrorLike } from '@sourcegraph/common'
import { gql } from '@sourcegraph/http-client'
import * as GQL from '@sourcegraph/shared/src/schema'
import { RadioButton, LoadingSpinner, useObservable } from '@sourcegraph/wildcard'
import { RadioButton, LoadingSpinner, useObservable, Link } from '@sourcegraph/wildcard'
import { queryGraphQL } from '../../../backend/graphql'
@ -105,9 +105,9 @@ export const ProductPlanFormControl: React.FunctionComponent<Props> = ({
</div>
))}
</div>
<a href="https://about.sourcegraph.com/pricing" className="small">
<Link to="https://about.sourcegraph.com/pricing" className="small">
Compare plans
</a>
</Link>
</>
)}
</div>

View File

@ -2,6 +2,7 @@ import classNames from 'classnames'
import React from 'react'
import * as GQL from '@sourcegraph/shared/src/schema'
import { Link } from '@sourcegraph/wildcard'
/**
* Displays an inline list of email addresses for an account.
@ -15,7 +16,7 @@ export const AccountEmailAddresses: React.FunctionComponent<{
key={index}
className={classNames('text-nowrap d-inline-block mr-2', !verified && 'text-muted font-italic')}
>
<a href={`mailto:${email}`}>{email}</a> {verified ? '(verified)' : '(unverified)'}
<Link to={`mailto:${email}`}>{email}</Link> {verified ? '(verified)' : '(unverified)'}
</span>
))}
</>

View File

@ -13,7 +13,7 @@ import {
} from '@sourcegraph/web/src/components/FilteredConnection'
import { PageTitle } from '@sourcegraph/web/src/components/PageTitle'
import { Timestamp } from '@sourcegraph/web/src/components/time/Timestamp'
import { Badge, Container, PageHeader } from '@sourcegraph/wildcard'
import { Badge, Container, Link, PageHeader } from '@sourcegraph/wildcard'
import { ExecutorFields } from '../../graphql-operations'
import { eventLogger } from '../../tracking/eventLogger'
@ -80,17 +80,17 @@ export const ExecutorsListPage: FunctionComponent<ExecutorsListPageProps> = ({
<h3>Setting up executors</h3>
<p className="mb-0">
Executors enable{' '}
<a href="https://docs.sourcegraph.com/code_intelligence/explanations/auto_indexing" rel="noopener">
<Link to="https://docs.sourcegraph.com/code_intelligence/explanations/auto_indexing" rel="noopener">
auto-indexing for Code Intelligence
</a>{' '}
</Link>{' '}
and{' '}
<a href="https://docs.sourcegraph.com/batch_changes/explanations/server_side" rel="noopener">
<Link to="https://docs.sourcegraph.com/batch_changes/explanations/server_side" rel="noopener">
server-side Batch Changes
</a>
</Link>
. In order to use those features,{' '}
<a href="https://docs.sourcegraph.com/admin/deploy_executors" rel="noopener">
<Link to="https://docs.sourcegraph.com/admin/deploy_executors" rel="noopener">
set them up
</a>
</Link>
.
</p>
</Container>

View File

@ -16,7 +16,7 @@ import * as GQL from '@sourcegraph/shared/src/schema'
import extensionSchemaJSON from '@sourcegraph/shared/src/schema/extension.schema.json'
import { TelemetryProps } from '@sourcegraph/shared/src/telemetry/telemetryService'
import { ThemeProps } from '@sourcegraph/shared/src/theme'
import { Button, LoadingSpinner, useLocalStorage, useEventObservable } from '@sourcegraph/wildcard'
import { Button, LoadingSpinner, useLocalStorage, useEventObservable, Link } from '@sourcegraph/wildcard'
import { AuthenticatedUser } from '../../../auth'
import { withAuthenticatedUser } from '../../../auth/withAuthenticatedUser'
@ -133,9 +133,9 @@ export const RegistryExtensionNewReleasePage = withAuthenticatedUser<Props>(
<h2>Publish new release</h2>
<p>
Use the{' '}
<a href="https://github.com/sourcegraph/src-cli" target="_blank" rel="noopener noreferrer">
<Link to="https://github.com/sourcegraph/src-cli" target="_blank" rel="noopener noreferrer">
<code>src</code> CLI tool
</a>{' '}
</Link>{' '}
to publish a new release:
</p>
<pre>

View File

@ -14,7 +14,7 @@ import { asError, createAggregateError, ErrorLike, isErrorLike } from '@sourcegr
import { gql } from '@sourcegraph/http-client'
import { Scalars } from '@sourcegraph/shared/src/graphql-operations'
import * as GQL from '@sourcegraph/shared/src/schema'
import { LoadingSpinner, Button } from '@sourcegraph/wildcard'
import { LoadingSpinner, Button, Link } from '@sourcegraph/wildcard'
import { AuthenticatedUser } from '../../../auth'
import { withAuthenticatedUser } from '../../../auth/withAuthenticatedUser'
@ -168,13 +168,13 @@ export const RegistryNewExtensionPage = withAuthenticatedUser(
<PuzzleIcon className="icon-inline" /> New extension
</h2>
<div className="mb-3">
<a target="_blank" rel="noopener" href="https://docs.sourcegraph.com/extensions/authoring">
<Link target="_blank" rel="noopener" to="https://docs.sourcegraph.com/extensions/authoring">
Learn more
</a>{' '}
</Link>{' '}
about authoring Sourcegraph extensions{' '}
<a target="_blank" rel="noopener" href="https://docs.sourcegraph.com/extensions/authoring">
<Link target="_blank" rel="noopener" to="https://docs.sourcegraph.com/extensions/authoring">
<HelpCircleOutline className="icon-inline" />
</a>
</Link>
</div>
<Form onSubmit={this.onSubmit}>
<RegistryPublisherFormGroup

View File

@ -1,6 +1,6 @@
import React, { useState } from 'react'
import { Button, ProductStatusBadge, Popover, PopoverTrigger, PopoverContent } from '@sourcegraph/wildcard'
import { Button, ProductStatusBadge, Popover, PopoverTrigger, PopoverContent, Link } from '@sourcegraph/wildcard'
import { FeedbackPromptContent } from '../../../../nav/Feedback'
@ -11,9 +11,9 @@ export const BetaFeedbackPanel: React.FunctionComponent = () => {
return (
<div className="d-flex align-items-center">
<a href="https://docs.sourcegraph.com/code_insights#code-insights-beta" target="_blank" rel="noopener">
<Link to="https://docs.sourcegraph.com/code_insights#code-insights-beta" target="_blank" rel="noopener">
<ProductStatusBadge status="beta" className="text-uppercase" />
</a>
</Link>
<Popover isOpen={isVisible} onOpenChange={event => setVisibility(event.isOpen)}>
<PopoverTrigger as={Button} variant="link" size="sm">

View File

@ -4,7 +4,7 @@ import PlusIcon from 'mdi-react/PlusIcon'
import React from 'react'
import { ErrorAlert } from '@sourcegraph/branded/src/components/alerts'
import { Button } from '@sourcegraph/wildcard'
import { Button, Link } from '@sourcegraph/wildcard'
import { LoaderButton } from '../../../../../../../../../../components/LoaderButton'
import { FormInput } from '../../../../../../../form/form-input/FormInput'
@ -101,14 +101,14 @@ export const DrillDownFiltersForm: React.FunctionComponent<DrillDownFiltersFormP
{hasAppliedFilters && (
<small className="ml-auto">
<span className="text-muted">Default filters applied</span>{' '}
<a
href="https://docs.sourcegraph.com/code_insights/explanations/code_insights_filters"
<Link
to="https://docs.sourcegraph.com/code_insights/explanations/code_insights_filters"
target="_blank"
rel="noopener"
className="small"
>
Learn more.
</a>
</Link>
</small>
)}
</header>

View File

@ -2,7 +2,7 @@ import React, { useRef } from 'react'
import { useHistory } from 'react-router'
import { useTemporarySetting } from '@sourcegraph/shared/src/settings/temporary/useTemporarySetting'
import { Button, useAutoFocus, Modal } from '@sourcegraph/wildcard'
import { Button, useAutoFocus, Modal, Link } from '@sourcegraph/wildcard'
import styles from './BetaConfirmationModal.module.scss'
import { FourLineChart, LangStatsInsightChart, ThreeLineChart } from './components/MediaCharts'
@ -71,13 +71,13 @@ export const BetaConfirmationModalContent: React.FunctionComponent<BetaConfirmat
<p>
We're still polishing Code Insights and you might find bugs while were in beta. Please{' '}
<a
href="https://docs.sourcegraph.com/code_insights#code-insights-beta"
<Link
to="https://docs.sourcegraph.com/code_insights#code-insights-beta"
target="_blank"
rel="noopener"
>
share any bugs 🐛 or feedback
</a>{' '}
</Link>{' '}
to help us make Code Insights better.
</p>

View File

@ -4,7 +4,7 @@ import { useHistory } from 'react-router-dom'
import { asError } from '@sourcegraph/common'
import { TelemetryProps } from '@sourcegraph/shared/src/telemetry/telemetryService'
import { PageHeader, Container, Button, LoadingSpinner, useObservable } from '@sourcegraph/wildcard'
import { PageHeader, Container, Button, LoadingSpinner, useObservable, Link } from '@sourcegraph/wildcard'
import { LoaderButton } from '../../../../../components/LoaderButton'
import { Page } from '../../../../../components/Page'
@ -59,13 +59,13 @@ export const InsightsDashboardCreationPage: React.FunctionComponent<InsightsDash
<span className="text-muted d-block mt-2">
Dashboards group your insights and let you share them with others.{' '}
<a
href="https://docs.sourcegraph.com/code_insights/explanations/viewing_code_insights"
<Link
to="https://docs.sourcegraph.com/code_insights/explanations/viewing_code_insights"
target="_blank"
rel="noopener"
>
Learn more.
</a>
</Link>
</span>
<Container className="mt-4">

View File

@ -108,13 +108,13 @@ export const EditDashboardPage: React.FunctionComponent<EditDashboardPageProps>
<span className="text-muted d-block mt-2">
Dashboards group your insights and let you share them with others.{' '}
<a
href="https://docs.sourcegraph.com/code_insights/explanations/viewing_code_insights"
<Link
to="https://docs.sourcegraph.com/code_insights/explanations/viewing_code_insights"
target="_blank"
rel="noopener"
>
Learn more.
</a>
</Link>
</span>
<Container className="mt-4">

View File

@ -1,6 +1,7 @@
import React, { useEffect } from 'react'
import { TelemetryProps } from '@sourcegraph/shared/src/telemetry/telemetryService'
import { Link } from '@sourcegraph/wildcard'
import { Page } from '../../../../../../components/Page'
import { PageTitle } from '../../../../../../components/PageTitle'
@ -64,9 +65,9 @@ export const CaptureGroupCreationPage: React.FunctionComponent<CaptureGroupCreat
<p className="text-muted">
Search-based code insights analyze your code based on any search query.{' '}
<a href="https://docs.sourcegraph.com/code_insights" target="_blank" rel="noopener">
<Link to="https://docs.sourcegraph.com/code_insights" target="_blank" rel="noopener">
Learn more.
</a>
</Link>
</p>
</header>

View File

@ -2,7 +2,7 @@ import classNames from 'classnames'
import React from 'react'
import { ErrorAlert } from '@sourcegraph/branded/src/components/alerts'
import { Button, Card } from '@sourcegraph/wildcard'
import { Button, Card, Link } from '@sourcegraph/wildcard'
import { LoaderButton } from '../../../../../../../components/LoaderButton'
import { CodeInsightTimeStepPicker } from '../../../../../components/creation-ui-kit'
@ -91,13 +91,13 @@ export const CaptureGroupCreationForm: React.FunctionComponent<CaptureGroupCreat
<small className="w-100 mt-2 text-muted">
This feature is actively in development. Read about the{' '}
<a
href="https://docs.sourcegraph.com/code_insights/explanations/current_limitations_of_code_insights"
<Link
to="https://docs.sourcegraph.com/code_insights/explanations/current_limitations_of_code_insights"
target="_blank"
rel="noopener noreferrer"
>
beta limitations here.
</a>
</Link>
</small>
</label>
</FormGroup>
@ -110,13 +110,13 @@ export const CaptureGroupCreationForm: React.FunctionComponent<CaptureGroupCreat
subtitle={
<>
Generated dynamically for each unique value from the regular expression capture group.{' '}
<a
href="https://docs.sourcegraph.com/code_insights/explanations/automatically_generated_data_series"
<Link
to="https://docs.sourcegraph.com/code_insights/explanations/automatically_generated_data_series"
target="_blank"
rel="noopener"
>
Learn more.
</a>
</Link>
</>
}
>
@ -143,21 +143,21 @@ export const CaptureGroupCreationForm: React.FunctionComponent<CaptureGroupCreat
<small className="mt-3">
Explore{' '}
<a
href="https://docs.sourcegraph.com/code_insights/references/common_use_cases#automatic-version-and-pattern-tracking"
<Link
to="https://docs.sourcegraph.com/code_insights/references/common_use_cases#automatic-version-and-pattern-tracking"
target="_blank"
rel="noopener noreferrer"
>
example queries
</a>{' '}
</Link>{' '}
and learn more about{' '}
<a
href="https://docs.sourcegraph.com/code_insights/explanations/automatically_generated_data_series"
<Link
to="https://docs.sourcegraph.com/code_insights/explanations/automatically_generated_data_series"
target="_blank"
rel="noopener noreferrer"
>
automatically generated data series
</a>
</Link>
</small>
</Card>
</FormGroup>
@ -224,13 +224,13 @@ export const CaptureGroupCreationForm: React.FunctionComponent<CaptureGroupCreat
const QueryFieldSubtitle: React.FunctionComponent<{ className?: string }> = props => (
<small className={classNames(props.className, 'text-muted', 'd-block', 'font-weight-normal')}>
Search query must contain a properly formatted regular expression with at least one{' '}
<a
href="https://docs.sourcegraph.com/code_insights/explanations/automatically_generated_data_series#regular-expression-capture-group-resources"
<Link
to="https://docs.sourcegraph.com/code_insights/explanations/automatically_generated_data_series#regular-expression-capture-group-resources"
target="_blank"
rel="noopener"
>
capture group.
</a>{' '}
</Link>{' '}
The capture group cannot match file or repository names, it can match only the file contents.
</small>
)

View File

@ -4,7 +4,7 @@ import { useHistory } from 'react-router'
import { useLocation } from 'react-router-dom'
import { TelemetryProps } from '@sourcegraph/shared/src/telemetry/telemetryService'
import { PageHeader } from '@sourcegraph/wildcard'
import { PageHeader, Link } from '@sourcegraph/wildcard'
import { Page } from '../../../../../../components/Page'
import { CodeInsightsIcon } from '../../../../../../insights/Icons'
@ -64,9 +64,9 @@ export const IntroCreationPage: React.FunctionComponent<IntroCreationPageProps>
description={
<>
Insights analyze your code based on any search query.{' '}
<a href="https://docs.sourcegraph.com/code_insights" target="_blank" rel="noopener">
<Link to="https://docs.sourcegraph.com/code_insights" target="_blank" rel="noopener">
Learn more
</a>
</Link>
</>
}
className={styles.header}
@ -89,13 +89,13 @@ export const IntroCreationPage: React.FunctionComponent<IntroCreationPageProps>
<div className={styles.info}>
Not sure which insight type to choose? Learn more about the{' '}
<a
href="https://docs.sourcegraph.com/code_insights/references/common_use_cases"
<Link
to="https://docs.sourcegraph.com/code_insights/references/common_use_cases"
target="_blank"
rel="noopener"
>
use cases.
</a>
</Link>
</div>
<ExtensionInsightsCard data-testid="explore-extensions" onClick={handleExploreExtensionsClick} />

View File

@ -3,7 +3,7 @@ import React, { useCallback, useEffect } from 'react'
import { asError } from '@sourcegraph/common'
import { TelemetryProps } from '@sourcegraph/shared/src/telemetry/telemetryService'
import { useLocalStorage } from '@sourcegraph/wildcard'
import { useLocalStorage, Link } from '@sourcegraph/wildcard'
import { Page } from '../../../../../../components/Page'
import { PageTitle } from '../../../../../../components/PageTitle'
@ -116,9 +116,9 @@ export const LangStatsInsightCreationPage: React.FunctionComponent<LangStatsInsi
<p className="text-muted">
Shows language usage in your repository based on number of lines of code.{' '}
<a href="https://docs.sourcegraph.com/code_insights" target="_blank" rel="noopener">
<Link to="https://docs.sourcegraph.com/code_insights" target="_blank" rel="noopener">
Learn more.
</a>
</Link>
</p>
</div>

View File

@ -3,7 +3,7 @@ import React, { useCallback, useEffect } from 'react'
import { asError } from '@sourcegraph/common'
import { TelemetryProps } from '@sourcegraph/shared/src/telemetry/telemetryService'
import { LoadingSpinner } from '@sourcegraph/wildcard'
import { LoadingSpinner, Link } from '@sourcegraph/wildcard'
import { Page } from '../../../../../../components/Page'
import { PageTitle } from '../../../../../../components/PageTitle'
@ -126,9 +126,9 @@ export const SearchInsightCreationPage: React.FunctionComponent<SearchInsightCre
<p className="text-muted">
Search-based code insights analyze your code based on any search query.{' '}
<a href="https://docs.sourcegraph.com/code_insights" target="_blank" rel="noopener">
<Link to="https://docs.sourcegraph.com/code_insights" target="_blank" rel="noopener">
Learn more.
</a>
</Link>
</p>
</header>

View File

@ -2,7 +2,7 @@ import classNames from 'classnames'
import React from 'react'
import { noop } from 'rxjs'
import { Button, Card } from '@sourcegraph/wildcard'
import { Button, Card, Link } from '@sourcegraph/wildcard'
import { FormInput } from '../../../../../../components/form/form-input/FormInput'
import { useField } from '../../../../../../components/form/hooks/useField'
@ -189,13 +189,13 @@ const QueryFieldDescription: React.FunctionComponent<{ isSearchQueryDisabled: bo
<>
We don't yet allow editing queries for insights over all repos. To change the query, make a new insight.
This is a known{' '}
<a
href="https://docs.sourcegraph.com/code_insights/explanations/current_limitations_of_code_insights"
<Link
to="https://docs.sourcegraph.com/code_insights/explanations/current_limitations_of_code_insights"
target="_blank"
rel="noopener noreferrer"
>
beta limitation
</a>
</Link>
</>
)}
</span>

View File

@ -1,7 +1,7 @@
import React, { FormEventHandler, RefObject, useContext } from 'react'
import { ErrorAlert } from '@sourcegraph/branded/src/components/alerts'
import { Button } from '@sourcegraph/wildcard'
import { Button, Link } from '@sourcegraph/wildcard'
import { LoaderButton } from '../../../../../../../../components/LoaderButton'
import { CodeInsightTimeStepPicker, VisibilityPicker } from '../../../../../../components/creation-ui-kit'
@ -135,13 +135,13 @@ export const SearchInsightCreationForm: React.FunctionComponent<CreationSearchIn
<small className="w-100 mt-2 text-muted">
This feature is actively in development. Read about the{' '}
<a
href="https://docs.sourcegraph.com/code_insights/explanations/current_limitations_of_code_insights"
<Link
to="https://docs.sourcegraph.com/code_insights/explanations/current_limitations_of_code_insights"
target="_blank"
rel="noopener noreferrer"
>
beta limitations here.
</a>
</Link>
</small>
</label>

View File

@ -67,9 +67,9 @@ export const EditInsightPage: React.FunctionComponent<EditInsightPageProps> = pr
<p className="text-muted">
Insights analyze your code based on any search query.{' '}
<a href="https://docs.sourcegraph.com/code_insights" target="_blank" rel="noopener">
<Link to="https://docs.sourcegraph.com/code_insights" target="_blank" rel="noopener">
Learn more.
</a>
</Link>
</p>
</div>

View File

@ -1,6 +1,6 @@
import React from 'react'
import { Alert } from '@sourcegraph/wildcard'
import { Alert, Link } from '@sourcegraph/wildcard'
/**
* Displays a warning in debug mode (which is on for local dev) that generated license keys aren't
@ -15,8 +15,8 @@ export const LicenseGenerationKeyWarning: React.FunctionComponent<{ className?:
window.context?.debug ? (
<Alert className={className} variant="warning">
License keys generated in dev mode are <strong>NOT VALID</strong>.{' '}
<a href="https://sourcegraph.com/site-admin/dotcom/product/subscriptions">
<Link to="https://sourcegraph.com/site-admin/dotcom/product/subscriptions">
Use Sourcegraph.com to generate valid license keys.
</a>
</Link>
</Alert>
) : null

View File

@ -2,6 +2,7 @@ import * as React from 'react'
import * as GQL from '@sourcegraph/shared/src/schema'
import { numberWithCommas } from '@sourcegraph/shared/src/util/strings'
import { Link } from '@sourcegraph/wildcard'
import { SingleValueCard } from '../../components/SingleValueCard'
import { formatUserCount } from '../../productSubscription/helpers'
@ -62,9 +63,9 @@ export const TrueUpStatusSummary: React.FunctionComponent<Props> = ({
</div>
<small>
Learn more about{' '}
<a href="https://about.sourcegraph.com/pricing" target="_blank" rel="noopener noreferrer">
<Link to="https://about.sourcegraph.com/pricing" target="_blank" rel="noopener noreferrer">
Sourcegraph's true-up pricing model
</a>
</Link>
.
</small>
</div>

View File

@ -1,7 +1,7 @@
import * as H from 'history'
import React, { useEffect, useMemo } from 'react'
import { Container, PageHeader, LoadingSpinner, useObservable, Alert } from '@sourcegraph/wildcard'
import { Container, PageHeader, LoadingSpinner, useObservable, Alert, Link } from '@sourcegraph/wildcard'
import { PageTitle } from '../../../components/PageTitle'
import { Timestamp } from '../../../components/time/Timestamp'
@ -41,9 +41,9 @@ export const RepoSettingsPermissionsPage: React.FunctionComponent<RepoSettingsPe
description={
<>
Learn more about{' '}
<a href="/help/admin/repo/permissions#background-permissions-syncing">
<Link to="/help/admin/repo/permissions#background-permissions-syncing">
background permissions syncing
</a>
</Link>
.
</>
}

View File

@ -15,7 +15,7 @@ import { TelemetryProps } from '@sourcegraph/shared/src/telemetry/telemetryServi
import { ThemeProps } from '@sourcegraph/shared/src/theme'
import { Page } from '@sourcegraph/web/src/components/Page'
import { PageTitle } from '@sourcegraph/web/src/components/PageTitle'
import { PageHeader } from '@sourcegraph/wildcard'
import { PageHeader, Link } from '@sourcegraph/wildcard'
import { AuthenticatedUser } from '../../auth'
import { withAuthenticatedUser } from '../../auth/withAuthenticatedUser'
@ -72,13 +72,13 @@ export const AuthenticatedCreateSearchContextPage: React.FunctionComponent<Creat
<span className="text-muted">
A search context represents a group of repositories at specified branches or revisions
that will be targeted by search queries.{' '}
<a
href="https://docs.sourcegraph.com/code_search/explanations/features#search-contexts"
<Link
to="https://docs.sourcegraph.com/code_search/explanations/features#search-contexts"
target="_blank"
rel="noopener noreferrer"
>
Learn more
</a>
</Link>
</span>
}
className="mb-3"

View File

@ -85,13 +85,13 @@ export const SearchContextsListPage: React.FunctionComponent<SearchContextsListP
description={
<span className="text-muted">
Search code you care about with search contexts.{' '}
<a
href="https://docs.sourcegraph.com/code_search/explanations/features#search-contexts"
<Link
to="https://docs.sourcegraph.com/code_search/explanations/features#search-contexts"
target="_blank"
rel="noopener noreferrer"
>
Learn more
</a>
</Link>
</span>
}
className="mb-3"
@ -100,8 +100,8 @@ export const SearchContextsListPage: React.FunctionComponent<SearchContextsListP
<div className="nav nav-tabs">
<div className="nav-item">
{/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
<a
href=""
<Link
to=""
role="button"
onClick={onSelectSearchContextsList}
className={classNames('nav-link', selectedTab === 'list' && 'active')}
@ -109,7 +109,7 @@ export const SearchContextsListPage: React.FunctionComponent<SearchContextsListP
<span className="text-content" data-tab-content="Your search contexts">
Your search contexts
</span>
</a>
</Link>
</div>
</div>
</div>

View File

@ -6,7 +6,7 @@ import { map } from 'rxjs/operators'
import { createAggregateError } from '@sourcegraph/common'
import { gql } from '@sourcegraph/http-client'
import * as GQL from '@sourcegraph/shared/src/schema'
import { Button, Badge } from '@sourcegraph/wildcard'
import { Button, Badge, Link } from '@sourcegraph/wildcard'
import { queryGraphQL } from '../../backend/graphql'
import { FilteredConnection } from '../../components/FilteredConnection'
@ -82,9 +82,9 @@ export class SiteAdminAuthenticationProvidersPage extends React.Component<Props>
<h2>Authentication providers</h2>
<p>
Authentication providers allow users to sign into Sourcegraph. See{' '}
<a href="https://docs.sourcegraph.com/admin/auth">authentication documentation</a> about configuring
single-sign-on (SSO) via SAML and OpenID Connect. Configure authentication providers in the{' '}
<a href="https://docs.sourcegraph.com/admin/config/site_config">site configuration</a>.
<Link to="https://docs.sourcegraph.com/admin/auth">authentication documentation</Link> about
configuring single-sign-on (SSO) via SAML and OpenID Connect. Configure authentication providers in
the <Link to="https://docs.sourcegraph.com/admin/config/site_config">site configuration</Link>.
</p>
<FilteredAuthProviderConnection
className="list-group list-group-flush mt-3"

View File

@ -7,7 +7,7 @@ import { catchError, map, mapTo, startWith, switchMap, tap } from 'rxjs/operator
import { asError, createAggregateError, isErrorLike } from '@sourcegraph/common'
import { gql } from '@sourcegraph/http-client'
import * as GQL from '@sourcegraph/shared/src/schema'
import { Button, useEventObservable } from '@sourcegraph/wildcard'
import { Button, useEventObservable, Link } from '@sourcegraph/wildcard'
import { requestGraphQL } from '../../../../backend/graphql'
import { Scalars, SetCustomerBillingResult, SetCustomerBillingVariables } from '../../../../graphql-operations'
@ -64,9 +64,9 @@ export const SiteAdminCustomerBillingLink: React.FunctionComponent<Props> = ({ c
<div className="site-admin-customer-billing-link">
<div className="d-flex align-items-center">
{customer.urlForSiteAdminBilling && (
<a href={customer.urlForSiteAdminBilling} className="mr-2 d-flex align-items-center">
<Link to={customer.urlForSiteAdminBilling} className="mr-2 d-flex align-items-center">
View customer account <ExternalLinkIcon className="icon-inline ml-1" />
</a>
</Link>
)}
{isErrorLike(update) && (
<AlertCircleIcon className="icon-inline text-danger mr-2" data-tooltip={update.message} />

View File

@ -10,7 +10,7 @@ import { asError, createAggregateError, isErrorLike } from '@sourcegraph/common'
import { gql } from '@sourcegraph/http-client'
import { Scalars } from '@sourcegraph/shared/src/graphql-operations'
import * as GQL from '@sourcegraph/shared/src/schema'
import { Alert, Button, useEventObservable } from '@sourcegraph/wildcard'
import { Alert, Button, useEventObservable, Link } from '@sourcegraph/wildcard'
import { mutateGraphQL } from '../../../../backend/graphql'
import { ExpirationDate } from '../../../productSubscription/ExpirationDate'
@ -157,9 +157,9 @@ export const SiteAdminGenerateProductLicenseForSubscriptionForm: React.FunctionC
</datalist>
<small className="form-text text-muted">
Tags restrict a license. Please refer to{' '}
<a href="https://handbook.sourcegraph.com/ce/license_keys#how-to-create-a-license-key-for-a-new-prospect-or-new-customer">
<Link to="https://handbook.sourcegraph.com/ce/license_keys#how-to-create-a-license-key-for-a-new-prospect-or-new-customer">
How to create a license key for a new prospect or new customer
</a>{' '}
</Link>{' '}
for a complete guide.
</small>
<small className="form-text text-muted mt-2">

View File

@ -7,7 +7,7 @@ import { catchError, map, mapTo, startWith, switchMap, tap } from 'rxjs/operator
import { asError, createAggregateError, isErrorLike } from '@sourcegraph/common'
import { gql } from '@sourcegraph/http-client'
import * as GQL from '@sourcegraph/shared/src/schema'
import { Button, useEventObservable } from '@sourcegraph/wildcard'
import { Button, useEventObservable, Link } from '@sourcegraph/wildcard'
import { requestGraphQL } from '../../../../backend/graphql'
import {
@ -71,9 +71,9 @@ export const SiteAdminProductSubscriptionBillingLink: React.FunctionComponent<Pr
<div className="site-admin-product-subscription-billing-link">
<div className="d-flex align-items-center">
{productSubscription.urlForSiteAdminBilling && (
<a href={productSubscription.urlForSiteAdminBilling} className="mr-2 d-flex align-items-center">
<Link to={productSubscription.urlForSiteAdminBilling} className="mr-2 d-flex align-items-center">
View billing subscription <ExternalLinkIcon className="icon-inline ml-1" />
</a>
</Link>
)}
{isErrorLike(update) && (
<AlertCircleIcon className="icon-inline text-danger mr-2" data-tooltip={update.message} />

View File

@ -47,6 +47,7 @@ exports[`SiteAdminGenerateProductLicenseForSubscriptionForm renders 1`] = `
>
Tags restrict a license. Please refer to
<a
class=""
href="https://handbook.sourcegraph.com/ce/license_keys#how-to-create-a-license-key-for-a-new-prospect-or-new-customer"
>
How to create a license key for a new prospect or new customer

View File

@ -168,10 +168,9 @@ export const ProductSubscriptionStatus: React.FunctionComponent<Props> = ({ clas
<Alert variant="warning">
You have exceeded your licensed users.{' '}
<Link to="/site-admin/license">View your license details</Link> or{' '}
{/* eslint-disable-next-line react/jsx-no-target-blank */}
<a href="https://about.sourcegraph.com/pricing" target="_blank" rel="noopener">
<Link to="https://about.sourcegraph.com/pricing" target="_blank" rel="noopener">
upgrade your license
</a>{' '}
</Link>{' '}
to true up and prevent a retroactive charge.
</Alert>
)

View File

@ -11,7 +11,7 @@ import { gql } from '@sourcegraph/http-client'
import { Scalars } from '@sourcegraph/shared/src/graphql-operations'
import * as GQL from '@sourcegraph/shared/src/schema'
import { numberWithCommas } from '@sourcegraph/shared/src/util/strings'
import { LoadingSpinner, useObservable, Alert } from '@sourcegraph/wildcard'
import { LoadingSpinner, useObservable, Alert, Link } from '@sourcegraph/wildcard'
import { queryGraphQL } from '../../../backend/graphql'
import { formatUserCount, mailtoSales } from '../../../productSubscription/helpers'
@ -119,13 +119,13 @@ export const NewProductSubscriptionPaymentSection: React.FunctionComponent<Props
{previewInvoice.isDowngradeRequiringManualIntervention ? (
<Alert className="mb-2" variant="danger">
Self-service downgrades are not yet supported.{' '}
<a
href={mailtoSales({
<Link
to={mailtoSales({
subject: `Downgrade subscription ${subscriptionID!}`,
})}
>
Contact sales
</a>{' '}
</Link>{' '}
for help.
</Alert>
) : (

View File

@ -2,7 +2,7 @@ import InformationIcon from 'mdi-react/InformationIcon'
import KeyIcon from 'mdi-react/KeyIcon'
import React, { useState, useCallback } from 'react'
import { Button, CardFooter } from '@sourcegraph/wildcard'
import { Button, CardFooter, Link } from '@sourcegraph/wildcard'
import { CopyableText } from '../../../components/CopyableText'
import { formatUserCount, mailtoSales } from '../../../productSubscription/helpers'
@ -72,13 +72,13 @@ export const UserProductSubscriptionStatus: React.FunctionComponent<Props> = ({
) : (
<div className="text-muted">
No license key found.{' '}
<a
href={mailtoSales({
<Link
to={mailtoSales({
subject: `No license key for subscription ${subscriptionName}`,
})}
>
Contact sales
</a>{' '}
</Link>{' '}
for help.
</div>
)}

View File

@ -108,13 +108,13 @@ export const UserSubscriptionsProductSubscriptionPage: React.FunctionComponent<P
<>
<ProductSubscriptionBilling productSubscription={productSubscription} />
<CardFooter>
<a
href={mailtoSales({
<Link
to={mailtoSales({
subject: `Change payment method for subscription ${productSubscription.name}`,
})}
>
Contact sales
</a>{' '}
</Link>{' '}
to change your payment method.
</CardFooter>
</>
@ -122,13 +122,13 @@ export const UserSubscriptionsProductSubscriptionPage: React.FunctionComponent<P
<CardBody>
<span className="text-muted ">
No billing information is associated with this subscription.{' '}
<a
href={mailtoSales({
<Link
to={mailtoSales({
subject: `Billing for subscription ${productSubscription.name}`,
})}
>
Contact sales
</a>{' '}
</Link>{' '}
for help.
</span>
</CardBody>

View File

@ -87,7 +87,7 @@ export const UserSubscriptionsProductSubscriptionsPage: React.FunctionComponent<
description={
<>
Purchase a subscription for a self-hosted Sourcegraph instance. See{' '}
<a href="https://about.sourcegraph.com/pricing">pricing</a> for more information.
<Link to="https://about.sourcegraph.com/pricing">pricing</Link> for more information.
</>
}
className="mb-3"

View File

@ -31,6 +31,7 @@ exports[`NewProductSubscriptionPaymentSection downgrade to existing subscription
>
Self-service downgrades are not yet supported.
<a
class=""
href="mailto:sales@sourcegraph.com?subject=Downgrade%20subscription%20s"
>
Contact sales

View File

@ -45,6 +45,7 @@ exports[`UserSubscriptionsProductSubscriptionPage renders 1`] = `
>
No billing information is associated with this subscription.
<a
class=""
href="mailto:sales@sourcegraph.com?subject=Billing%20for%20subscription%20undefined"
>
Contact sales

View File

@ -1,7 +1,7 @@
import * as H from 'history'
import React, { useEffect, useMemo } from 'react'
import { Container, PageHeader, LoadingSpinner, useObservable, Alert } from '@sourcegraph/wildcard'
import { Container, PageHeader, LoadingSpinner, useObservable, Alert, Link } from '@sourcegraph/wildcard'
import { PageTitle } from '../../../../components/PageTitle'
import { Timestamp } from '../../../../components/time/Timestamp'
@ -35,9 +35,9 @@ export const UserSettingsPermissionsPage: React.FunctionComponent<{
description={
<>
Learn more about{' '}
<a href="/help/admin/repo/permissions#background-permissions-syncing">
<Link to="/help/admin/repo/permissions#background-permissions-syncing">
background permissions syncing
</a>
</Link>
.
</>
}

View File

@ -12,7 +12,7 @@ import { ExtensionCategory, EXTENSION_CATEGORIES } from '@sourcegraph/shared/src
import { Settings, SettingsCascadeProps, SettingsCascadeOrError } from '@sourcegraph/shared/src/settings/settings'
import { ThemeProps } from '@sourcegraph/shared/src/theme'
import { buildGetStartedURL } from '@sourcegraph/shared/src/util/url'
import { AlertLink, useLocalStorage, useEventObservable, Alert } from '@sourcegraph/wildcard'
import { AlertLink, useLocalStorage, useEventObservable, Alert, Link } from '@sourcegraph/wildcard'
import { PageTitle } from '../components/PageTitle'
import {
@ -388,18 +388,22 @@ export const ExtensionRegistry: React.FunctionComponent<Props> = props => {
<hr className="mt-5" />
<div className="my-4 justify-content-center">
You may use the Sourcegraph.com extension registry only with Sourcegraph{' '}
<a href="https://about.sourcegraph.com/pricing/">
<Link to="https://about.sourcegraph.com/pricing/">
self-hosted or managed instances
</a>
, <a href="http://sourcegraph.com/">Sourcegraph.com</a>, and Sourcegraph's{' '}
<a href="https://docs.sourcegraph.com/integration/browser_extension">
</Link>
, <Link to="http://sourcegraph.com/">Sourcegraph.com</Link>, and Sourcegraph's{' '}
<Link to="https://docs.sourcegraph.com/integration/browser_extension">
browser extensions
</a>{' '}
</Link>{' '}
and{' '}
<a href="https://docs.sourcegraph.com/integration/editor">editor integrations</a>.
You may not use the Sourcegraph.com extension registry with Sourcegraph OSS. Learn
<Link to="https://docs.sourcegraph.com/integration/editor">
editor integrations
</Link>
. You may not use the Sourcegraph.com extension registry with Sourcegraph OSS. Learn
more about the Sourcegraph.com extension registry and administration options in our{' '}
<a href="https://docs.sourcegraph.com/admin/extensions">extensions documentation</a>
<Link to="https://docs.sourcegraph.com/admin/extensions">
extensions documentation
</Link>
.
</div>
</>

View File

@ -3,7 +3,7 @@ import React, { useState } from 'react'
import { ButtonDropdown, DropdownItem, DropdownMenu, DropdownToggle } from 'reactstrap'
import { EXTENSION_CATEGORIES } from '@sourcegraph/shared/src/schema/extensionSchema'
import { Button } from '@sourcegraph/wildcard'
import { Button, Link } from '@sourcegraph/wildcard'
import { SidebarGroup, SidebarGroupHeader } from '../components/Sidebar'
@ -119,14 +119,14 @@ const ExtensionSidenavBanner: React.FunctionComponent = () => (
<h4 className="mt-2 font-weight-bold">Create custom extensions!</h4>
<small>
You can improve your workflow by creating custom extensions. See{' '}
<a
href="https://docs.sourcegraph.com/extensions/authoring"
<Link
to="https://docs.sourcegraph.com/extensions/authoring"
// eslint-disable-next-line react/jsx-no-target-blank
target="_blank"
rel="noreferrer"
>
Sourcegraph Docs
</a>{' '}
</Link>{' '}
for details about writing and publishing.
</small>
</div>

View File

@ -156,6 +156,7 @@ exports[`ExtensionsQueryInputToolbar renders 1`] = `
<small>
You can improve your workflow by creating custom extensions. See
<a
class=""
href="https://docs.sourcegraph.com/extensions/authoring"
rel="noreferrer"
target="_blank"

Some files were not shown because too many files have changed in this diff Show More