Merge branch 'feature/dashboard/dark-mode' into 'main'
tooltip works!! See merge request vkuchenik/website-framework!33
This commit is contained in:
@@ -0,0 +1,45 @@
|
|||||||
|
import { useState, useRef } from "react";
|
||||||
|
import { chakra, useSlotRecipe } from "@chakra-ui/react";
|
||||||
|
|
||||||
|
|
||||||
|
export default function Tooltip ({tooltipkey, content, sidebarIsOpen, children}) {
|
||||||
|
const [isVisible, setIsVisible] = useState(!sidebarIsOpen);
|
||||||
|
const recipe = useSlotRecipe({ key: "sidebar" });
|
||||||
|
const styles = recipe();
|
||||||
|
const timeoutId = useRef(null);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<chakra.div
|
||||||
|
width={sidebarIsOpen ? "194px" : "55px"}
|
||||||
|
transition="width 0.4s ease"
|
||||||
|
onMouseEnter={() => { timeoutId.current = setTimeout(() => setIsVisible(true), 1000); }}
|
||||||
|
onMouseLeave={() => {
|
||||||
|
if (timeoutId.current) {
|
||||||
|
clearTimeout(timeoutId.current);
|
||||||
|
timeoutId.current = null;
|
||||||
|
}
|
||||||
|
setIsVisible(false);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
{isVisible && !sidebarIsOpen && (
|
||||||
|
<>
|
||||||
|
<chakra.div
|
||||||
|
fontSize="xs"
|
||||||
|
position="absolute"
|
||||||
|
bg="gray.700"
|
||||||
|
color="white"
|
||||||
|
left="65px"
|
||||||
|
px={2}
|
||||||
|
py={1}
|
||||||
|
borderRadius="md"
|
||||||
|
whiteSpace="nowrap"
|
||||||
|
zIndex={10}
|
||||||
|
>
|
||||||
|
{content}
|
||||||
|
</chakra.div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</chakra.div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -12,13 +12,13 @@ export default function Widget({ id, title, isEditable, isDelete, DeleteWidget }
|
|||||||
{isDelete ? (
|
{isDelete ? (
|
||||||
<>
|
<>
|
||||||
<Flex flexDirection="row" justifyContent="space-between" alignItems="center">
|
<Flex flexDirection="row" justifyContent="space-between" alignItems="center">
|
||||||
<Text className="widget-handle" w="100%">{title}</Text>
|
<Text className="widget-handle" w="100%" fontWeight="bold">{title}</Text>
|
||||||
<CloseButton onClick={() => DeleteWidget(id)} size="xs" _hover={{bg: "tomato", color: "white"}}/>
|
<CloseButton onClick={() => DeleteWidget(id)} size="xs" _hover={{bg: "tomato", color: "white"}}/>
|
||||||
</Flex>
|
</Flex>
|
||||||
</>
|
</>
|
||||||
):(
|
):(
|
||||||
<>
|
<>
|
||||||
<Text className="widget-handle" >{title}</Text>
|
<Text className="widget-handle" fontWeight="bold">{title}</Text>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</chakra.div>
|
</chakra.div>
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ export function DashboardCanvas({ layout, setLayout, onLayoutChange }) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
/* HEADER */
|
/* HEADER */
|
||||||
<Tabs.Root lazyMount defaultValue="my dashboard">
|
<Tabs.Root lazyMount defaultValue="my dashboard" size="lg">
|
||||||
<Flex
|
<Flex
|
||||||
as="header"
|
as="header"
|
||||||
position="sticky"
|
position="sticky"
|
||||||
@@ -89,24 +89,24 @@ export function DashboardCanvas({ layout, setLayout, onLayoutChange }) {
|
|||||||
zIndex="dropdown" // zIndex: 1100
|
zIndex="dropdown" // zIndex: 1100
|
||||||
bg="base200"
|
bg="base200"
|
||||||
px={6}
|
px={6}
|
||||||
py={3}
|
pt={3}
|
||||||
align="center"
|
align="center"
|
||||||
justify="space-between"
|
justify="space-between"
|
||||||
>
|
>
|
||||||
<Tabs.List>
|
<Tabs.List>
|
||||||
<Tabs.Trigger value="my dashboard">
|
<Tabs.Trigger value="my dashboard" >
|
||||||
My Dashboard
|
My Dashboard
|
||||||
</Tabs.Trigger>
|
</Tabs.Trigger>
|
||||||
<Tabs.Trigger value="gas">
|
<Tabs.Trigger value="gas" >
|
||||||
Gas
|
Gas
|
||||||
</Tabs.Trigger>
|
</Tabs.Trigger>
|
||||||
<Tabs.Trigger value="seismic">
|
<Tabs.Trigger value="seismic" >
|
||||||
Seismic
|
Seismic
|
||||||
</Tabs.Trigger>
|
</Tabs.Trigger>
|
||||||
<Tabs.Trigger value="remote sensing">
|
<Tabs.Trigger value="remote sensing" >
|
||||||
Remote Sensing
|
Remote Sensing
|
||||||
</Tabs.Trigger>
|
</Tabs.Trigger>
|
||||||
<Tabs.Trigger value="daily activity">
|
<Tabs.Trigger value="daily activity" >
|
||||||
Daily Activity
|
Daily Activity
|
||||||
</Tabs.Trigger>
|
</Tabs.Trigger>
|
||||||
</Tabs.List>
|
</Tabs.List>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { useSlotRecipe, Box, Button, IconButton } from "@chakra-ui/react";
|
import { useSlotRecipe, Box, Button, IconButton } from "@chakra-ui/react";
|
||||||
import { ColorModeButton } from "@/components/ui/color-mode";
|
import { ColorModeButton } from "@/components/ui/color-mode";
|
||||||
import { Tooltip } from "@/components/ui/tooltip";
|
// import { Tooltip } from "@/components/ui/tooltip";
|
||||||
|
import Tooltip from "../Canvas/components/Tooltip.jsx";
|
||||||
import { FaVolcano } from "react-icons/fa6";
|
import { FaVolcano } from "react-icons/fa6";
|
||||||
import { FaHome } from "react-icons/fa";
|
import { FaHome } from "react-icons/fa";
|
||||||
import { FaGlobeAmericas } from "react-icons/fa";
|
import { FaGlobeAmericas } from "react-icons/fa";
|
||||||
@@ -12,6 +13,8 @@ import { useState } from "react";
|
|||||||
export default function Sidebar({ onChangeView }) {
|
export default function Sidebar({ onChangeView }) {
|
||||||
const [isOpen, setIsOpen] = useState(true);
|
const [isOpen, setIsOpen] = useState(true);
|
||||||
const [activeButton, setActiveButton] = useState(0)
|
const [activeButton, setActiveButton] = useState(0)
|
||||||
|
const recipe = useSlotRecipe({ key: "sidebar" });
|
||||||
|
const styles = recipe();
|
||||||
|
|
||||||
// this list of btns will come from the db (not every usr will have access to admin)
|
// this list of btns will come from the db (not every usr will have access to admin)
|
||||||
const buttons = [
|
const buttons = [
|
||||||
@@ -21,9 +24,6 @@ export default function Sidebar({ onChangeView }) {
|
|||||||
{icon: FaVolcano, name: "Volcano", view: "volcano"},
|
{icon: FaVolcano, name: "Volcano", view: "volcano"},
|
||||||
{icon: HiUsers, name: "Admin", view: "admin"}
|
{icon: HiUsers, name: "Admin", view: "admin"}
|
||||||
];
|
];
|
||||||
|
|
||||||
const recipe = useSlotRecipe({ key: "sidebar" });
|
|
||||||
const styles = recipe();
|
|
||||||
|
|
||||||
const toggleSidebar = () => {
|
const toggleSidebar = () => {
|
||||||
if (isOpen) setIsOpen(false);
|
if (isOpen) setIsOpen(false);
|
||||||
@@ -35,6 +35,7 @@ export default function Sidebar({ onChangeView }) {
|
|||||||
css={styles.root}
|
css={styles.root}
|
||||||
width={isOpen ? "210px" : "71px"}
|
width={isOpen ? "210px" : "71px"}
|
||||||
transition="width 0.4s ease"
|
transition="width 0.4s ease"
|
||||||
|
position="relative"
|
||||||
>
|
>
|
||||||
<IconButton
|
<IconButton
|
||||||
aria-label="Toggle Sidebar"
|
aria-label="Toggle Sidebar"
|
||||||
@@ -48,20 +49,22 @@ export default function Sidebar({ onChangeView }) {
|
|||||||
|
|
||||||
{buttons.map((button, idx) => {
|
{buttons.map((button, idx) => {
|
||||||
const Icon = button.icon;
|
const Icon = button.icon;
|
||||||
const buttonElement = (
|
return (
|
||||||
<Button
|
<Tooltip tooltipkeykey={idx} content={button.name} sidebarIsOpen={isOpen}>
|
||||||
// key={idx}
|
<Button
|
||||||
css={styles.buttons}
|
key={idx}
|
||||||
onClick={() => {
|
css={styles.buttons}
|
||||||
setActiveButton(idx);
|
onClick={() => {
|
||||||
onChangeView(button.view); // Trigger state change in Dashboard
|
setActiveButton(idx);
|
||||||
}}
|
onChangeView(button.view); // Trigger state change in Dashboard
|
||||||
bg={activeButton === idx ? "primary":undefined}
|
}}
|
||||||
color={activeButton === idx ? "#FFFFFF":undefined}
|
bg={activeButton === idx ? "primary":undefined}
|
||||||
justifyContent="flex-start"
|
color={activeButton === idx ? "#FFFFFF":undefined}
|
||||||
>
|
justifyContent="flex-start"
|
||||||
<Icon />
|
>
|
||||||
<span style={{
|
<Icon />
|
||||||
|
<span
|
||||||
|
style={{
|
||||||
opacity: isOpen ? 1 : 0,
|
opacity: isOpen ? 1 : 0,
|
||||||
transition: "opacity 0.4s ease",
|
transition: "opacity 0.4s ease",
|
||||||
overflow: "hidden",
|
overflow: "hidden",
|
||||||
@@ -72,17 +75,9 @@ export default function Sidebar({ onChangeView }) {
|
|||||||
>
|
>
|
||||||
{button.name}
|
{button.name}
|
||||||
</span>
|
</span>
|
||||||
</Button>
|
</Button>
|
||||||
);
|
|
||||||
// console.log("buttonElement is:", buttonElement)
|
|
||||||
console.log("Returning:", !isOpen ? "Tooltip" : "Button", buttonElement);
|
|
||||||
return !isOpen ? (
|
|
||||||
<Tooltip key={ idx } content={ button.name } placement="right" hasArrow>
|
|
||||||
{ buttonElement }
|
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
) : (
|
)
|
||||||
buttonElement
|
|
||||||
);
|
|
||||||
})}
|
})}
|
||||||
<ColorModeButton position="absolute" bottom="2"/>
|
<ColorModeButton position="absolute" bottom="2"/>
|
||||||
</Box>
|
</Box>
|
||||||
|
|||||||
Reference in New Issue
Block a user