diff --git a/superset-frontend/src/components/AnchorLink/AnchorLink.stories.tsx b/superset-frontend/src/components/AnchorLink/AnchorLink.stories.tsx
new file mode 100644
index 0000000000..33a47e6c96
--- /dev/null
+++ b/superset-frontend/src/components/AnchorLink/AnchorLink.stories.tsx
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+import AnchorLink from '.';
+
+export default {
+ title: 'AnchorLink',
+ component: AnchorLink,
+};
+
+export const InteractiveAnchorLink = (args: any) => (
+
+);
+
+const PLACEMENTS = ['right', 'left', 'top', 'bottom'];
+
+InteractiveAnchorLink.args = {
+ showShortLinkButton: true,
+ placement: PLACEMENTS[0],
+};
+
+InteractiveAnchorLink.argTypes = {
+ type: {
+ placement: { type: 'select', options: PLACEMENTS },
+ },
+};
+
+InteractiveAnchorLink.story = {
+ parameters: {
+ knobs: {
+ disable: true,
+ },
+ },
+};
diff --git a/superset-frontend/spec/javascripts/components/AnchorLink_spec.jsx b/superset-frontend/src/components/AnchorLink/AnchorLink.test.jsx
similarity index 100%
rename from superset-frontend/spec/javascripts/components/AnchorLink_spec.jsx
rename to superset-frontend/src/components/AnchorLink/AnchorLink.test.jsx
diff --git a/superset-frontend/src/components/AnchorLink.jsx b/superset-frontend/src/components/AnchorLink/index.jsx
similarity index 93%
rename from superset-frontend/src/components/AnchorLink.jsx
rename to superset-frontend/src/components/AnchorLink/index.jsx
index f98bd66669..42f93c3537 100644
--- a/superset-frontend/src/components/AnchorLink.jsx
+++ b/superset-frontend/src/components/AnchorLink/index.jsx
@@ -20,9 +20,9 @@ import React from 'react';
import PropTypes from 'prop-types';
import { t } from '@superset-ui/core';
-import URLShortLinkButton from './URLShortLinkButton';
-import getDashboardUrl from '../dashboard/util/getDashboardUrl';
-import getLocationHash from '../dashboard/util/getLocationHash';
+import URLShortLinkButton from 'src/components/URLShortLinkButton';
+import getDashboardUrl from 'src/dashboard/util/getDashboardUrl';
+import getLocationHash from 'src/dashboard/util/getLocationHash';
const propTypes = {
anchorLinkId: PropTypes.string.isRequired,
diff --git a/superset-frontend/src/components/ExpandableList.tsx b/superset-frontend/src/components/ExpandableList.tsx
deleted file mode 100644
index 20d980ea9d..0000000000
--- a/superset-frontend/src/components/ExpandableList.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-import React, { ReactNode, useState } from 'react';
-import Button from 'src/components/Button';
-
-interface Props {
- items: string[] | ReactNode[];
- display?: number;
-}
-
-function intersperse(arr: any[], sep: string | ReactNode) {
- if (arr.length === 0) {
- return [];
- }
-
- return arr.slice(1).reduce((xs, x) => xs.concat([sep, x]), [arr[0]]);
-}
-
-export default function ExpandableList({ items, display = 3 }: Props) {
- const [showingAll, setShowingAll] = useState(false);
- const toggleShowingAll = () => setShowingAll(!showingAll);
- const itemsToDisplay = items.slice(0, display);
- const showMoreAction = items.length > display;
-
- const lessAction = (
-
- );
- const moreAction = (
-
- );
- return (
-
- {showingAll
- ? intersperse(items, ', ')
- : intersperse(itemsToDisplay, ', ')}
- {showMoreAction && ','}
- {showMoreAction && (showingAll ? lessAction : moreAction)}
-
- );
-}