From fda0b21fb070317f70dc17f1444142c3b6dff844 Mon Sep 17 00:00:00 2001 From: Pax1601 Date: Fri, 1 Dec 2023 13:00:02 +0100 Subject: [PATCH] Minor refactoring --- client/demo.js | 4 +- client/package-lock.json | 15 ++- client/package.json | 3 +- client/public/stylesheets/markers/airbase.css | 2 + .../public/stylesheets/markers/bullseye.css | 2 + client/public/stylesheets/markers/units.css | 5 + .../public/stylesheets/other/contextmenus.css | 86 ++++++++++--- client/public/stylesheets/panels/logpanel.css | 6 +- .../public/stylesheets/panels/unitcontrol.css | 120 ++++++++++-------- client/public/stylesheets/panels/unitinfo.css | 6 +- client/public/stylesheets/style/style.css | 14 +- .../images/icons/chevron-down-warning.svg | 3 + .../themes/olympus/images/parrot/parrot.png | Bin 0 -> 41959 bytes client/public/themes/parrot/images/parrot.svg | 54 ++++++++ client/public/themes/parrot/theme.css | 109 ++++++++++++++++ client/routes/resources.js | 36 +++++- client/src/olympusapp.ts | 1 - client/src/server/servermanager.ts | 2 +- client/views/index.ejs | 12 ++ client/views/panels/unitcontrol.ejs | 1 - package-lock.json | 24 ++++ package.json | 5 + 22 files changed, 418 insertions(+), 92 deletions(-) create mode 100644 client/public/themes/olympus/images/icons/chevron-down-warning.svg create mode 100644 client/public/themes/olympus/images/parrot/parrot.png create mode 100644 client/public/themes/parrot/images/parrot.svg create mode 100644 client/public/themes/parrot/theme.css create mode 100644 package-lock.json create mode 100644 package.json diff --git a/client/demo.js b/client/demo.js index 2a8ba5c7..691846b2 100644 --- a/client/demo.js +++ b/client/demo.js @@ -92,7 +92,7 @@ class DemoDataGenerator { } - /* + */ let idx = 1; DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData)); DEMO_UNIT_DATA[idx].name = "S_75M_Volhov"; @@ -153,7 +153,7 @@ class DemoDataGenerator { DEMO_UNIT_DATA[idx].position.lat += idx / 100; DEMO_UNIT_DATA[idx].category = "Aircraft"; DEMO_UNIT_DATA[idx].isLeader = true; - */ + this.startTime = Date.now(); } diff --git a/client/package-lock.json b/client/package-lock.json index 44be542b..0b82ed23 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -19,7 +19,8 @@ "leaflet-gesture-handling": "^1.2.2", "morgan": "~1.9.1", "save": "^2.9.0", - "srtm-elevation": "^2.1.2" + "srtm-elevation": "^2.1.2", + "uuid": "^9.0.1" }, "devDependencies": { "@babel/preset-env": "^7.21.4", @@ -8820,6 +8821,18 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/client/package.json b/client/package.json index e7727c1f..1b2ff03a 100644 --- a/client/package.json +++ b/client/package.json @@ -25,7 +25,8 @@ "leaflet-gesture-handling": "^1.2.2", "morgan": "~1.9.1", "save": "^2.9.0", - "srtm-elevation": "^2.1.2" + "srtm-elevation": "^2.1.2", + "uuid": "^9.0.1" }, "devDependencies": { "@babel/preset-env": "^7.21.4", diff --git a/client/public/stylesheets/markers/airbase.css b/client/public/stylesheets/markers/airbase.css index a9640cf3..f734bf34 100644 --- a/client/public/stylesheets/markers/airbase.css +++ b/client/public/stylesheets/markers/airbase.css @@ -4,6 +4,8 @@ display: flex; justify-content: center; position: relative; + width: 100%; + height: 100%; } .airbase-icon[data-coalition="red"] svg * { diff --git a/client/public/stylesheets/markers/bullseye.css b/client/public/stylesheets/markers/bullseye.css index 81663b09..e75f0441 100644 --- a/client/public/stylesheets/markers/bullseye.css +++ b/client/public/stylesheets/markers/bullseye.css @@ -4,6 +4,8 @@ display: flex; justify-content: center; position: relative; + width: 100%; + height: 100%; } .bullseye-icon[data-coalition="red"] svg * { diff --git a/client/public/stylesheets/markers/units.css b/client/public/stylesheets/markers/units.css index 19574ec2..e2cba54d 100644 --- a/client/public/stylesheets/markers/units.css +++ b/client/public/stylesheets/markers/units.css @@ -50,6 +50,11 @@ width: var(--unit-width); } +.unit-icon svg { + height: 100%; + width: 100%; +} + [data-is-selected] .unit-icon::before { background-color: var(--unit-spotlight-fill); border-radius: 50%; diff --git a/client/public/stylesheets/other/contextmenus.css b/client/public/stylesheets/other/contextmenus.css index 98936a8b..b133be08 100644 --- a/client/public/stylesheets/other/contextmenus.css +++ b/client/public/stylesheets/other/contextmenus.css @@ -61,9 +61,13 @@ .contextmenu-advanced-options-toggle:after, .contextmenu-metadata-toggle:after { - content: url(/resources/theme/images/icons/chevron-down.svg); + content: ""; margin-left: auto; margin-top: auto; + background-image: url(/resources/theme/images/icons/chevron-down.svg); + background-size: 100% 100%; + width: 15px; + height: 15px; } .contextmenu-advanced-options-toggle.is-open:after, @@ -407,84 +411,124 @@ /* Buttons */ #center-map::before { - content: url("/resources/theme/images/icons/arrows-to-eye-solid.svg"); + background-image: url("/resources/theme/images/icons/arrows-to-eye-solid.svg"); + content: ""; + background-size: 20px 20px; } #refuel::before { - content: url("/resources/theme/images/icons/fuel.svg"); + background-image: url("/resources/theme/images/icons/fuel.svg"); + content: ""; + background-size: 20px 20px; } #attack::before { - content: url("/resources/theme/images/icons/sword.svg"); + background-image: url("/resources/theme/images/icons/sword.svg"); + content: ""; + background-size: 20px 20px; } #bomb::before { - content: url("/resources/theme/images/icons/crosshairs-solid.svg"); + background-image: url("/resources/theme/images/icons/crosshairs-solid.svg"); + content: ""; + background-size: 20px 20px; } #carpet-bomb::before { - content: url("/resources/theme/images/icons/explosion-solid.svg"); + background-image: url("/resources/theme/images/icons/explosion-solid.svg"); + content: ""; + background-size: 20px 20px; } #fire-at-area::before { - content: url("/resources/theme/images/icons/crosshairs-solid.svg"); + background-image: url("/resources/theme/images/icons/crosshairs-solid.svg"); + content: ""; + background-size: 20px 20px; } #simulate-fire-fight::before { - content: url("/resources/theme/images/icons/crosshairs-solid.svg"); + background-image: url("/resources/theme/images/icons/crosshairs-solid.svg"); + content: ""; + background-size: 20px 20px; } #follow::before { - content: url("/resources/theme/images/icons/follow.svg"); + background-image: url("/resources/theme/images/icons/follow.svg"); + content: ""; + background-size: 20px 20px; } #scenic-aaa::before { - content: url("/resources/theme/images/icons/scenic.svg"); + background-image: url("/resources/theme/images/icons/scenic.svg"); + content: ""; + background-size: 20px 20px; } #miss-aaa::before { - content: url("/resources/theme/images/icons/miss.svg"); + background-image: url("/resources/theme/images/icons/miss.svg"); + content: ""; + background-size: 20px 20px; } #group-ground::before { - content: url("/resources/theme/images/icons/group-ground.svg"); + background-image: url("/resources/theme/images/icons/group-ground.svg"); + content: ""; + background-size: 20px 20px; } #group-navy::before { - content: url("/resources/theme/images/icons/group-navy.svg"); + background-image: url("/resources/theme/images/icons/group-navy.svg"); + content: ""; + background-size: 20px 20px; } #land-at-point::before { - content: url("/resources/theme/images/icons/land-at-point.svg"); + background-image: url("/resources/theme/images/icons/land-at-point.svg"); + content: ""; + background-size: 20px 20px; } #trail::before { - content: url("/resources/theme/images/icons/trail.svg"); + background-image: url("/resources/theme/images/icons/trail.svg"); + content: ""; + background-size: 20px 20px; } #echelon-lh::before { - content: url("/resources/theme/images/icons/echelon-lh.svg"); + background-image: url("/resources/theme/images/icons/echelon-lh.svg"); + content: ""; + background-size: 20px 20px; } #echelon-rh::before { - content: url("/resources/theme/images/icons/echelon-rh.svg"); + background-image: url("/resources/theme/images/icons/echelon-rh.svg"); + content: ""; + background-size: 20px 20px; } #line-abreast-rh::before, #line-abreast-lh::before { - content: url("/resources/theme/images/icons/line-abreast.svg"); + background-image: url("/resources/theme/images/icons/line-abreast.svg"); + content: ""; + background-size: 20px 20px; } #front::before { - content: url("/resources/theme/images/icons/front.svg"); + background-image: url("/resources/theme/images/icons/front.svg"); + content: ""; + background-size: 20px 20px; } #diamond::before { - content: url("/resources/theme/images/icons/diamond.svg"); + background-image: url("/resources/theme/images/icons/diamond.svg"); + content: ""; + background-size: 20px 20px; } #custom::before { - content: url("/resources/theme/images/icons/custom.svg"); + background-image: url("/resources/theme/images/icons/custom.svg"); + content: ""; + background-size: 20px 20px; } #custom-formation-dialog { diff --git a/client/public/stylesheets/panels/logpanel.css b/client/public/stylesheets/panels/logpanel.css index 1c5cd002..00adcaff 100644 --- a/client/public/stylesheets/panels/logpanel.css +++ b/client/public/stylesheets/panels/logpanel.css @@ -27,7 +27,6 @@ display: block; } - #log-panel-header-right { align-items: center; column-gap: 16px; @@ -35,6 +34,11 @@ flex-flow: row nowrap; } +#log-panel-header-right svg { + width: 15px; + height: 15px; +} + #server-status-panel abbr { text-decoration: none; } diff --git a/client/public/stylesheets/panels/unitcontrol.css b/client/public/stylesheets/panels/unitcontrol.css index 11801c24..b7039a92 100644 --- a/client/public/stylesheets/panels/unitcontrol.css +++ b/client/public/stylesheets/panels/unitcontrol.css @@ -6,60 +6,69 @@ body.feature-forceShowUnitControlPanel #unit-control-panel { #roe-buttons-container button, #reaction-to-threat-buttons-container button, #emissions-countermeasures-buttons-container button, -#shots-scatter-buttons-container button -#shots-intensity-buttons-container button { - align-items: center; - background-color: transparent; - border: 1px solid var(--accent-light-blue); - display: flex; - height: 30px; - justify-content: center; - width: 30px; +#shots-scatter-buttons-container button #shots-intensity-buttons-container button { + align-items: center; + background-color: transparent; + border: 1px solid var(--accent-light-blue); + display: flex; + height: 30px; + justify-content: center; + width: 30px; } #reaction-to-threat-buttons-container button:not(:first-child) svg { - width: 150%; - margin: -5px; + width: 150%; + margin: -5px; +} + +#unit-control-panel .ol-option-button button { + width: 30px; + height: 30px; +} + +#unit-control-panel .ol-option-button svg { + width: 100%; + height: 100%; } #unit-control-panel .ol-option-button button.selected { - background-color: white; - border-color: white; + background-color: white; + border-color: white; } #unit-control-panel .ol-option-button button.selected svg * { - fill: var(--background-steel); - stroke: var(--background-steel); + fill: var(--background-steel); + stroke: var(--background-steel); } #rapid-controls { - display: flex; - flex-direction: column; - row-gap: 5px; - height: fit-content; - width: fit-content; + display: flex; + flex-direction: column; + row-gap: 5px; + height: fit-content; + width: fit-content; } #rapid-controls button { - padding: 4px; + padding: 4px; } #rapid-controls button.pulse { - animation: pulse 1.5s linear infinite; + animation: pulse 1.5s linear infinite; } #rapid-controls svg { - height: 20px; - width: 20px; - fill: white; - stroke: white; + height: 20px; + width: 20px; + fill: white; + stroke: white; } #rapid-controls button:before { - display: inline-block; - filter: invert(100%); - height: 20px; - width: 20px; + display: inline-block; + filter: invert(100%); + height: 20px; + width: 20px; } #unit-control-panel { @@ -109,7 +118,7 @@ body.feature-forceShowUnitControlPanel #unit-control-panel { width: fit-content; } - #unit-control-panel:not(:hover)>*:nth-child(2), + #unit-control-panel:not(:hover)>*:nth-child(2), #unit-control-panel:not(:hover)>*:nth-child(3) { display: none; } @@ -196,7 +205,7 @@ body.feature-forceShowUnitControlPanel #unit-control-panel { } #advanced-settings-dialog>.ol-dialog-content>div input[type="number"] { - width: 60px; + width: 60px; } #advanced-settings-dialog hr { @@ -266,7 +275,6 @@ body.feature-forceShowUnitControlPanel #unit-control-panel { width: 40px; } - .ol-slider-value { color: var(--accent-light-blue); cursor: pointer; @@ -276,13 +284,15 @@ body.feature-forceShowUnitControlPanel #unit-control-panel { .switch-control { align-items: center; + align-content: center; display: flex; width: 100%; justify-content: space-between; } .switch-control h4 { - margin: 0px; + margin: 0px !important; + padding: 0px; display: flex; align-items: center; } @@ -303,30 +313,30 @@ body.feature-forceShowUnitControlPanel #unit-control-panel { position: relative; } -#advanced-settings-div > button { +#advanced-settings-div>button { background-color: var(--background-grey); - box-shadow: 0px 2px 5px #000A; - font-size:13px; + box-shadow: 0px 2px 5px #000A; + font-size: 13px; height: 40px; - padding:0 20px; + padding: 0 20px; } #delete-options { - font-size:13px; + font-size: 13px; } -#delete-options.ol-select > .ol-select-value:after { +#delete-options.ol-select>.ol-select-value:after { content: ""; } -#delete-options.ol-select > .ol-select-value svg { +#delete-options.ol-select>.ol-select-value svg { background-color: transparent; position: absolute; - right:2px; - translate:0 1px; + right: 2px; + translate: 0 1px; } -#delete-options.ol-select > .ol-select-value svg * { +#delete-options.ol-select>.ol-select-value svg * { fill: var(--primary-red); } @@ -334,21 +344,21 @@ body.feature-forceShowUnitControlPanel #unit-control-panel { background-color: var(--background-steel); } -#delete-options.ol-select > .ol-select-value:hover, -#delete-options .ol-select-options > div:not(.hr):hover, -#delete-options .ol-select-options > div:not(.hr):hover button, -#delete-options .ol-select-options > div hr { +#delete-options.ol-select>.ol-select-value:hover, +#delete-options .ol-select-options>div:not(.hr):hover, +#delete-options .ol-select-options>div:not(.hr):hover button, +#delete-options .ol-select-options>div hr { background-color: var(--background-grey); } -#delete-options .ol-select-options > div:first-of-type { - margin-top:12px; - padding-top:0; +#delete-options .ol-select-options>div:first-of-type { + margin-top: 12px; + padding-top: 0; } -#delete-options .ol-select-options > div:last-of-type { - margin-bottom:12px; - padding-bottom:0; +#delete-options .ol-select-options>div:last-of-type { + margin-bottom: 12px; + padding-bottom: 0; } #delete-options button { @@ -389,4 +399,4 @@ body.feature-forceShowUnitControlPanel #unit-control-panel { #advanced-settings-dialog:not([data-show-radio]) #radio-options, #advanced-settings-dialog:not([data-show-air-unit-checkboxes]) .air-unit-checkbox { display: none; -} +} \ No newline at end of file diff --git a/client/public/stylesheets/panels/unitinfo.css b/client/public/stylesheets/panels/unitinfo.css index 3535b5b5..4a4d92f6 100644 --- a/client/public/stylesheets/panels/unitinfo.css +++ b/client/public/stylesheets/panels/unitinfo.css @@ -146,12 +146,12 @@ } #fuel-percentage::before { - content: url("/resources/theme/images/icons/fuel.svg"); + content: ""; + background-image: url("/resources/theme/images/icons/fuel.svg"); + background-size: 16px 16px; display: inline-block; filter: invert(100%); - height: 16px; margin-right: 6px; - width: 16px; } #fuel-percentage::after { diff --git a/client/public/stylesheets/style/style.css b/client/public/stylesheets/style/style.css index 8a77990d..505e662a 100644 --- a/client/public/stylesheets/style/style.css +++ b/client/public/stylesheets/style/style.css @@ -194,9 +194,17 @@ form { } .ol-select:not(.ol-select-image)>.ol-select-value:after { - content: url("/resources/theme/images/icons/chevron-down.svg"); + background-image: url("/resources/theme/images/icons/chevron-down.svg"); + content: ""; position: absolute; right: 10px; + width: 15px; + height: 15px; + background-size: 100% 100%; +} + +.ol-select:not(.ol-select-image)>.ol-select-value.ol-select-warning:after { + background-image: url("/resources/theme/images/icons/chevron-down-warning.svg") !important; } .ol-select.is-open:not(.ol-select-image)>.ol-select-value:after { @@ -430,6 +438,7 @@ nav.ol-panel> :last-child { -webkit-filter: invert(100%); height: 16px; width: 16px; + background-size: 100% 100%; } .ol-panel .ol-group-button-toggle button.off::before { @@ -1317,7 +1326,7 @@ dl.ol-data-grid dd { align-content: center; border-top: 1px solid var(--background-grey); display: flex; - justify-content: center; + justify-content: flex-end; padding-top: 15px; row-gap: 10px; } @@ -1351,6 +1360,7 @@ dl.ol-data-grid dd { height: 16px; margin-right: 10px; width: 16px; + background-size: 100% 100%; } .ol-checkbox input[type="checkbox"]:disabled:before { diff --git a/client/public/themes/olympus/images/icons/chevron-down-warning.svg b/client/public/themes/olympus/images/icons/chevron-down-warning.svg new file mode 100644 index 00000000..b919934f --- /dev/null +++ b/client/public/themes/olympus/images/icons/chevron-down-warning.svg @@ -0,0 +1,3 @@ + + + diff --git a/client/public/themes/olympus/images/parrot/parrot.png b/client/public/themes/olympus/images/parrot/parrot.png new file mode 100644 index 0000000000000000000000000000000000000000..a61beac3cd1a62211d6045a2495a4fb7c741865d GIT binary patch literal 41959 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 literal 0 HcmV?d00001 diff --git a/client/public/themes/parrot/images/parrot.svg b/client/public/themes/parrot/images/parrot.svg new file mode 100644 index 00000000..54ff6895 --- /dev/null +++ b/client/public/themes/parrot/images/parrot.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/client/public/themes/parrot/theme.css b/client/public/themes/parrot/theme.css new file mode 100644 index 00000000..7b127637 --- /dev/null +++ b/client/public/themes/parrot/theme.css @@ -0,0 +1,109 @@ +:root { + /** Colours **/ + + /*** Coalition: neutral ***/ + --primary-neutral: #949ba7; + --secondary-neutral-outline: #111111; + --secondary-neutral-text: #111111; + --unit-background-neutral: #CFD9E8; + + /*** Coalition: blue ***/ + --primary-blue: #247be2; + --secondary-blue-outline: #082e44; + --secondary-blue-text: #017DC1; + --unit-background-blue: #3BB9FF; + + /*** Coalition: red ***/ + --primary-red: #ff5858; + --secondary-red-outline: #262222; + --secondary-red-text: #D42121; + --unit-background-red: #FF5858; + + /*** UI Colours **/ + --accent-amber: #ffd828; + --accent-green: #8bff63; + --accent-light-blue: #5ca7ff; + --accent-dark-blue: #017DC1; + --transparent-accent-light-blue: rgba(92, 167, 255, .33); + --accent-light-red: #F5B6B6; + + --background-grey: #3d4651; + --background-slate-blue: #363c43; + --background-offwhite: #f2f2f3; + --background-steel: #202831; + + --secondary-dark-steel: #181e25; + --secondary-gunmetal-grey: #2f2f2f; + --secondary-lighter-grey: #949ba7; + --secondary-light-grey: #797e83; + --secondary-semitransparent-white: #FFFFFFAA; + --secondary-transparent-white: #FFFFFF30; + --secondary-yellow: #ffd46893; + + --background-hover: #f2f2f333; + + --nav-text: #ECECEC; + + --ol-select-secondary: #545F6C; + --ol-switch-off:#686868; + --ol-switch-undefined:#383838; + + /*** General border radii **/ + --border-radius-xs: 2px; + --border-radius-sm: 5px; + --border-radius-md: 10px; + --border-radius-lg: 15px; + + /*** Fonts **/ + --font-weight-bolder: 600; + + /*** Unit marker settings ***/ + /*** All markers **/ + --unit-border-radius: var(--border-radius-xs); + --unit-font-size: 14px; + --unit-font-weight: bolder; + --unit-label-border-width: 2px; + --unit-spotlight-fill: var(--secondary-yellow); + --unit-spotlight-radius: 26px; + --unit-stroke-width: 3px; + --unit-height: 50px; + --unit-width: 50px; + + --unit-health-border-width: 2px; + --unit-health-height: 6px; + --unit-health-width: 36px; + --unit-health-x: 0px; + --unit-health-y: 26px; + + /*** Air units ***/ + --unit-ammo-gap: calc(2px + var(--unit-stroke-width)); + --unit-ammo-border-radius: 50%; + --unit-ammo-border-width: 2px; + --unit-ammo-radius: 2px; + --unit-ammo-spacing: 2px; + --unit-ammo-x: 0px; + --unit-ammo-y: 30px; + --unit-fuel-border-width: 2px; + --unit-fuel-height: 6px; + --unit-fuel-width: 36px; + --unit-fuel-x: 0px; + --unit-fuel-y: 22px; + --unit-vvi-width: 4px; +} + +* { + font-weight:600; +} + +svg { + animation: spin linear infinite 1s; +} + +@keyframes spin { + from { + transform:rotate(0deg); + } + to { + transform:rotate(360deg); + } +} \ No newline at end of file diff --git a/client/routes/resources.js b/client/routes/resources.js index 308243bc..c9150dfb 100644 --- a/client/routes/resources.js +++ b/client/routes/resources.js @@ -1,11 +1,41 @@ const express = require('express'); const router = express.Router(); +const { v4: uuidv4 } = require('uuid'); + +var themesMap = {}; -// TODO should be user selectable or at least configurable from configuration file var theme = "olympus"; - router.get('/theme/*', function (req, res, next) { - res.redirect(req.url.replace("theme", "themes/" + theme)); + if (!req.cookies.id) { + const id = uuidv4(); + res.cookie('id', id, { httpOnly: true }); + themesMap[id] = "olympus"; + reqTheme = "olympus"; + } + else { + if (!(req.cookies.id in themesMap)) { + themesMap[req.cookies.id] = "olympus"; + } + reqTheme = themesMap[req.cookies.id]; + } + + /* Yes, this in an easter egg! :D Feel free to ignore it, or activate the parrot theme to check what it does */ + if (reqTheme === "parrot" && !req.url.includes(".css")) + res.redirect('/themes/parrot/images/parrot.svg'); + else + res.redirect(req.url.replace("theme", "themes/" + reqTheme)); +}); + +router.put('/theme/:newTheme', function (req, res, next) { + const newTheme = req.params.newTheme; + if (req.cookies.id) { + themesMap[req.cookies.id] = newTheme; + console.log("Theme set to " + newTheme + " for session " + req.cookies.id); + } else { + console.log("Failed to set theme to " + newTheme + ", no session id"); + } + + res.end("Ok"); }); module.exports = router; diff --git a/client/src/olympusapp.ts b/client/src/olympusapp.ts index 8f213b0f..ccafb710 100644 --- a/client/src/olympusapp.ts +++ b/client/src/olympusapp.ts @@ -53,7 +53,6 @@ export class OlympusApp { #weaponsManager: WeaponsManager | null = null; constructor() { - } // TODO add checks on null diff --git a/client/src/server/servermanager.ts b/client/src/server/servermanager.ts index 4402f2c8..1bfc9bf8 100644 --- a/client/src/server/servermanager.ts +++ b/client/src/server/servermanager.ts @@ -12,7 +12,7 @@ export class ServerManager { #connected: boolean = false; #paused: boolean = false; #REST_ADDRESS = "http://localhost:30000/olympus"; - #DEMO_ADDRESS = window.location.href + "demo"; + #DEMO_ADDRESS = window.location.href.split('?')[0] + "demo"; /* Remove query parameters */ #username = ""; #password = ""; #sessionHash: string | null = null; diff --git a/client/views/index.ejs b/client/views/index.ejs index 6856ec4e..774e38e6 100644 --- a/client/views/index.ejs +++ b/client/views/index.ejs @@ -1,5 +1,17 @@ + + Olympus client diff --git a/client/views/panels/unitcontrol.ejs b/client/views/panels/unitcontrol.ejs index 946037de..6179918a 100644 --- a/client/views/panels/unitcontrol.ejs +++ b/client/views/panels/unitcontrol.ejs @@ -112,7 +112,6 @@

Delete unit -
diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..4529edaa --- /dev/null +++ b/package-lock.json @@ -0,0 +1,24 @@ +{ + "name": "DCSOlympus", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "uuid": "^9.0.1" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..7c18dc8f --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "uuid": "^9.0.1" + } +}