From 01c2ef4c4decdb863f9ef730120c11c3370abfb7 Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Tue, 2 Apr 2024 22:45:03 +0200 Subject: [PATCH] V3 feedback (#866) * refactor: rename settings panel * style: typo * style: fix blackout position * fix: offset time in time-to-end * refactor: operator is protected * style: tweaks to pincode * refactor: close params editor on submit * refactor: same navigation in all pages * refactor: use cached response --- .eslintrc | 1 + .../NavigationMenu.module.scss | 4 +- .../navigation-menu/NavigationMenu.tsx | 112 +++++++++++++++++- .../ProductionNavigationMenu.tsx | 79 +----------- .../navigation-menu/ViewNavigationMenu.tsx | 71 +---------- .../components/protect-route/PinPage.tsx | 17 ++- .../protect-route/ProtectRoute.module.scss | 32 ++--- .../ViewParamsEditor.module.scss | 12 +- .../view-params-editor/ViewParamsEditor.tsx | 16 +-- .../src/common/hooks-query/useCustomFields.ts | 2 +- .../src/common/hooks-query/useHttpSettings.ts | 3 +- apps/client/src/common/hooks-query/useInfo.ts | 2 +- .../src/common/hooks-query/useOscSettings.ts | 2 +- .../src/common/hooks-query/useProjectData.ts | 2 +- .../src/common/hooks-query/useProjectList.ts | 2 +- .../src/common/hooks-query/useRundown.ts | 2 +- .../src/common/hooks-query/useSettings.ts | 2 +- .../src/common/hooks-query/useUrlPresets.ts | 2 +- .../src/common/hooks-query/useViewSettings.ts | 4 +- .../panel/general-panel/GeneralPanel.tsx | 2 +- .../features/app-settings/settingsStore.ts | 3 +- .../control/message/MessageControl.tsx | 4 +- .../src/features/operator/OperatorExport.tsx | 5 +- .../src/features/viewers/timer/Timer.scss | 2 + .../src/services/__tests__/timerUtils.test.ts | 7 +- apps/server/src/services/timerUtils.ts | 4 +- e2e/tests/features/206-url-preset.spec.ts | 2 +- 27 files changed, 184 insertions(+), 212 deletions(-) diff --git a/.eslintrc b/.eslintrc index 94aadac2d..7e5b262e8 100644 --- a/.eslintrc +++ b/.eslintrc @@ -19,6 +19,7 @@ "rules": { "no-useless-concat": "warn", "prefer-template": "warn", + "no-throw-literal": "error", "no-console": [ "warn", { diff --git a/apps/client/src/common/components/navigation-menu/NavigationMenu.module.scss b/apps/client/src/common/components/navigation-menu/NavigationMenu.module.scss index 2a54aeab4..acb7e09b7 100644 --- a/apps/client/src/common/components/navigation-menu/NavigationMenu.module.scss +++ b/apps/client/src/common/components/navigation-menu/NavigationMenu.module.scss @@ -45,8 +45,8 @@ $button-size: 3rem; .link { @include action-link; - justify-content: space-between; padding: 0.75rem 1.5rem; + gap: 0.5rem; &:hover { background-color: $menu-hover-bg; @@ -69,7 +69,7 @@ $button-size: 3rem; } .linkIcon { - display: inline-block; + margin-left: auto; transform: rotate(45deg); } diff --git a/apps/client/src/common/components/navigation-menu/NavigationMenu.tsx b/apps/client/src/common/components/navigation-menu/NavigationMenu.tsx index 7a5e7aba9..2e2a4ee19 100644 --- a/apps/client/src/common/components/navigation-menu/NavigationMenu.tsx +++ b/apps/client/src/common/components/navigation-menu/NavigationMenu.tsx @@ -1,16 +1,43 @@ -import { memo, PropsWithChildren, useRef } from 'react'; +import { memo, useRef } from 'react'; import { createPortal } from 'react-dom'; -import { Drawer, DrawerBody, DrawerCloseButton, DrawerContent, DrawerHeader, DrawerOverlay } from '@chakra-ui/react'; +import { Link } from 'react-router-dom'; +import { + Drawer, + DrawerBody, + DrawerCloseButton, + DrawerContent, + DrawerHeader, + DrawerOverlay, + useDisclosure, +} from '@chakra-ui/react'; +import { useFullscreen } from '@mantine/hooks'; +import { IoArrowUp } from '@react-icons/all-files/io5/IoArrowUp'; +import { IoContract } from '@react-icons/all-files/io5/IoContract'; +import { IoExpand } from '@react-icons/all-files/io5/IoExpand'; +import { IoLockClosedOutline } from '@react-icons/all-files/io5/IoLockClosedOutline'; +import { IoSwapVertical } from '@react-icons/all-files/io5/IoSwapVertical'; +import { navigatorConstants } from '../../../viewerConfig'; import useClickOutside from '../../hooks/useClickOutside'; +import { useViewOptionsStore } from '../../stores/viewOptions'; +import { isKeyEnter } from '../../utils/keyEvent'; + +import RenameClientModal from './rename-client-modal/RenameClientModal'; + +import style from './NavigationMenu.module.scss'; interface NavigationMenuProps { isOpen: boolean; onClose: () => void; } -function NavigationMenu(props: PropsWithChildren) { - const { children, isOpen, onClose } = props; +function NavigationMenu(props: NavigationMenuProps) { + const { isOpen, onClose } = props; + + const { isOpen: isRenameOpen, onOpen: onRenameOpen, onClose: onRenameClose } = useDisclosure(); + + const { fullscreen, toggle } = useFullscreen(); + const { toggleMirror } = useViewOptionsStore(); const menuRef = useRef(null); @@ -18,6 +45,7 @@ function NavigationMenu(props: PropsWithChildren) { return createPortal( , diff --git a/apps/client/src/common/components/navigation-menu/ProductionNavigationMenu.tsx b/apps/client/src/common/components/navigation-menu/ProductionNavigationMenu.tsx index 60ad24587..2841ba069 100644 --- a/apps/client/src/common/components/navigation-menu/ProductionNavigationMenu.tsx +++ b/apps/client/src/common/components/navigation-menu/ProductionNavigationMenu.tsx @@ -1,19 +1,7 @@ import { memo } from 'react'; -import { Link, useLocation } from 'react-router-dom'; -import { useDisclosure } from '@chakra-ui/react'; -import { useFullscreen } from '@mantine/hooks'; -import { IoArrowUp } from '@react-icons/all-files/io5/IoArrowUp'; -import { IoContract } from '@react-icons/all-files/io5/IoContract'; -import { IoExpand } from '@react-icons/all-files/io5/IoExpand'; -import { navigatorConstants } from '../../../viewerConfig'; -import { isKeyEnter } from '../../utils/keyEvent'; - -import RenameClientModal from './rename-client-modal/RenameClientModal'; import NavigationMenu from './NavigationMenu'; -import style from './NavigationMenu.module.scss'; - interface ProductionNavigationMenuProps { isMenuOpen: boolean; onMenuClose: () => void; @@ -21,73 +9,8 @@ interface ProductionNavigationMenuProps { function ProductionNavigationMenu(props: ProductionNavigationMenuProps) { const { isMenuOpen, onMenuClose } = props; - const location = useLocation(); - const { fullscreen, toggle } = useFullscreen(); - const { isOpen, onOpen, onClose } = useDisclosure(); - return ( - - -
-
{ - isKeyEnter(event) && toggle(); - }} - > - Toggle Fullscreen - {fullscreen ? : } -
-
{ - isKeyEnter(event) && onOpen(); - }} - > - Rename Client -
-
-
- - Editor - - - - Cuesheet - - - - Operator - - -
- {navigatorConstants.map((route) => ( - - {route.label} - - - ))} -
- ); + return ; } export default memo(ProductionNavigationMenu); diff --git a/apps/client/src/common/components/navigation-menu/ViewNavigationMenu.tsx b/apps/client/src/common/components/navigation-menu/ViewNavigationMenu.tsx index 10cc9fee1..3cb203ac4 100644 --- a/apps/client/src/common/components/navigation-menu/ViewNavigationMenu.tsx +++ b/apps/client/src/common/components/navigation-menu/ViewNavigationMenu.tsx @@ -1,28 +1,12 @@ import { memo, useCallback } from 'react'; -import { Link, useLocation, useSearchParams } from 'react-router-dom'; +import { useSearchParams } from 'react-router-dom'; import { useDisclosure } from '@chakra-ui/react'; -import { useFullscreen } from '@mantine/hooks'; -import { IoArrowUp } from '@react-icons/all-files/io5/IoArrowUp'; -import { IoContract } from '@react-icons/all-files/io5/IoContract'; -import { IoExpand } from '@react-icons/all-files/io5/IoExpand'; -import { IoSwapVertical } from '@react-icons/all-files/io5/IoSwapVertical'; -import { navigatorConstants } from '../../../viewerConfig'; -import { useViewOptionsStore } from '../../stores/viewOptions'; -import { isKeyEnter } from '../../utils/keyEvent'; - -import RenameClientModal from './rename-client-modal/RenameClientModal'; import FloatingNavigation from './FloatingNavigation'; import NavigationMenu from './NavigationMenu'; -import style from './NavigationMenu.module.scss'; - function ViewNavigationMenu() { - const location = useLocation(); - const { fullscreen, toggle } = useFullscreen(); - const { toggleMirror } = useViewOptionsStore(); const [searchParams, setSearchParams] = useSearchParams(); - const { isOpen: isRenameOpen, onOpen: onRenameOpen, onClose: onRenameClose } = useDisclosure(); const { isOpen: isMenuOpen, onOpen: onMenuOpen, onClose: onMenuClose } = useDisclosure(); const showEditFormDrawer = useCallback(() => { @@ -35,58 +19,7 @@ function ViewNavigationMenu() { return ( <> - - -
-
{ - isKeyEnter(event) && toggle(); - }} - > - Toggle Fullscreen - {fullscreen ? : } -
-
toggleMirror()} - onKeyDown={(event) => { - isKeyEnter(event) && toggleMirror(); - }} - > - Flip Screen - -
-
{ - isKeyEnter(event) && onRenameOpen(); - }} - > - Rename Client -
-
-
- {navigatorConstants.map((route) => ( - - {route.label} - - - ))} -
+ ); } diff --git a/apps/client/src/common/components/protect-route/PinPage.tsx b/apps/client/src/common/components/protect-route/PinPage.tsx index dfbd461e7..1648f23e4 100644 --- a/apps/client/src/common/components/protect-route/PinPage.tsx +++ b/apps/client/src/common/components/protect-route/PinPage.tsx @@ -1,5 +1,5 @@ import { useCallback, useEffect, useState } from 'react'; -import { HStack, IconButton, PinInput, PinInputField } from '@chakra-ui/react'; +import { IconButton, PinInput, PinInputField } from '@chakra-ui/react'; import { IoCheckmark } from '@react-icons/all-files/io5/IoCheckmark'; import style from './ProtectRoute.module.scss'; @@ -39,8 +39,8 @@ export default function PinPage(props: PinPageProps) { return (
- {`Ontime ${permission || ''}`} - + {`Ontime ${permission}`} +
- } onClick={validate} /> - + } + onClick={validate} + /> +
); } diff --git a/apps/client/src/common/components/protect-route/ProtectRoute.module.scss b/apps/client/src/common/components/protect-route/ProtectRoute.module.scss index f5aca2c70..7bceda037 100644 --- a/apps/client/src/common/components/protect-route/ProtectRoute.module.scss +++ b/apps/client/src/common/components/protect-route/ProtectRoute.module.scss @@ -1,27 +1,31 @@ .container { - display: grid; - place-content: center; - height: 100vh; - padding-bottom: 30vh; + display: flex; + flex-direction: column; + align-items: center; + padding-top: 25vh; - background: $bg-container-l1; color: $ontime-color; - font-family: $ontime-font-family; font-weight: 200; - text-align: center; - font-size: 3vw; + font-size: 3rem; } .pin, .pin__failed { - padding: 20px; + display: flex; + gap: 0.125em; + padding-block: 0.5em; input { - border-radius: 50%; + border-radius: 99px; + border-color: $gray-500; + + &:hover { + border-color: $blue-500; + } } button { - margin-left: 20px; + margin-left: 1em; } } @@ -33,9 +37,9 @@ @keyframes colourFade { from { - background: $action-blue; + background: $red-500; } to { - background: rgba($action-blue, 0); + background: rgba($red-500, 0); } -} +} \ No newline at end of file diff --git a/apps/client/src/common/components/view-params-editor/ViewParamsEditor.module.scss b/apps/client/src/common/components/view-params-editor/ViewParamsEditor.module.scss index 79ef8387f..53de3badc 100644 --- a/apps/client/src/common/components/view-params-editor/ViewParamsEditor.module.scss +++ b/apps/client/src/common/components/view-params-editor/ViewParamsEditor.module.scss @@ -1,14 +1,9 @@ .drawerFooter { display: flex; - justify-content: start; + justify-content: end; gap: $section-spacing; - button[type='reset'] { - padding: 0 2em; - margin-right: auto; - } - - button[type='submit'] { + button { padding: 0 2em; } } @@ -16,6 +11,9 @@ .label { font-size: $inner-section-text-size; color: $label-gray; + display: flex; + flex-direction: column; + gap: 0.25rem } .columnSection { diff --git a/apps/client/src/common/components/view-params-editor/ViewParamsEditor.tsx b/apps/client/src/common/components/view-params-editor/ViewParamsEditor.tsx index 055257030..b2bc55f26 100644 --- a/apps/client/src/common/components/view-params-editor/ViewParamsEditor.tsx +++ b/apps/client/src/common/components/view-params-editor/ViewParamsEditor.tsx @@ -52,15 +52,16 @@ export default function ViewParamsEditor({ paramFields }: EditFormDrawerProps) { } }, [searchParams, onOpen]); - const onCloseWithoutSaving = () => { - onClose(); - + const handleClose = () => { searchParams.delete('edit'); setSearchParams(searchParams); + + onClose(); }; const resetParams = () => { setSearchParams(); + onClose(); }; const onParamsFormSubmit = (formEvent: FormEvent) => { @@ -69,10 +70,12 @@ export default function ViewParamsEditor({ paramFields }: EditFormDrawerProps) { const newParamsObject = Object.fromEntries(new FormData(formEvent.currentTarget)); const newSearchParams = getURLSearchParamsFromObj(newParamsObject, paramFields); setSearchParams(newSearchParams); + + handleClose(); }; return ( - + @@ -96,10 +99,7 @@ export default function ViewParamsEditor({ paramFields }: EditFormDrawerProps) { -