From 3c33d3883efacc6da99f1b6458f2ad9482659bd3 Mon Sep 17 00:00:00 2001 From: Pax1601 Date: Tue, 18 Mar 2025 16:14:39 +0100 Subject: [PATCH] fix: Small fixes to responsive design --- frontend/react/src/map/boxselect.ts | 6 +- frontend/react/src/map/map.ts | 11 ++- .../react/src/ui/components/ollocation.tsx | 27 +++++- .../react/src/ui/components/oltooltip.tsx | 8 +- frontend/react/src/ui/panels/airbasemenu.tsx | 2 +- frontend/react/src/ui/panels/awacsmenu.tsx | 2 +- .../react/src/ui/panels/components/menu.tsx | 94 +++++++++++-------- .../react/src/ui/panels/controlspanel.tsx | 7 +- .../react/src/ui/panels/coordinatespanel.tsx | 56 +++++++---- frontend/react/src/ui/panels/drawingmenu.tsx | 1 - frontend/react/src/ui/panels/header.tsx | 5 +- frontend/react/src/ui/panels/jtacmenu.tsx | 2 +- frontend/react/src/ui/panels/minimappanel.tsx | 94 +++++++++++-------- .../src/ui/panels/radiossummarypanel.tsx | 6 +- frontend/react/src/ui/panels/spawnmenu.tsx | 1 - .../react/src/ui/panels/unitcontrolmenu.tsx | 1 - frontend/react/src/ui/ui.tsx | 4 +- 17 files changed, 211 insertions(+), 116 deletions(-) diff --git a/frontend/react/src/map/boxselect.ts b/frontend/react/src/map/boxselect.ts index edfa9635..f4829029 100644 --- a/frontend/react/src/map/boxselect.ts +++ b/frontend/react/src/map/boxselect.ts @@ -17,10 +17,12 @@ export var BoxSelect = Handler.extend({ addHooks: function () { DomEvent.on(this._container, "mousedown", this._onMouseDown, this); + DomEvent.on(this._container, "touchstart", this._onMouseDown, this); }, removeHooks: function () { DomEvent.off(this._container, "mousedown", this._onMouseDown, this); + DomEvent.off(this._container, "touchend", this._onMouseDown, this); }, moved: function () { @@ -37,7 +39,7 @@ export var BoxSelect = Handler.extend({ }, _onMouseDown: function (e: any) { - if (this._map.getSelectionEnabled() && e.button == 0) { + if (this._map.getSelectionEnabled() && (e.button == 0 || e.type === "touchstart")) { if (this._moved) this._finish(); DomUtil.disableImageDrag(); @@ -64,7 +66,7 @@ export var BoxSelect = Handler.extend({ }, _onMouseUp: function (e: any) { - if (e.button !== 0) return; + if (e.button !== 0 && e.type !== "touchend") return; window.setTimeout(Util.bind(this._finish, this), 0); if (!this._moved) return; var bounds = new LatLngBounds(this._map.containerPointToLatLng(this._startPoint), this._map.containerPointToLatLng(this._point)); diff --git a/frontend/react/src/map/map.ts b/frontend/react/src/map/map.ts index 4ec202ca..28c0f4e5 100644 --- a/frontend/react/src/map/map.ts +++ b/frontend/react/src/map/map.ts @@ -209,7 +209,9 @@ export class Map extends L.Map { this.on("selectionend", (e: any) => this.#onSelectionEnd(e)); this.on("mouseup", (e: any) => this.#onMouseUp(e)); + this.on("touchend", (e: any) => this.#onMouseUp(e)); this.on("mousedown", (e: any) => this.#onMouseDown(e)); + this.on("touchstart", (e: any) => this.#onMouseDown(e)); this.on("dblclick", (e: any) => this.#onDoubleClick(e)); this.on("click", (e: any) => e.originalEvent.preventDefault()); this.on("contextmenu", (e: any) => e.originalEvent.preventDefault()); @@ -810,6 +812,10 @@ export class Map extends L.Map { setSelectionEnabled(selectionEnabled: boolean) { this.#selectionEnabled = selectionEnabled; + + if (selectionEnabled) this.dragging.disable(); + else this.dragging.enable(); + SelectionEnabledChangedEvent.dispatch(selectionEnabled); } @@ -963,6 +969,9 @@ export class Map extends L.Map { #onSelectionEnd(e: any) { getApp().getUnitsManager().selectFromBounds(e.selectionBounds); + // Autodisable the selection mode if touchscreen + if ("ontouchstart" in window) this.setSelectionEnabled(false); + /* Delay the event so that any other event in the queue still sees the map in selection mode */ window.setTimeout(() => { this.#isSelecting = false; @@ -997,7 +1006,7 @@ export class Map extends L.Map { } #onMouseDown(e: any) { - if (e.originalEvent.button === 1) { + if (e.originalEvent?.button === 1) { this.dragging.disable(); } // Disable dragging when right clicking diff --git a/frontend/react/src/ui/components/ollocation.tsx b/frontend/react/src/ui/components/ollocation.tsx index 82ffb6e2..34e142f5 100644 --- a/frontend/react/src/ui/components/ollocation.tsx +++ b/frontend/react/src/ui/components/ollocation.tsx @@ -12,7 +12,14 @@ export function OlLocation(props: { location: LatLng; className?: string; refere ${props.className ?? ""} my-auto cursor-pointer bg-olympus-400 p-2 text-white `} - onClick={props.onClick ? props.onClick : () => setReferenceSystem("LatLngDec")} + onClick={ + props.onClick + ? props.onClick + : (ev) => { + setReferenceSystem("LatLngDec"); + ev.stopPropagation(); + } + } > setReferenceSystem("LatLngDMS")} + onClick={ + props.onClick + ? props.onClick + : (ev) => { + setReferenceSystem("LatLngDMS"); + ev.stopPropagation(); + } + } >
setReferenceSystem("MGRS")} + onClick={ + props.onClick + ? props.onClick + : (ev) => { + setReferenceSystem("MGRS"); + ev.stopPropagation(); + } + } >
{ + setIsTouchscreen("ontouchstart" in window); + }, []); + var contentRef = useRef(null); function setPosition(content: HTMLDivElement, button: HTMLButtonElement) { @@ -106,7 +112,7 @@ export function OlTooltip(props: { }); return ( - props.content !== "" && ( + props.content !== "" && !isTouchscreen && (
void; childre } return ( - +
void; children? }, []); return ( - +
void; - canBeHidden?: boolean; onBack?: () => void; showBackButton?: boolean; children?: JSX.Element | JSX.Element[]; - wiki?: () => (JSX.Element | JSX.Element[]); + wiki?: () => JSX.Element | JSX.Element[]; }) { const [hide, setHide] = useState(true); const [wiki, setWiki] = useState(false); if (!props.open && hide) setHide(false); + useEffect(() => { + if (window.innerWidth > 640) setHide(false); + }, [props.open]); + return (
+ {props.open && ( +
+
setHide(!hide)} + > + +
+
+ )}
+ setHide(true)} + icon={faEyeSlash} + className={` + flex cursor-pointer items-center justify-center rounded-md p-2 + text-lg + dark:text-gray-500 dark:hover:bg-gray-700 dark:hover:text-white + hover:bg-gray-200 + `} + />
-
-
- {props.wiki ? props.wiki() :
Work in progress
} -
-
{props.children}
+
+
+ {props.wiki ? props.wiki() :
Work in progress
} +
+
+ {props.children} +
- {props.canBeHidden == true && ( -
setHide(!hide)} - > - {hide ? ( - - ) : ( - - )} -
- )}
); } diff --git a/frontend/react/src/ui/panels/controlspanel.tsx b/frontend/react/src/ui/panels/controlspanel.tsx index 411bd77a..8dca56e9 100644 --- a/frontend/react/src/ui/panels/controlspanel.tsx +++ b/frontend/react/src/ui/panels/controlspanel.tsx @@ -5,6 +5,7 @@ import { DrawSubState, MAP_OPTIONS_DEFAULTS, NO_SUBSTATE, OlympusState, OlympusS import { AppStateChangedEvent, ContextActionSetChangedEvent, MapOptionsChangedEvent, ShortcutsChangedEvent } from "../../events"; import { ContextActionSet } from "../../unit/contextactionset"; import { MapToolBar } from "./maptoolbar"; +import { CoordinatesPanel } from "./coordinatespanel"; export function ControlsPanel(props: {}) { const [controls, setControls] = useState( @@ -200,12 +201,12 @@ export function ControlsPanel(props: {}) { className={` absolute right-[0px] top-16 ${mapOptions.showMinimap ? `bottom-[233px]` : `bottom-[65px]`} - pointer-events-none flex w-[310px] flex-col items-center justify-between + pointer-events-none flex w-[288px] flex-col items-center justify-between gap-1 p-3 text-sm `} > - {controls?.map((control) => { + {/*controls?.map((control) => { return (
); - })} + })*/}
); } diff --git a/frontend/react/src/ui/panels/coordinatespanel.tsx b/frontend/react/src/ui/panels/coordinatespanel.tsx index b33a728c..c1fe6dee 100644 --- a/frontend/react/src/ui/panels/coordinatespanel.tsx +++ b/frontend/react/src/ui/panels/coordinatespanel.tsx @@ -12,6 +12,7 @@ export function CoordinatesPanel(props: {}) { const [elevation, setElevation] = useState(0); const [bullseyes, setBullseyes] = useState(null as null | { [name: string]: Bullseye }); const [selectedUnits, setSelectedUnits] = useState([] as Unit[]); + const [open, setOpen] = useState(true); useEffect(() => { MouseMovedEvent.on((latlng, elevation) => { @@ -27,18 +28,30 @@ export function CoordinatesPanel(props: {}) { return (
setOpen(!open)} > - {bullseyes && ( -
+
+ {open ? ( + + ) : ( + + )} +
+ {open && bullseyes && ( +
{bullseyes[2] && ( @@ -84,18 +97,27 @@ export function CoordinatesPanel(props: {}) {
)} -
+
- - - -
{mToFt(elevation).toFixed()}ft
+ + {open && ( +
+ + + +
{mToFt(elevation).toFixed()}ft
+
+ )}
); } diff --git a/frontend/react/src/ui/panels/drawingmenu.tsx b/frontend/react/src/ui/panels/drawingmenu.tsx index d3ea79ba..56e1737a 100644 --- a/frontend/react/src/ui/panels/drawingmenu.tsx +++ b/frontend/react/src/ui/panels/drawingmenu.tsx @@ -147,7 +147,6 @@ export function DrawingMenu(props: { open: boolean; onClose: () => void }) { open={props.open} title="Draw" onClose={props.onClose} - canBeHidden={true} showBackButton={appSubState !== DrawSubState.NO_SUBSTATE} onBack={() => { getApp().getCoalitionAreasManager().setSelectedArea(null); diff --git a/frontend/react/src/ui/panels/header.tsx b/frontend/react/src/ui/panels/header.tsx index 8429e62b..e18b53aa 100644 --- a/frontend/react/src/ui/panels/header.tsx +++ b/frontend/react/src/ui/panels/header.tsx @@ -102,7 +102,8 @@ export function Header() { return (
@@ -147,6 +148,7 @@ export function Header() { {IP}
+
{savingSessionData ? (
@@ -162,6 +164,7 @@ export function Header() {
)} +
{commandModeOptions.commandMode === BLUE_COMMANDER && ( diff --git a/frontend/react/src/ui/panels/jtacmenu.tsx b/frontend/react/src/ui/panels/jtacmenu.tsx index 3990f6c9..795980d6 100644 --- a/frontend/react/src/ui/panels/jtacmenu.tsx +++ b/frontend/react/src/ui/panels/jtacmenu.tsx @@ -60,7 +60,7 @@ export function JTACMenu(props: { open: boolean; onClose: () => void; children?: let targetPosition = (targetUnit ? targetUnit.getPosition() : targetLocation) ?? new LatLng(0, 0); return ( - +
- {!serverStatus.connected ? ( -
-
- Server disconnected -
- ) : serverStatus.paused ? ( -
-
- Server paused -
- ) : ( - <> -
- FPS: - - {serverStatus.frameRate} - + + +
{ + getApp().getMap().setOption("showMinimap", !mapOptions.showMinimap); + }}> + {!serverStatus.connected ? ( +
+
+ Server disconnected
-
- Load: - - {serverStatus.load} - + ) : serverStatus.paused ? ( +
+
+ Server paused
-
setShowMissionTime(!showMissionTime)}> - {showMissionTime ? "MT" : "ET"}: {timeString} -
-
- - )} - {mapOptions.showMinimap ? ( - getApp().getMap().setOption("showMinimap", false)} /> - ) : ( - getApp().getMap().setOption("showMinimap", true)} /> - )} + ) : ( + <> +
+ FPS: + + {serverStatus.frameRate} + +
+
+ Load: + + {serverStatus.load} + +
+
{ + setShowMissionTime(!showMissionTime); + ev.stopPropagation(); + }} + > + {showMissionTime ? "MT" : "ET"}: {timeString} +
+ + )} + {mapOptions.showMinimap ? ( + + ) : ( + + )} +
); } diff --git a/frontend/react/src/ui/panels/radiossummarypanel.tsx b/frontend/react/src/ui/panels/radiossummarypanel.tsx index e4324d97..77fa7ae1 100644 --- a/frontend/react/src/ui/panels/radiossummarypanel.tsx +++ b/frontend/react/src/ui/panels/radiossummarypanel.tsx @@ -19,12 +19,10 @@ export function RadiosSummaryPanel(props: {}) { {audioSinks.length > 0 && (
-
+
{audioSinks.filter((audioSinks) => audioSinks instanceof RadioSink).length > 0 && audioSinks diff --git a/frontend/react/src/ui/panels/spawnmenu.tsx b/frontend/react/src/ui/panels/spawnmenu.tsx index dc0c7001..3437c8f5 100644 --- a/frontend/react/src/ui/panels/spawnmenu.tsx +++ b/frontend/react/src/ui/panels/spawnmenu.tsx @@ -113,7 +113,6 @@ export function SpawnMenu(props: { open: boolean; onClose: () => void; children? {...props} title="Spawn menu" showBackButton={blueprint !== null || effect !== null} - canBeHidden={true} onBack={() => { getApp().setState(OlympusState.SPAWN); setBlueprint(null); diff --git a/frontend/react/src/ui/panels/unitcontrolmenu.tsx b/frontend/react/src/ui/panels/unitcontrolmenu.tsx index b9297688..6e662acb 100644 --- a/frontend/react/src/ui/panels/unitcontrolmenu.tsx +++ b/frontend/react/src/ui/panels/unitcontrolmenu.tsx @@ -295,7 +295,6 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { open={props.open} title={selectedUnits.length > 0 ? `Units selected (x${selectedUnits.length})` : `No units selected`} onClose={props.onClose} - canBeHidden={true} wiki={() => { return (
- - + +