Skip to content
Snippets Groups Projects
Unverified Commit baa7b59e authored by Gustavo Saiani's avatar Gustavo Saiani Committed by GitHub
Browse files

Add AddYourOwnData link to nav (#21555)

parent 05100d3a
No related branches found
No related tags found
No related merge requests found
...@@ -3,7 +3,7 @@ import styled from "@emotion/styled"; ...@@ -3,7 +3,7 @@ import styled from "@emotion/styled";
import Icon from "metabase/components/Icon"; import Icon from "metabase/components/Icon";
import { NAV_SIDEBAR_WIDTH } from "metabase/nav/constants"; import { NAV_SIDEBAR_WIDTH } from "metabase/nav/constants";
import { color } from "metabase/lib/colors"; import { color, lighten } from "metabase/lib/colors";
import { import {
breakpointMaxSmall, breakpointMaxSmall,
breakpointMinSmall, breakpointMinSmall,
...@@ -110,3 +110,27 @@ export const ProfileLinkContainer = styled.div<{ isOpen: boolean }>` ...@@ -110,3 +110,27 @@ export const ProfileLinkContainer = styled.div<{ isOpen: boolean }>`
export const BrowseLink = styled(SidebarLink)` export const BrowseLink = styled(SidebarLink)`
padding-left: 14px; padding-left: 14px;
`; `;
export const AddYourOwnDataLink = styled(SidebarLink)`
background: ${color("brand")};
border-radius: 8px;
color: ${color("white")};
float: left;
margin: ${space(1)};
padding: 2px 6px;
transition: background-color 0.3s linear;
width: auto;
@media (prefers-reduced-motion) {
transition: none;
}
&:hover {
background: ${lighten("brand", 0.12)};
color: ${color("white")};
svg {
color: ${color("brand-light")} !important;
}
}
`;
...@@ -14,7 +14,10 @@ import Collections, { ...@@ -14,7 +14,10 @@ import Collections, {
buildCollectionTree, buildCollectionTree,
} from "metabase/entities/collections"; } from "metabase/entities/collections";
import { openNavbar, closeNavbar } from "metabase/redux/app"; import { openNavbar, closeNavbar } from "metabase/redux/app";
import { getHasDataAccess } from "metabase/new_query/selectors"; import {
getHasOwnDatabase,
getHasDataAccess,
} from "metabase/new_query/selectors";
import { getUser } from "metabase/selectors/user"; import { getUser } from "metabase/selectors/user";
import { import {
nonPersonalOrArchivedCollection, nonPersonalOrArchivedCollection,
...@@ -30,6 +33,7 @@ function mapStateToProps(state: unknown) { ...@@ -30,6 +33,7 @@ function mapStateToProps(state: unknown) {
return { return {
currentUser: getUser(state), currentUser: getUser(state),
hasDataAccess: getHasDataAccess(state), hasDataAccess: getHasDataAccess(state),
hasOwnDatabase: getHasOwnDatabase(state),
}; };
} }
...@@ -50,6 +54,7 @@ type Props = { ...@@ -50,6 +54,7 @@ type Props = {
collections: Collection[]; collections: Collection[];
rootCollection: Collection; rootCollection: Collection;
hasDataAccess: boolean; hasDataAccess: boolean;
hasOwnDatabase: boolean;
allFetched: boolean; allFetched: boolean;
location: { location: {
pathname: string; pathname: string;
...@@ -64,6 +69,7 @@ type Props = { ...@@ -64,6 +69,7 @@ type Props = {
function MainNavbarContainer({ function MainNavbarContainer({
isOpen, isOpen,
currentUser, currentUser,
hasOwnDatabase,
collections = [], collections = [],
rootCollection, rootCollection,
hasDataAccess, hasDataAccess,
...@@ -143,6 +149,7 @@ function MainNavbarContainer({ ...@@ -143,6 +149,7 @@ function MainNavbarContainer({
isOpen={isOpen} isOpen={isOpen}
currentUser={currentUser} currentUser={currentUser}
collections={collectionTree} collections={collectionTree}
hasOwnDatabase={hasOwnDatabase}
selectedItem={selectedItem} selectedItem={selectedItem}
hasDataAccess={hasDataAccess} hasDataAccess={hasDataAccess}
handleCloseNavbar={closeNavbar} handleCloseNavbar={closeNavbar}
......
...@@ -22,6 +22,7 @@ import { SelectedItem } from "./types"; ...@@ -22,6 +22,7 @@ import { SelectedItem } from "./types";
import BookmarkList from "./BookmarkList"; import BookmarkList from "./BookmarkList";
import { SidebarCollectionLink, SidebarLink } from "./SidebarItems"; import { SidebarCollectionLink, SidebarLink } from "./SidebarItems";
import { import {
AddYourOwnDataLink,
BrowseLink, BrowseLink,
CollectionsMoreIconContainer, CollectionsMoreIconContainer,
CollectionsMoreIcon, CollectionsMoreIcon,
...@@ -42,21 +43,24 @@ type Props = { ...@@ -42,21 +43,24 @@ type Props = {
isOpen: boolean; isOpen: boolean;
currentUser: User; currentUser: User;
bookmarks: Bookmark[]; bookmarks: Bookmark[];
hasDataAccess: boolean;
hasOwnDatabase: boolean;
collections: CollectionTreeItem[]; collections: CollectionTreeItem[];
selectedItem: SelectedItem; selectedItem: SelectedItem;
hasDataAccess: boolean;
handleCloseNavbar: () => void; handleCloseNavbar: () => void;
}; };
const BROWSE_URL = "/browse"; const BROWSE_URL = "/browse";
const OTHER_USERS_COLLECTIONS_URL = Urls.collection({ id: "users" }); const OTHER_USERS_COLLECTIONS_URL = Urls.collection({ id: "users" });
const ARCHIVE_URL = "/archive"; const ARCHIVE_URL = "/archive";
const ADD_YOUR_OWN_DATA_URL = "/admin/databases/create";
function MainNavbarView({ function MainNavbarView({
isOpen, isOpen,
currentUser, currentUser,
bookmarks, bookmarks,
collections, collections,
hasOwnDatabase,
selectedItem, selectedItem,
hasDataAccess, hasDataAccess,
handleCloseNavbar, handleCloseNavbar,
...@@ -122,6 +126,20 @@ function MainNavbarView({ ...@@ -122,6 +126,20 @@ function MainNavbarView({
> >
{t`Browse data`} {t`Browse data`}
</BrowseLink> </BrowseLink>
{!hasOwnDatabase && (
<AddYourOwnDataLink
icon="database"
url={ADD_YOUR_OWN_DATA_URL}
isSelected={
isMiscLinkSelected &&
selectedItem.url.startsWith(ADD_YOUR_OWN_DATA_URL)
}
onClick={onItemSelect}
data-metabase-event="NavBar;Add your own data"
>
{t`Add your own data`}
</AddYourOwnDataLink>
)}
</SidebarSection> </SidebarSection>
)} )}
</ul> </ul>
......
...@@ -18,6 +18,19 @@ export const getHasDataAccess = createSelector([getDatabaseList], databases => ...@@ -18,6 +18,19 @@ export const getHasDataAccess = createSelector([getDatabaseList], databases =>
databases.some(db => !db.is_saved_questions), databases.some(db => !db.is_saved_questions),
); );
export const getHasOwnDatabase = createSelector(
[getDatabaseList],
databases => {
if (databases.length === 0) {
return false;
}
if (databases.length === 1 && databases[0].name === "Sample Database") {
return false;
}
return true;
},
);
export const getHasNativeWrite = createSelector([getDatabaseList], databases => export const getHasNativeWrite = createSelector([getDatabaseList], databases =>
databases.some(db => db.native_permissions === "write"), databases.some(db => db.native_permissions === "write"),
); );
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment