)}
diff --git a/client/app/components/BeaconConsent.jsx b/client/app/components/BeaconConsent.jsx
index 4db162f32..3ee9b2475 100644
--- a/client/app/components/BeaconConsent.jsx
+++ b/client/app/components/BeaconConsent.jsx
@@ -3,6 +3,7 @@ import Card from "antd/lib/card";
import Button from "antd/lib/button";
import Typography from "antd/lib/typography";
import { clientConfig } from "@/services/auth";
+import Link from "@/components/Link";
import HelpTrigger from "@/components/HelpTrigger";
import DynamicComponent from "@/components/DynamicComponent";
import OrgSettings from "@/services/organizationSettings";
@@ -65,8 +66,8 @@ function BeaconConsent() {
- You can change this setting anytime from the Organization Settings{" "}
- page.
+ You can change this setting anytime from the{" "}
+ Organization Settings page.
diff --git a/client/app/components/CreateSourceDialog.jsx b/client/app/components/CreateSourceDialog.jsx
index e58f90d0e..2d5ba0646 100644
--- a/client/app/components/CreateSourceDialog.jsx
+++ b/client/app/components/CreateSourceDialog.jsx
@@ -7,6 +7,7 @@ import Modal from "antd/lib/modal";
import Input from "antd/lib/input";
import Steps from "antd/lib/steps";
import { wrap as wrapDialog, DialogPropType } from "@/components/DialogWrapper";
+import Link from "@/components/Link";
import { PreviewCard } from "@/components/PreviewCard";
import EmptyState from "@/components/items-list/components/EmptyState";
import DynamicForm from "@/components/dynamic-form/DynamicForm";
@@ -118,9 +119,9 @@ class CreateSourceDialog extends React.Component {
{selectedType.type === "databricks" && (
By using the Databricks Data Source you agree to the Databricks JDBC/ODBC{" "}
-
+
Driver Download Terms and Conditions
-
+
.
)}
diff --git a/client/app/components/EditVisualizationButton/QueryResultsLink.jsx b/client/app/components/EditVisualizationButton/QueryResultsLink.jsx
index f3ac4bffe..74b6e09a7 100644
--- a/client/app/components/EditVisualizationButton/QueryResultsLink.jsx
+++ b/client/app/components/EditVisualizationButton/QueryResultsLink.jsx
@@ -1,5 +1,6 @@
import React from "react";
import PropTypes from "prop-types";
+import Link from "@/components/Link";
export default function QueryResultsLink(props) {
let href = "";
@@ -17,9 +18,9 @@ export default function QueryResultsLink(props) {
}
return (
-
+
{props.children}
-
+
);
}
diff --git a/client/app/components/HelpTrigger.jsx b/client/app/components/HelpTrigger.jsx
index 64fe747b6..e9528e3d8 100644
--- a/client/app/components/HelpTrigger.jsx
+++ b/client/app/components/HelpTrigger.jsx
@@ -4,6 +4,7 @@ import PropTypes from "prop-types";
import cx from "classnames";
import Tooltip from "antd/lib/tooltip";
import Drawer from "antd/lib/drawer";
+import Link from "@/components/Link";
import CloseOutlinedIcon from "@ant-design/icons/CloseOutlined";
import BigMessage from "@/components/BigMessage";
import DynamicComponent from "@/components/DynamicComponent";
@@ -149,9 +150,9 @@ export default class HelpTrigger extends React.Component {
{this.props.children}
) : (
-
+
{this.props.children}
-
+
)}
{/* eslint-disable-next-line react/jsx-no-target-blank */}
-
+
-
+
)}
@@ -201,9 +202,9 @@ export default class HelpTrigger extends React.Component {
Something went wrong.
{/* eslint-disable-next-line react/jsx-no-target-blank */}
-
+
Click here
- {" "}
+ {" "}
to open the page in a new window.
)}
diff --git a/client/app/components/Link.jsx b/client/app/components/Link.jsx
new file mode 100644
index 000000000..2cd700976
--- /dev/null
+++ b/client/app/components/Link.jsx
@@ -0,0 +1,26 @@
+import React from "react";
+import Button from "antd/lib/button";
+
+function DefaultLinkComponent(props) {
+ return ; // eslint-disable-line jsx-a11y/anchor-has-content
+}
+
+function Link(props) {
+ return ;
+}
+
+Link.Component = DefaultLinkComponent;
+
+function DefaultButtonLinkComponent(props) {
+ return ;
+}
+
+function ButtonLink(props) {
+ return ;
+}
+
+ButtonLink.Component = DefaultButtonLinkComponent;
+
+Link.Button = ButtonLink;
+
+export default Link;
diff --git a/client/app/components/PreviewCard.jsx b/client/app/components/PreviewCard.jsx
index 87b647310..ea652e96d 100644
--- a/client/app/components/PreviewCard.jsx
+++ b/client/app/components/PreviewCard.jsx
@@ -1,6 +1,7 @@
import React from "react";
import PropTypes from "prop-types";
import classNames from "classnames";
+import Link from "@/components/Link";
// PreviewCard
@@ -42,7 +43,7 @@ PreviewCard.defaultProps = {
// UserPreviewCard
export function UserPreviewCard({ user, withLink, children, ...props }) {
- const title = withLink ? {user.name} : user.name;
+ const title = withLink ? {user.name} : user.name;
return (
{children}
@@ -69,7 +70,7 @@ UserPreviewCard.defaultProps = {
export function DataSourcePreviewCard({ dataSource, withLink, children, ...props }) {
const imageUrl = `static/images/db-logos/${dataSource.type}.png`;
- const title = withLink ? {dataSource.name} : dataSource.name;
+ const title = withLink ? {dataSource.name} : dataSource.name;
return (
{children}
diff --git a/client/app/components/QueryLink.jsx b/client/app/components/QueryLink.jsx
index 1a5a934ca..28ec478de 100644
--- a/client/app/components/QueryLink.jsx
+++ b/client/app/components/QueryLink.jsx
@@ -1,6 +1,7 @@
import React from "react";
import PropTypes from "prop-types";
import { VisualizationType } from "@redash/viz/lib";
+import Link from "@/components/Link";
import VisualizationName from "@/components/visualizations/VisualizationName";
import "./QueryLink.less";
@@ -21,9 +22,9 @@ function QueryLink({ query, visualization, readOnly }) {
};
return (
-
+
{query.name}
-
+
);
}
diff --git a/client/app/components/SettingsWrapper.jsx b/client/app/components/SettingsWrapper.jsx
index 1ad78cc40..f62142408 100644
--- a/client/app/components/SettingsWrapper.jsx
+++ b/client/app/components/SettingsWrapper.jsx
@@ -1,6 +1,7 @@
import React from "react";
import Menu from "antd/lib/menu";
import PageHeader from "@/components/PageHeader";
+import Link from "@/components/Link";
import location from "@/services/location";
import settingsMenu from "@/services/settingsMenu";
@@ -17,9 +18,9 @@ function wrapSettingsTab(id, options, WrappedComponent) {
diff --git a/client/app/components/admin/Layout.jsx b/client/app/components/admin/Layout.jsx
index faa675ccd..854bdd2f7 100644
--- a/client/app/components/admin/Layout.jsx
+++ b/client/app/components/admin/Layout.jsx
@@ -2,6 +2,7 @@ import React from "react";
import PropTypes from "prop-types";
import Menu from "antd/lib/menu";
import PageHeader from "@/components/PageHeader";
+import Link from "@/components/Link";
import "./layout.less";
@@ -13,13 +14,13 @@ export default function Layout({ activeTab, children }) {
{children}
diff --git a/client/app/components/cards-list/CardsList.jsx b/client/app/components/cards-list/CardsList.jsx
index a59c3890e..39a9747fa 100644
--- a/client/app/components/cards-list/CardsList.jsx
+++ b/client/app/components/cards-list/CardsList.jsx
@@ -2,6 +2,7 @@ import Input from "antd/lib/input";
import { includes, isEmpty } from "lodash";
import PropTypes from "prop-types";
import React from "react";
+import Link from "@/components/Link";
import EmptyState from "@/components/items-list/components/EmptyState";
import "./CardsList.less";
@@ -44,10 +45,10 @@ export default class CardsList extends React.Component {
// eslint-disable-next-line class-methods-use-this
renderListItem(item) {
return (
-
+
),
@@ -42,8 +43,8 @@ class GroupsList extends React.Component {
Columns.custom(
(text, group) => (
-
- {currentUser.isAdmin && }
+ Members
+ {currentUser.isAdmin && Data Sources}
),
{
diff --git a/client/app/pages/home/Home.jsx b/client/app/pages/home/Home.jsx
index d0a8f700e..8bba0dcb8 100644
--- a/client/app/pages/home/Home.jsx
+++ b/client/app/pages/home/Home.jsx
@@ -3,6 +3,7 @@ import React, { useEffect, useState } from "react";
import PropTypes from "prop-types";
import Alert from "antd/lib/alert";
+import Link from "@/components/Link";
import LoadingOutlinedIcon from "@ant-design/icons/LoadingOutlined";
import routeWithUserSession from "@/components/ApplicationArea/routeWithUserSession";
import EmptyState from "@/components/empty-state/EmptyState";
@@ -28,12 +29,12 @@ function DeprecatedEmbedFeatureAlert() {
<>
You have enabled ALLOW_PARAMETERS_IN_EMBEDS. This setting is now deprecated and should be turned
off. Parameters in embeds are supported by default.{" "}
-
Read more
-
+
.
>
}
@@ -87,13 +88,13 @@ function FavoriteList({ title, resource, itemUrl, emptyState }) {
{!isEmpty(items) && (
);
default:
diff --git a/client/app/pages/queries/VisualizationEmbed.jsx b/client/app/pages/queries/VisualizationEmbed.jsx
index 05cb2b576..f054538a2 100644
--- a/client/app/pages/queries/VisualizationEmbed.jsx
+++ b/client/app/pages/queries/VisualizationEmbed.jsx
@@ -8,6 +8,7 @@ import Button from "antd/lib/button";
import Dropdown from "antd/lib/dropdown";
import Menu from "antd/lib/menu";
import Tooltip from "antd/lib/tooltip";
+import Link from "@/components/Link";
import routeWithApiKeySession from "@/components/ApplicationArea/routeWithApiKeySession";
import Parameters from "@/components/Parameters";
import { Moment } from "@/components/proptypes";
@@ -118,9 +119,9 @@ function VisualizationEmbedFooter({
{queryUrl && (
-
+
{!query.hasParameters() && (
diff --git a/client/app/pages/queries/components/QueryPageHeader.jsx b/client/app/pages/queries/components/QueryPageHeader.jsx
index ceec749f0..b925e94e1 100644
--- a/client/app/pages/queries/components/QueryPageHeader.jsx
+++ b/client/app/pages/queries/components/QueryPageHeader.jsx
@@ -6,6 +6,7 @@ import Dropdown from "antd/lib/dropdown";
import Menu from "antd/lib/menu";
import EllipsisOutlinedIcon from "@ant-design/icons/EllipsisOutlined";
import useMedia from "use-media";
+import Link from "@/components/Link";
import EditInPlace from "@/components/EditInPlace";
import FavoritesControl from "@/components/FavoritesControl";
import { QueryTagsControl } from "@/components/tags-control/TagsControl";
@@ -179,19 +180,19 @@ export default function QueryPageHeader({
{!queryFlags.isNew && queryFlags.canViewSource && (
{!sourceMode && (
-
+
)}
{sourceMode && (
-
+
)}
)}
diff --git a/client/app/pages/queries/components/QuerySourceAlerts.jsx b/client/app/pages/queries/components/QuerySourceAlerts.jsx
index 75b472972..f4128a8c3 100644
--- a/client/app/pages/queries/components/QuerySourceAlerts.jsx
+++ b/client/app/pages/queries/components/QuerySourceAlerts.jsx
@@ -2,8 +2,8 @@ import React from "react";
import PropTypes from "prop-types";
import Card from "antd/lib/card";
import WarningFilledIcon from "@ant-design/icons/WarningFilled";
-import Button from "antd/lib/button";
import Typography from "antd/lib/typography";
+import Link from "@/components/Link";
import { currentUser } from "@/services/auth";
import useQueryFlags from "../hooks/useQueryFlags";
@@ -21,8 +21,8 @@ export default function QuerySourceAlerts({ query, dataSourcesAvailable }) {
- You can either browse existing queries, or ask for additional permissions from your
- Redash admin.
+ You can either browse existing queries, or ask for additional permissions from
+ your Redash admin.