diff --git a/platform/ui/index.js b/platform/ui/index.js
index 4e819e60a..0d7fe423e 100644
--- a/platform/ui/index.js
+++ b/platform/ui/index.js
@@ -31,6 +31,7 @@ export {
ButtonGroup,
DateRange,
Dialog,
+ Dropdown,
EmptyStudies,
Icon,
IconButton,
diff --git a/platform/ui/src/components/Dropdown/Dropdown.jsx b/platform/ui/src/components/Dropdown/Dropdown.jsx
new file mode 100644
index 000000000..752e2b6f9
--- /dev/null
+++ b/platform/ui/src/components/Dropdown/Dropdown.jsx
@@ -0,0 +1,107 @@
+import React, { useEffect, useState, useRef } from 'react';
+import PropTypes from 'prop-types';
+import classnames from 'classnames';
+
+import { Icon, Typography } from '@ohif/ui';
+
+const Dropdown = ({ titleElement, title, list }) => {
+ const [open, setOpen] = useState(false);
+ const element = useRef(null);
+
+ const renderTitleElement = () => {
+ if (titleElement) {
+ return titleElement;
+ }
+
+ return (
+
+ {title}
+
+
+ );
+ };
+
+ const toggleList = () => {
+ setOpen(s => !s);
+ };
+
+ const handleClick = e => {
+ if (element.current && !element.current.contains(e.target)) {
+ setOpen(false);
+ }
+ };
+
+ const renderList = () => {
+ const itemsAmount = list.length;
+
+ return (
+
+ {list.map((item, idx) => (
+
{
+ setOpen(false);
+
+ if (item.onClick) {
+ item.onClick();
+ }
+ }}
+ >
+ {!!item.icon && (
+
+ )}
+ {item.title}
+
+ ))}
+
+ );
+ };
+
+ useEffect(() => {
+ document.addEventListener('click', handleClick);
+
+ return () => {
+ document.removeEventListener('click', handleClick);
+ };
+ }, []);
+
+ return (
+
+
+ {renderTitleElement()}
+
+
+ {renderList()}
+
+ );
+};
+
+Dropdown.propTypes = {
+ titleElement: PropTypes.node,
+ title: PropTypes.string.isRequired,
+ /** Items to render in the select's drop down */
+ list: PropTypes.arrayOf(
+ PropTypes.shape({
+ title: PropTypes.string.isRequired,
+ icon: PropTypes.object,
+ onClick: PropTypes.func,
+ link: PropTypes.string,
+ })
+ ),
+};
+
+export default Dropdown;
diff --git a/platform/ui/src/components/Dropdown/Dropdown.mdx b/platform/ui/src/components/Dropdown/Dropdown.mdx
new file mode 100644
index 000000000..087877f56
--- /dev/null
+++ b/platform/ui/src/components/Dropdown/Dropdown.mdx
@@ -0,0 +1,22 @@
+---
+name: Dropdown
+menu: General
+route: components/dropdown
+---
+
+import { Playground, Props } from 'docz';
+import { Dropdown } from '@ohif/ui';
+
+# Dropdown
+
+...
+
+## Import
+
+```javascript
+import { Dropdown } from '@ohif/ui';
+```
+
+## Properties
+
+
diff --git a/platform/ui/src/components/Dropdown/index.js b/platform/ui/src/components/Dropdown/index.js
new file mode 100644
index 000000000..453771730
--- /dev/null
+++ b/platform/ui/src/components/Dropdown/index.js
@@ -0,0 +1 @@
+export { default } from './Dropdown';
diff --git a/platform/ui/src/components/index.js b/platform/ui/src/components/index.js
index d67bbb9ad..be5d75e1e 100644
--- a/platform/ui/src/components/index.js
+++ b/platform/ui/src/components/index.js
@@ -2,6 +2,7 @@ import Button from './Button';
import ButtonGroup from './ButtonGroup';
import DateRange from './DateRange';
import Dialog from './Dialog';
+import Dropdown from './Dropdown';
import EmptyStudies from './EmptyStudies';
import Icon from './Icon';
import IconButton from './IconButton';
@@ -53,6 +54,7 @@ export {
ButtonGroup,
DateRange,
Dialog,
+ Dropdown,
EmptyStudies,
Icon,
IconButton,