diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 283b9b4..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/webui/src/components/common/Loader.module.scss b/webui/src/components/common/Loader.module.scss new file mode 100644 index 0000000..2fb7047 --- /dev/null +++ b/webui/src/components/common/Loader.module.scss @@ -0,0 +1,33 @@ +@import "../../globals"; + +.loader { + width: 100%; + display: flex; + flex-direction: column; + + justify-content: center; + align-items: center; + height: 100%; + + > svg { + animation-name: spinny-spin; + animation-duration: 2s; + animation-timing-function: linear; + animation-iteration-count: infinite; + + width: 80px; + height: 80px; + + stroke-width: 1.5px; + } + + > span { + margin-top: var(--veles-layout-padding); + font-size: 1.5em; + } +} + +@keyframes spinny-spin { + 0% {transform: rotate(0turn)} + 100% {transform: rotate(1turn)} +} \ No newline at end of file diff --git a/webui/src/components/common/Loader.tsx b/webui/src/components/common/Loader.tsx new file mode 100644 index 0000000..f5b03ef --- /dev/null +++ b/webui/src/components/common/Loader.tsx @@ -0,0 +1,18 @@ +import React from "react"; +import {Loader as LoaderIcon} from "lucide-react"; + +import styles from "./Loader.module.scss"; +import {Trans} from "react-i18next"; + +const Loader = () => { + return
+ + Loading... +
+} + +export const LoaderSuspense = (props: React.PropsWithChildren<{}>) => } children={props.children} /> + +//export const LoaderSuspense = (props: React.PropsWithChildren<{}>) => + +export default Loader; \ No newline at end of file diff --git a/webui/src/components/panel/rooms/RoomDetail.tsx b/webui/src/components/panel/rooms/RoomDetail.tsx index a2d12b4..65c88c1 100644 --- a/webui/src/components/panel/rooms/RoomDetail.tsx +++ b/webui/src/components/panel/rooms/RoomDetail.tsx @@ -1,9 +1,10 @@ -import React, {useEffect} from "react"; +import React, {useContext, useEffect} from "react"; import {PreloadedQuery, usePreloadedQuery} from "react-relay/hooks"; import {graphql} from "babel-plugin-relay/macro"; import {RoomDetailQuery, RoomDetailQuery$variables} from "./__generated__/RoomDetailQuery.graphql"; import {DisposeFn} from "relay-runtime"; import {useParams} from "react-router-dom"; +import {RoomsSlideOverTitleContext} from "./Rooms"; import ToggleButton from "../../form_components/ToggleButton"; import styles from "./RoomDetail.module.scss"; @@ -46,20 +47,21 @@ const RoomDetailInner = ({initialQueryRef}: PropsFinal) => { initialQueryRef ) + const titleSetContext = useContext(RoomsSlideOverTitleContext) + + titleSetContext && data.room?.name && titleSetContext(data.room.name); + return <> - -

{data.room?.name}

- { - reconfigureRoom({ - variables: { - reconfigureInput: { - id: data.room?.id!, - deactivate: !ev.currentTarget.checked - } + { + reconfigureRoom({ + variables: { + reconfigureInput: { + id: data.room?.id!, + deactivate: !ev.currentTarget.checked } - }) - }} disabled={reconfiguringRoom || ((data.room || false) && !data.room.active && !data.room.deactivated)} checked={data.room?.active}/> -
+ } + }) + }} disabled={reconfiguringRoom || ((data.room || false) && !data.room.active && !data.room.deactivated)} checked={data.room?.active}/>
{JSON.stringify(data, null, 2)}
@@ -77,7 +79,7 @@ const RoomDetail = ({initialQueryRef, fetch, dispose}: Props) => { } }, [id, dispose, fetch]) - return initialQueryRef ? : <>loading... + return initialQueryRef ? : null } export default RoomDetail; \ No newline at end of file diff --git a/webui/src/components/panel/rooms/Rooms.tsx b/webui/src/components/panel/rooms/Rooms.tsx index 1b21726..4dd4d1b 100644 --- a/webui/src/components/panel/rooms/Rooms.tsx +++ b/webui/src/components/panel/rooms/Rooms.tsx @@ -1,13 +1,14 @@ -import React from "react"; +import React, {useContext, useState} from "react"; import {useNavigate, useOutlet} from "react-router-dom"; import styles from "./Rooms.module.scss"; -import {Trans} from "react-i18next"; +import {Trans, useTranslation} from "react-i18next"; import RoomsTable from "./RoomsTable"; import {PreloadedQuery, usePreloadedQuery} from "react-relay/hooks"; import {graphql} from "babel-plugin-relay/macro"; import {RoomsQuery} from "./__generated__/RoomsQuery.graphql"; import {X} from "lucide-react"; +import {LoaderSuspense} from "../../common/Loader"; type Props = { initialQueryRef: PreloadedQuery, @@ -16,6 +17,7 @@ type Props = { const Rooms = ({initialQueryRef}: Props) => { const outlet = useOutlet() const navigate = useNavigate() + const {t} = useTranslation() const data = usePreloadedQuery( graphql` @@ -26,6 +28,10 @@ const Rooms = ({initialQueryRef}: Props) => { initialQueryRef ) + const defaultTitle = t("rooms.details", "Details") + + const [title, setTitle] = useState(defaultTitle) + return
@@ -35,15 +41,21 @@ const Rooms = ({initialQueryRef}: Props) => {
-
- Details - -
-
- {outlet} -
+ +
+ {title} + +
+
+ + {outlet} + +
+
} +export const RoomsSlideOverTitleContext = React.createContext>|null>(null) + export default Rooms \ No newline at end of file diff --git a/webui/src/components/panel/rooms/RoomsTable.tsx b/webui/src/components/panel/rooms/RoomsTable.tsx index 173aa27..d892f3c 100644 --- a/webui/src/components/panel/rooms/RoomsTable.tsx +++ b/webui/src/components/panel/rooms/RoomsTable.tsx @@ -41,7 +41,7 @@ const RoomsTable = ({initialQueryRef}: Props) => { { data.rooms?.edges.map((edge) => { - return {navigate("/rooms/"+edge.node.id)}}> + return {navigate("/rooms/"+edge.node.id)}} key={edge.node.id}> {edge.node.debug && Debug} {!edge.node.active && Inactive} diff --git a/webui/src/index.tsx b/webui/src/index.tsx index 1a58dfc..2a5e0b1 100644 --- a/webui/src/index.tsx +++ b/webui/src/index.tsx @@ -12,17 +12,18 @@ import { import "./i18n"; import RelayEnvironment from "./RelayEnvironment"; +import {LoaderSuspense} from "./components/common/Loader"; ReactDOM.render( - Loading...}> + - + , diff --git a/webui/src/layouts/PanelLayout.tsx b/webui/src/layouts/PanelLayout.tsx index 002f4fa..a94b9b2 100644 --- a/webui/src/layouts/PanelLayout.tsx +++ b/webui/src/layouts/PanelLayout.tsx @@ -10,6 +10,7 @@ import styles from "./PanelLayout.module.scss"; import {Trans, useTranslation} from "react-i18next"; import {useAppDispatch} from "../app/hooks"; import {logOut} from "../features/auth/authSlice"; +import {LoaderSuspense} from "../components/common/Loader"; const PanelLayout = () => { const {t} = useTranslation() @@ -44,9 +45,9 @@ const PanelLayout = () => {
- Fetching data...}> + {outlet} - +