Initial commit

This commit is contained in:
2025-10-22 22:06:16 +02:00
commit d8ca4e154f
141 changed files with 32231 additions and 0 deletions

113
frontend/views/dashboard/dist/artNet.js vendored Normal file
View File

@@ -0,0 +1,113 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ArtNet = void 0;
var morphux_1 = require("morphux");
var ArtNet = /** @class */ (function () {
function ArtNet(Main) {
this.universesContainer = document.querySelector('.ntsh_artnet-universes');
this.stateContainer = document.querySelector('.ntsh_artnet-state');
this._Main = Main;
this.prepareUniverses();
this.setupHandler();
}
ArtNet.prototype.prepareUniverses = function () {
return __awaiter(this, void 0, void 0, function () {
var request, universes;
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, fetch('/universes')];
case 1:
request = _a.sent();
return [4 /*yield*/, request.json()];
case 2:
universes = _a.sent();
universes.forEach(function (universe) {
var button = new morphux_1.MorphComponent.Button({
mode: 'normal',
content: String(universe),
target: function () {
_this.universesContainer
.querySelectorAll('.mux_button')
.forEach(function (btn) { return btn.classList.remove('ntsh_active'); });
button.container.classList.add('ntsh_active');
_this.showFrame(universe);
},
});
_this.universesContainer.appendChild(button.container);
});
return [2 /*return*/];
}
});
});
};
ArtNet.prototype.showFrame = function (universe) {
this.frame = (0, morphux_1.ce)('iframe', null, { src: "/universe/".concat(universe) });
this.stateContainer.innerHTML = '';
this.stateContainer.appendChild(this.frame);
this.currentUniverse = universe;
this.setupRefreshClock();
};
ArtNet.prototype.setupRefreshClock = function () {
var _this = this;
clearInterval(this.refreshClock);
this.refreshClock = setInterval(function () {
_this.frame.src = "/universe/".concat(_this.currentUniverse);
}, 1000);
};
ArtNet.prototype.setupHandler = function () {
var _this = this;
this._Main.TabController.registerListener('artnet', function (visible) {
var _a;
if (visible) {
_this.universesContainer
.querySelectorAll('.mux_button')
.forEach(function (btn) { return btn.classList.remove('ntsh_active'); });
}
else {
if (((_a = _this.frame) === null || _a === void 0 ? void 0 : _a.parentElement) != null)
_this.frame.remove();
clearInterval(_this.refreshClock);
}
});
};
return ArtNet;
}());
exports.ArtNet = ArtNet;
//# sourceMappingURL=artNet.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"artNet.js","sourceRoot":"","sources":["../ts/artNet.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,37 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Calibration = void 0;
var Calibration = /** @class */ (function () {
function Calibration(Main) {
this.container = document.querySelector('.ntsh_calibration');
this.image = this.container.querySelector('img');
this.fullscreenButton = this.container.querySelector('.ntsh_calibration-fullscreen');
this._Main = Main;
this.registerListeners();
}
Calibration.prototype.startFetchClock = function () {
var _this = this;
this.image.src = "/calibrationImage?t=".concat(Date.now());
this.fetchClock = setInterval(function () {
_this.image.src = "/calibrationImage?t=".concat(Date.now());
}, 1000);
};
Calibration.prototype.stopFetchClock = function () {
clearInterval(this.fetchClock);
};
Calibration.prototype.registerListeners = function () {
var _this = this;
this._Main.TabController.registerListener('calibration', function (visible) {
if (visible)
_this.startFetchClock();
else
_this.stopFetchClock();
});
this.fullscreenButton.addEventListener('click', function () {
_this.image.requestFullscreen();
});
};
return Calibration;
}());
exports.Calibration = Calibration;
//# sourceMappingURL=calibration.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"calibration.js","sourceRoot":"","sources":["../ts/calibration.ts"],"names":[],"mappings":";;;AAEA;IASC,qBAAY,IAAU;QANtB,cAAS,GAAmB,QAAQ,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;QACxE,UAAK,GAAqB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9D,qBAAgB,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC9D,8BAA8B,CAC9B,CAAC;QAGD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC1B,CAAC;IAGD,qCAAe,GAAf;QAAA,iBAKC;QAJA,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,8BAAuB,IAAI,CAAC,GAAG,EAAE,CAAE,CAAC;QACrD,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC;YAC7B,KAAI,CAAC,KAAK,CAAC,GAAG,GAAG,8BAAuB,IAAI,CAAC,GAAG,EAAE,CAAE,CAAC;QACtD,CAAC,EAAE,IAAI,CAAC,CAAC;IACV,CAAC;IAED,oCAAc,GAAd;QACC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAEO,uCAAiB,GAAzB;QAAA,iBASC;QARA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,aAAa,EAAE,UAAC,OAAO;YAChE,IAAI,OAAO;gBAAE,KAAI,CAAC,eAAe,EAAE,CAAC;;gBAC/B,KAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,OAAO,EAAE;YAC/C,KAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IACJ,CAAC;IACF,kBAAC;AAAD,CAAC,AArCD,IAqCC;AArCY,kCAAW"}

View File

@@ -0,0 +1,161 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DashboardCameraRunner = void 0;
var morphux_1 = require("morphux");
var utils_1 = require("./utils");
var CELCIUS = 'ºC';
var DashboardCameraRunner = /** @class */ (function () {
function DashboardCameraRunner(Main) {
this.container = document.querySelector('.ntsh_dashboard-camerarunner');
this.connectionStatus = this.container.querySelector('.ntsh_dashboard-camerarunner-connectionstatus');
this.connectionInfo = this.container.querySelector('.ntsh_dashboard-camerarunner-connectioninfo');
this.rebootButton = this.container.querySelector('.ntsh_dashboard-camerarunner-reboot');
this.processStatus = this.container.querySelector('.ntsh_dashboard-camerarunner-processstatus');
this.processInfo = this.container.querySelector('.ntsh_dashboard-camerarunner-processinfo');
this.restartButton = this.container.querySelector('.ntsh_dashboard-camerarunner-restart');
this.uptimeInfo = this.container.querySelector('.ntsh_dashboard-camerarunner-uptime');
this.errorContainer = this.container.querySelector('.ntsh_dashboard-camerarunner-error');
this.errorText = this.container.querySelector('.ntsh_dashboard-camerarunner-errortext');
this._Main = Main;
this.registerListeners();
}
DashboardCameraRunner.prototype.updateState = function (state) {
var _a, _b, _c;
// ----------- Connection -----------
(0, utils_1.setStatusState)(this.connectionStatus, {
CONNECTING: 'yellow',
CONNECTED: 'green',
DISCONNECTED: 'gray',
FAILED: 'red',
}[state.state]);
this.connectionInfo.innerText = (_a = state.message) !== null && _a !== void 0 ? _a : '';
// ----------- Process -----------
if (state.state != 'CONNECTED') {
state.processStatus.state = 'PROBLEM';
state.processStatus.message = 'Not connected to CameraRunner';
state.processStatus.startTime = -1;
this.restartButton.style.display = 'none';
this.rebootButton.style.display = 'none';
}
else {
this.rebootButton.style.display = 'flex';
if (state.processStatus.state == 'RUNNING')
this.restartButton.style.display = 'flex';
else
this.restartButton.style.display = 'none';
}
(0, utils_1.setStatusState)(this.processStatus, {
RUNNING: 'green',
STOPPED: 'gray',
STARTING: 'yellow',
PROBLEM: 'red',
}[state.processStatus.state]);
this.processInfo.innerText = (_b = state.processStatus.message) !== null && _b !== void 0 ? _b : '';
// ----------- Uptime -----------
var uptimeSeconds = state.processStatus.startTime == -1
? -1
: (Date.now() - state.processStatus.startTime) / 1000;
this.uptimeInfo.innerText = (0, utils_1.formatUptime)(uptimeSeconds);
// ----------- Error -----------
if (((_c = state === null || state === void 0 ? void 0 : state.error) !== null && _c !== void 0 ? _c : '').trim().length > 0) {
this.errorText.innerText = state.error;
this.errorContainer.style.display = 'block';
}
else {
this.errorContainer.style.display = 'none';
this.errorText.innerText = '';
}
this._Main.Logs.setCameraLogs(state.processStatus.output.current);
};
DashboardCameraRunner.prototype.registerListeners = function () {
var _this = this;
this._Main.socket.on('cameraRunnerState', function (state) {
_this.updateState(state);
});
this.restartButton.addEventListener('click', function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
this.executeCommand('restart', 'Are you sure you want to restart the Camera Runner process?');
return [2 /*return*/];
});
}); });
this.rebootButton.addEventListener('click', function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
this.executeCommand('reboot', 'Are you sure you want to reboot the Camera Runner machine?');
return [2 /*return*/];
});
}); });
};
DashboardCameraRunner.prototype.executeCommand = function (command, message) {
return __awaiter(this, void 0, void 0, function () {
var confirmed;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, morphux_1.MorphFeature.Confirm({
title: 'Are you sure?',
message: message,
})];
case 1:
confirmed = _a.sent();
if (!confirmed)
return [2 /*return*/];
morphux_1.MorphFeature.Loader({
active: true,
message: "Requesting Camera Runner ".concat(command, "..."),
});
this._Main.socket.emit('cameraRunner', command, function (response) {
morphux_1.MorphFeature.Loader({ active: false });
if (!response.succeed)
return morphux_1.MorphFeature.Alert({
title: 'Error',
message: response.message,
});
morphux_1.MorphFeature.Notification({
level: 'success',
message: "Camera Runner is ".concat(command, "ing..."),
});
});
return [2 /*return*/];
}
});
});
};
return DashboardCameraRunner;
}());
exports.DashboardCameraRunner = DashboardCameraRunner;
//# sourceMappingURL=dashboard.camerarunner%20copy.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"dashboard.camerarunner copy.js","sourceRoot":"","sources":["../ts/dashboard.camerarunner copy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAuC;AAEvC,iCAKiB;AAEjB,IAAM,OAAO,GAAG,IAAI,CAAC;AAErB;IAsCC,+BAAY,IAAU;QAnCtB,cAAS,GAAmB,QAAQ,CAAC,aAAa,CACjD,4BAA4B,CAC5B,CAAC;QAEF,qBAAgB,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC9D,6CAA6C,CAC7C,CAAC;QACF,mBAAc,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC5D,2CAA2C,CAC3C,CAAC;QACF,iBAAY,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC1D,mCAAmC,CACnC,CAAC;QAEF,kBAAa,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC3D,0CAA0C,CAC1C,CAAC;QACF,gBAAW,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CACzD,wCAAwC,CACxC,CAAC;QACF,kBAAa,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC3D,oCAAoC,CACpC,CAAC;QAEF,eAAU,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CACxD,mCAAmC,CACnC,CAAC;QAEF,mBAAc,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC5D,kCAAkC,CAClC,CAAC;QACF,cAAS,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CACvD,sCAAsC,CACtC,CAAC;QAGD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC1B,CAAC;IAED,2CAAW,GAAX,UAAY,KAAyB;;QACpC,qCAAqC;QACrC,IAAA,sBAAc,EACb,IAAI,CAAC,gBAAgB,EACrB;YACC,UAAU,EAAE,QAAQ;YACpB,SAAS,EAAE,OAAO;YAClB,YAAY,EAAE,MAAM;YACpB,MAAM,EAAE,KAAK;SACb,CAAC,KAAK,CAAC,KAAK,CAAe,CAC5B,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,MAAA,KAAK,CAAC,OAAO,mCAAI,EAAE,CAAC;QAEpD,kCAAkC;QAClC,IAAI,KAAK,CAAC,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,KAAK,CAAC,aAAa,CAAC,KAAK,GAAG,SAAS,CAAC;YACtC,KAAK,CAAC,aAAa,CAAC,OAAO,GAAG,+BAA+B,CAAC;YAC9D,KAAK,CAAC,aAAa,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YAEnC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YAC1C,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QAC1C,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YAEzC,IAAI,KAAK,CAAC,aAAa,CAAC,KAAK,IAAI,SAAS;gBACzC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;;gBACtC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QAChD,CAAC;QAED,IAAA,sBAAc,EACb,IAAI,CAAC,aAAa,EAClB;YACC,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,KAAK;SACd,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAe,CAC1C,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,MAAA,KAAK,CAAC,aAAa,CAAC,OAAO,mCAAI,EAAE,CAAC;QAE/D,iCAAiC;QACjC,IAAM,aAAa,GAClB,KAAK,CAAC,aAAa,CAAC,SAAS,IAAI,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QACxD,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,IAAA,oBAAY,EAAC,aAAa,CAAC,CAAC;QAExD,gCAAgC;QAChC,IAAI,CAAC,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;YACvC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QAC7C,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YAC3C,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnE,CAAC;IAED,iDAAiB,GAAjB;QAAA,iBAqBC;QApBA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CACnB,mBAAmB,EACnB,UAAC,KAAyB;YACzB,KAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CACD,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE;;gBAC5C,IAAI,CAAC,cAAc,CAClB,SAAS,EACT,6DAA6D,CAC7D,CAAC;;;aACF,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE;;gBAC3C,IAAI,CAAC,cAAc,CAClB,QAAQ,EACR,4DAA4D,CAC5D,CAAC;;;aACF,CAAC,CAAC;IACJ,CAAC;IAEa,8CAAc,GAA5B,UAA6B,OAAe,EAAE,OAAe;;;;;4BAC1C,qBAAM,sBAAY,CAAC,OAAO,CAAC;4BAC5C,KAAK,EAAE,eAAe;4BACtB,OAAO,SAAA;yBACP,CAAC,EAAA;;wBAHI,SAAS,GAAG,SAGhB;wBACF,IAAI,CAAC,SAAS;4BAAE,sBAAO;wBAEvB,sBAAY,CAAC,MAAM,CAAC;4BACnB,MAAM,EAAE,IAAI;4BACZ,OAAO,EAAE,mCAA4B,OAAO,QAAK;yBACjD,CAAC,CAAC;wBACH,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CACrB,cAAc,EACd,OAAO,EACP,UAAC,QAAgD;4BAChD,sBAAY,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;4BAEvC,IAAI,CAAC,QAAQ,CAAC,OAAO;gCACpB,OAAO,sBAAY,CAAC,KAAK,CAAC;oCACzB,KAAK,EAAE,OAAO;oCACd,OAAO,EAAE,QAAQ,CAAC,OAAO;iCACzB,CAAC,CAAC;4BAEJ,sBAAY,CAAC,YAAY,CAAC;gCACzB,KAAK,EAAE,SAAS;gCAChB,OAAO,EAAE,2BAAoB,OAAO,WAAQ;6BAC5C,CAAC,CAAC;wBACJ,CAAC,CACD,CAAC;;;;;KACF;IACF,4BAAC;AAAD,CAAC,AA5JD,IA4JC;AA5JY,sDAAqB"}

View File

@@ -0,0 +1,166 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DashboardCameraRunner = void 0;
var morphux_1 = require("morphux");
var utils_1 = require("./utils");
var CELCIUS = 'ºC';
var DashboardCameraRunner = /** @class */ (function () {
function DashboardCameraRunner(Main) {
this.container = document.querySelector('.ntsh_dashboard-camerarunner');
this.connectionStatus = this.container.querySelector('.ntsh_dashboard-camerarunner-connectionstatus');
this.connectionInfo = this.container.querySelector('.ntsh_dashboard-camerarunner-connectioninfo');
this.rebootButton = this.container.querySelector('.ntsh_dashboard-camerarunner-reboot');
this.processStatus = this.container.querySelector('.ntsh_dashboard-camerarunner-processstatus');
this.processInfo = this.container.querySelector('.ntsh_dashboard-camerarunner-processinfo');
this.restartButton = this.container.querySelector('.ntsh_dashboard-camerarunner-restart');
this.uptimeInfo = this.container.querySelector('.ntsh_dashboard-camerarunner-uptime');
this.errorContainer = this.container.querySelector('.ntsh_dashboard-camerarunner-error');
this.errorText = this.container.querySelector('.ntsh_dashboard-camerarunner-errortext');
this._Main = Main;
this.registerListeners();
}
DashboardCameraRunner.prototype.updateState = function (state) {
var _a, _b, _c, _d, _e;
// ----------- Connection -----------
(0, utils_1.setStatusState)(this.connectionStatus, {
CONNECTING: 'yellow',
CONNECTED: 'green',
DISCONNECTED: 'red',
FAILED: 'red',
}[state.state]);
this.connectionInfo.innerText = (_a = state.message) !== null && _a !== void 0 ? _a : '';
// ----------- Process -----------
if (state.state != 'CONNECTED') {
state.processStatus.state = 'STOPPED';
state.processStatus.message = 'Not connected';
state.processStatus.startTime = -1;
this.restartButton.style.display = 'none';
this.rebootButton.style.display = 'none';
}
else {
this.rebootButton.style.display = 'flex';
if (state.processStatus.state == 'RUNNING')
this.restartButton.style.display = 'flex';
else
this.restartButton.style.display = 'none';
}
(0, utils_1.setStatusState)(this.processStatus, {
RUNNING: 'green',
STOPPED: 'gray',
STARTING: 'yellow',
PROBLEM: 'red',
}[state.processStatus.state]);
this.processInfo.innerText = (_b = state.processStatus.message) !== null && _b !== void 0 ? _b : '';
// ----------- Uptime -----------
var uptimeSeconds = state.processStatus.startTime == -1
? -1
: (Date.now() - state.processStatus.startTime) / 1000;
this.uptimeInfo.innerText = (0, utils_1.formatUptime)(uptimeSeconds);
// ----------- Error -----------
var errors = [];
if (((_c = state === null || state === void 0 ? void 0 : state.error) !== null && _c !== void 0 ? _c : '').trim().length > 0)
errors.push(state.error);
if (((_e = (_d = state === null || state === void 0 ? void 0 : state.processStatus) === null || _d === void 0 ? void 0 : _d.error) !== null && _e !== void 0 ? _e : '').trim().length > 0)
errors.push(state.processStatus.error);
if (errors.length > 0) {
this.errorText.innerText = errors.join('\n');
this.errorContainer.style.display = 'block';
}
else {
this.errorContainer.style.display = 'none';
this.errorText.innerText = '';
}
this._Main.Logs.setCameraLogs(state.processStatus.output.current);
};
DashboardCameraRunner.prototype.registerListeners = function () {
var _this = this;
this._Main.socket.on('cameraRunnerState', function (state) {
_this.updateState(state);
});
this.restartButton.addEventListener('click', function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
this.executeCommand('restart', 'Are you sure you want to restart the Camera Runner process?');
return [2 /*return*/];
});
}); });
this.rebootButton.addEventListener('click', function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
this.executeCommand('reboot', 'Are you sure you want to reboot the Camera Runner machine?');
return [2 /*return*/];
});
}); });
};
DashboardCameraRunner.prototype.executeCommand = function (command, message) {
return __awaiter(this, void 0, void 0, function () {
var confirmed;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, morphux_1.MorphFeature.Confirm({
title: 'Are you sure?',
message: message,
})];
case 1:
confirmed = _a.sent();
if (!confirmed)
return [2 /*return*/];
morphux_1.MorphFeature.Loader({
active: true,
message: "Requesting Camera Runner ".concat(command, "..."),
});
this._Main.socket.emit('cameraRunner', command, function (response) {
morphux_1.MorphFeature.Loader({ active: false });
if (!response.succeed)
return morphux_1.MorphFeature.Alert({
title: 'Error',
message: response.message,
});
morphux_1.MorphFeature.Notification({
level: 'success',
message: "Camera Runner is ".concat(command, "ing..."),
});
});
return [2 /*return*/];
}
});
});
};
return DashboardCameraRunner;
}());
exports.DashboardCameraRunner = DashboardCameraRunner;
//# sourceMappingURL=dashboard.camerarunner.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"dashboard.camerarunner.js","sourceRoot":"","sources":["../ts/dashboard.camerarunner.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,41 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DashboardCameraRunner = void 0;
var CELCIUS = 'ºC';
var DashboardCameraRunner = /** @class */ (function () {
function DashboardCameraRunner(Main) {
this.container = document.querySelector('.ntsh_dashboard-camerarunner');
this.connectionStatus = this.container.querySelector('.ntsh_dashboard-camerarunner-connectedstatus');
this.connectionInfo = this.container.querySelector('.ntsh_dashboard-camerarunner-connectedinfo');
this.processStatus = this.container.querySelector('.ntsh_dashboard-camerarunner-processstatus');
this.processInfo = this.container.querySelector('.ntsh_dashboard-camerarunner-processinfo');
this.restartButton = this.container.querySelector('.ntsh_dashboard-camerarunner-restart');
this.uptimeInfo = this.container.querySelector('.ntsh_dashboard-camerarunner-uptimeinfo');
this.errorContainer = this.container.querySelector('.ntsh_dashboard-camerarunner-error');
this.errorText = this.container.querySelector('.ntsh_dashboard-camerarunner-errortext');
this._Main = Main;
this.registerListeners();
}
DashboardCameraRunner.prototype.updateState = function (state) {
var _a;
console.log(state);
// ----------- Error -----------
if (((_a = state === null || state === void 0 ? void 0 : state.error) !== null && _a !== void 0 ? _a : '').trim().length > 0) {
this.errorText.innerText = state.error;
this.errorContainer.style.display = 'block';
}
else {
this.errorContainer.style.display = 'none';
this.errorText.innerText = '';
}
};
DashboardCameraRunner.prototype.registerListeners = function () {
var _this = this;
this._Main.socket.on('ledControllerState', function (state) {
_this.updateState(state);
});
};
return DashboardCameraRunner;
}());
exports.DashboardCameraRunner = DashboardCameraRunner;
//# sourceMappingURL=dashboard.ledcontroller.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"dashboard.ledcontroller.js","sourceRoot":"","sources":["../ts/dashboard.ledcontroller.ts"],"names":[],"mappings":";;;AAIA,IAAM,OAAO,GAAG,IAAI,CAAC;AAErB;IAmCC,+BAAY,IAAU;QAhCtB,cAAS,GAAmB,QAAQ,CAAC,aAAa,CACjD,8BAA8B,CAC9B,CAAC;QAEF,qBAAgB,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC9D,8CAA8C,CAC9C,CAAC;QACF,mBAAc,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC5D,4CAA4C,CAC5C,CAAC;QAEF,kBAAa,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC3D,4CAA4C,CAC5C,CAAC;QACF,gBAAW,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CACzD,0CAA0C,CAC1C,CAAC;QACF,kBAAa,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC3D,sCAAsC,CACtC,CAAC;QAEF,eAAU,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CACxD,yCAAyC,CACzC,CAAC;QAEF,mBAAc,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC5D,oCAAoC,CACpC,CAAC;QACF,cAAS,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CACvD,wCAAwC,CACxC,CAAC;QAGD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC1B,CAAC;IAED,2CAAW,GAAX,UAAY,KAAyB;;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,gCAAgC;QAChC,IAAI,CAAC,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;YACvC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QAC7C,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YAC3C,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC;QAC/B,CAAC;IACF,CAAC;IAED,iDAAiB,GAAjB;QAAA,iBAOC;QANA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CACnB,oBAAoB,EACpB,UAAC,KAAyB;YACzB,KAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CACD,CAAC;IACH,CAAC;IACF,4BAAC;AAAD,CAAC,AA7DD,IA6DC;AA7DY,sDAAqB"}

View File

@@ -0,0 +1,50 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DashboardMMWave = void 0;
var utils_1 = require("./utils");
var CELCIUS = 'ºC';
var DashboardMMWave = /** @class */ (function () {
function DashboardMMWave(Main) {
this.container = document.querySelector('.ntsh_dashboard-mmwave');
this.standardPortStatus = this.container.querySelector('.ntsh_dashboard-mmwave-standardstatus');
this.standardPortInfo = this.container.querySelector('.ntsh_dashboard-mmwave-standardinfo');
this.enhancedPortStatus = this.container.querySelector('.ntsh_dashboard-mmwave-enhancedstatus');
this.enhancedPortInfo = this.container.querySelector('.ntsh_dashboard-mmwave-enhancedinfo');
this.framesPerSecond = this.container.querySelector('.ntsh_dashboard-mmwave-framespersecond');
this.trackedPersons = this.container.querySelector('.ntsh_dashboard-mmwave-trackedpersons');
this.personsInBounds = this.container.querySelector('.ntsh_dashboard-mmwave-personsinbounds');
this._Main = Main;
this.registerListeners();
}
DashboardMMWave.prototype.updateState = function (state) {
if (state == null)
return;
// ----------- Standard Port -----------
(0, utils_1.setStatusState)(this.standardPortStatus, state.ports.standard.connected == 'connecting'
? 'warning'
: state.ports.standard.connected
? 'ok'
: 'error');
this.standardPortInfo.innerText = state.ports.standard.path;
// ----------- Enhanced Port -----------
(0, utils_1.setStatusState)(this.enhancedPortStatus, state.ports.enhanced.connected == 'connecting'
? 'warning'
: state.ports.enhanced.connected
? 'ok'
: 'error');
this.enhancedPortInfo.innerText = state.ports.enhanced.path;
// ----------- Statistics -----------
this.framesPerSecond.innerText = state.framesPerSecond.toString();
this.trackedPersons.innerText = state.trackedPersons.toString();
this.personsInBounds.innerText = state.personsInBounds.toString();
};
DashboardMMWave.prototype.registerListeners = function () {
var _this = this;
this._Main.socket.on('mmWaveState', function (state) {
_this.updateState(state);
});
};
return DashboardMMWave;
}());
exports.DashboardMMWave = DashboardMMWave;
//# sourceMappingURL=dashboard.mmwave%20copy.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"dashboard.mmwave copy.js","sourceRoot":"","sources":["../ts/dashboard.mmwave copy.ts"],"names":[],"mappings":";;;AAEA,iCAAyC;AAEzC,IAAM,OAAO,GAAG,IAAI,CAAC;AAErB;IA+BC,yBAAY,IAAU;QA5BtB,cAAS,GAAmB,QAAQ,CAAC,aAAa,CACjD,wBAAwB,CACxB,CAAC;QAEF,uBAAkB,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAChE,uCAAuC,CACvC,CAAC;QACF,qBAAgB,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC9D,qCAAqC,CACrC,CAAC;QAEF,uBAAkB,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAChE,uCAAuC,CACvC,CAAC;QACF,qBAAgB,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC9D,qCAAqC,CACrC,CAAC;QAEF,oBAAe,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC7D,wCAAwC,CACxC,CAAC;QACF,mBAAc,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC5D,uCAAuC,CACvC,CAAC;QACF,oBAAe,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC7D,wCAAwC,CACxC,CAAC;QAGD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC1B,CAAC;IAED,qCAAW,GAAX,UAAY,KAAkB;QAC7B,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO;QAE1B,wCAAwC;QACxC,IAAA,sBAAc,EACb,IAAI,CAAC,kBAAkB,EACvB,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,IAAI,YAAY;YAC7C,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS;gBAChC,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,OAAO,CACV,CAAC;QACF,IAAI,CAAC,gBAAgB,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAE5D,wCAAwC;QACxC,IAAA,sBAAc,EACb,IAAI,CAAC,kBAAkB,EACvB,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,IAAI,YAAY;YAC7C,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS;gBAChC,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,OAAO,CACV,CAAC;QACF,IAAI,CAAC,gBAAgB,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAE5D,qCAAqC;QACrC,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,KAAK,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;QAClE,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;QAChE,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,KAAK,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;IACnE,CAAC;IAED,2CAAiB,GAAjB;QAAA,iBAIC;QAHA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,UAAC,KAAkB;YACtD,KAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACJ,CAAC;IACF,sBAAC;AAAD,CAAC,AAzED,IAyEC;AAzEY,0CAAe"}

View File

@@ -0,0 +1,60 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DashboardMMWave = void 0;
var utils_1 = require("./utils");
var CELCIUS = 'ºC';
var DashboardMMWave = /** @class */ (function () {
function DashboardMMWave(Main) {
this.container = document.querySelector('.ntsh_dashboard-mmwave');
this.standardPortStatus = this.container.querySelector('.ntsh_dashboard-mmwave-standardstatus');
this.standardPortInfo = this.container.querySelector('.ntsh_dashboard-mmwave-standardinfo');
this.enhancedPortStatus = this.container.querySelector('.ntsh_dashboard-mmwave-enhancedstatus');
this.enhancedPortInfo = this.container.querySelector('.ntsh_dashboard-mmwave-enhancedinfo');
this.framesPerSecond = this.container.querySelector('.ntsh_dashboard-mmwave-framespersecond');
this.trackedPersons = this.container.querySelector('.ntsh_dashboard-mmwave-trackedpersons');
this.personsInBounds = this.container.querySelector('.ntsh_dashboard-mmwave-personsinbounds');
this.errorContainer = this.container.querySelector('.ntsh_dashboard-mmwave-error');
this.errorText = this.container.querySelector('.ntsh_dashboard-mmwave-errortext');
this._Main = Main;
this.registerListeners();
}
DashboardMMWave.prototype.updateState = function (state) {
var _a;
if (state == null)
return;
var statusColors = {
CONNECTED: 'green',
DISCONNECTED: 'gray',
CONNECTING: 'yellow',
PROBLEM: 'red',
};
// ----------- Standard Port -----------
(0, utils_1.setStatusState)(this.standardPortStatus, statusColors[state.ports.standard.connected]);
this.standardPortInfo.innerText = state.ports.standard.info;
// ----------- Enhanced Port -----------
(0, utils_1.setStatusState)(this.enhancedPortStatus, statusColors[state.ports.enhanced.connected]);
this.enhancedPortInfo.innerText = state.ports.enhanced.info;
// ----------- Statistics -----------
this.framesPerSecond.innerText = state.framesPerSecond.toString();
this.trackedPersons.innerText = state.trackedPersons.toString();
this.personsInBounds.innerText = state.personsInBounds.toString();
// ----------- Error -----------
if (((_a = state === null || state === void 0 ? void 0 : state.error) !== null && _a !== void 0 ? _a : '').trim().length > 0) {
this.errorText.innerText = state.error;
this.errorContainer.style.display = 'block';
}
else {
this.errorContainer.style.display = 'none';
this.errorText.innerText = '';
}
};
DashboardMMWave.prototype.registerListeners = function () {
var _this = this;
this._Main.socket.on('mmWaveState', function (state) {
_this.updateState(state);
});
};
return DashboardMMWave;
}());
exports.DashboardMMWave = DashboardMMWave;
//# sourceMappingURL=dashboard.mmwave.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"dashboard.mmwave.js","sourceRoot":"","sources":["../ts/dashboard.mmwave.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,149 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DashboardProjector = void 0;
var morphux_1 = require("morphux");
var utils_1 = require("./utils");
var CELCIUS = 'ºC';
var DashboardProjector = /** @class */ (function () {
function DashboardProjector(Main) {
this.container = document.querySelector('.ntsh_dashboard-projector');
this.powerStatus = this.container.querySelector('.ntsh_dashboard-projector-powerstatus');
this.powerInfo = this.container.querySelector('.ntsh_dashboard-projector-powerinfo');
this.powerOnButton = this.container.querySelector('.ntsh_dashboard-projector-poweron');
this.powerOffButton = this.container.querySelector('.ntsh_dashboard-projector-poweroff');
this.laserStatus = this.container.querySelector('.ntsh_dashboard-projector-laserstatus');
this.laserInfo = this.container.querySelector('.ntsh_dashboard-projector-laserinfo');
this.shutterOpenButton = this.container.querySelector('.ntsh_dashboard-projector-shutteropen');
this.shutterCloseButton = this.container.querySelector('.ntsh_dashboard-projector-shutterclose');
this.sourceStatus = this.container.querySelector('.ntsh_dashboard-projector-sourcestatus');
this.sourceInfo = this.container.querySelector('.ntsh_dashboard-projector-sourceinfo');
this.sourceHDMIButton = this.container.querySelector('.ntsh_dashboard-projector-sourcehdmi');
this.sourceDVIDButton = this.container.querySelector('.ntsh_dashboard-projector-sourcedvid');
this.sourceDisplayPortButton = this.container.querySelector('.ntsh_dashboard-projector-sourcedisplayport');
this.sourceSDIButton = this.container.querySelector('.ntsh_dashboard-projector-sourcesdi');
this.temperatureIntake = this.container.querySelector('.ntsh_dashboard-projector-temperature-temperatureintake');
this.temmperatureLaser = this.container.querySelector('.ntsh_dashboard-projector-temperature-temperaturelaser');
this.temperatureDMD = this.container.querySelector('.ntsh_dashboard-projector-temperature-temperaturedmd');
this.errorContainer = this.container.querySelector('.ntsh_dashboard-projector-error');
this.errorText = this.container.querySelector('.ntsh_dashboard-projector-errortext');
this._Main = Main;
this.registerListeners();
}
DashboardProjector.prototype.updateState = function (state) {
if (state == null)
return;
// ----------- Power -----------
(0, utils_1.setStatusState)(this.powerStatus, state.Powermd == 'Power On' ? 'ok' : 'error');
this.powerInfo.innerText = state.Powermd;
this.powerOnButton.style.display =
state.Powermd == 'Power On' ? 'none' : 'flex';
this.powerOffButton.style.display =
state.Powermd == 'Power On' ? 'flex' : 'none';
// ----------- Laser -----------
(0, utils_1.setStatusState)(this.laserStatus, state.LaserStatus == 'On' ? 'ok' : 'error');
this.laserInfo.innerText = "".concat(state.LaserStatus, " (").concat(state.Laserhr, " hrs)");
this.shutterOpenButton.style.display =
state.LaserStatus == 'On' ? 'none' : 'flex';
this.shutterCloseButton.style.display =
state.LaserStatus == 'On' ? 'flex' : 'none';
// ----------- Source -----------
(0, utils_1.setStatusState)(this.sourceStatus, state.Sourcemd == 'No Source' ? 'error' : 'ok');
this.sourceInfo.innerText = state.Sourcemd;
this.sourceHDMIButton.style.display =
state.Sourcemd == 'HDMI' ? 'none' : 'flex';
this.sourceDVIDButton.style.display =
state.Sourcemd == 'DVI-D' ? 'none' : 'flex';
this.sourceDisplayPortButton.style.display =
state.Sourcemd == 'DisplayPort' ? 'none' : 'flex';
this.sourceSDIButton.style.display =
state.Sourcemd == '3G-SDI' ? 'none' : 'flex';
// ----------- Temperature -----------
this.temperatureIntake.innerText = "".concat(state.IntakeTempDeg, " ").concat(CELCIUS);
this.temmperatureLaser.innerText = "".concat(state.LaserTempDeg, " ").concat(CELCIUS);
this.temperatureDMD.innerText = "".concat(state.DMDTempDeg, " ").concat(CELCIUS);
};
DashboardProjector.prototype.registerListeners = function () {
var _this = this;
this._Main.socket.on('projectorState', function (state) {
_this.updateState(state);
});
this.powerOnButton.onclick = function () {
_this._Main.socket.emit('projectorCommand', 'powerOn');
};
this.powerOffButton.onclick = function () {
return __awaiter(_this, void 0, void 0, function () {
var confirmed;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, morphux_1.MorphFeature.Confirm({
message: 'Are you sure you want to power on the projector?',
})];
case 1:
confirmed = _a.sent();
if (!confirmed)
return [2 /*return*/];
this._Main.socket.emit('projectorCommand', 'powerOff');
return [2 /*return*/];
}
});
});
};
this.shutterOpenButton.onclick = function () {
_this._Main.socket.emit('projectorCommand', 'shutterOpen');
};
this.shutterCloseButton.onclick = function () {
_this._Main.socket.emit('projectorCommand', 'shutterClose');
};
this.sourceHDMIButton.onclick = function () {
_this._Main.socket.emit('projectorCommand', 'source', 'HDMI');
};
this.sourceDVIDButton.onclick = function () {
_this._Main.socket.emit('projectorCommand', 'source', 'DVI-D');
};
this.sourceDisplayPortButton.onclick = function () {
_this._Main.socket.emit('projectorCommand', 'source', 'DisplayPort');
};
this.sourceSDIButton.onclick = function () {
_this._Main.socket.emit('projectorCommand', 'source', '3G-SDI');
};
};
return DashboardProjector;
}());
exports.DashboardProjector = DashboardProjector;
//# sourceMappingURL=dashboard.projector%20copy.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"dashboard.projector copy.js","sourceRoot":"","sources":["../ts/dashboard.projector copy.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,182 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DashboardProjector = void 0;
var morphux_1 = require("morphux");
var utils_1 = require("./utils");
var CELCIUS = 'ºC';
var DashboardProjector = /** @class */ (function () {
function DashboardProjector(Main) {
this.container = document.querySelector('.ntsh_dashboard-projector');
this.powerStatus = this.container.querySelector('.ntsh_dashboard-projector-powerstatus');
this.powerInfo = this.container.querySelector('.ntsh_dashboard-projector-powerinfo');
this.powerOnButton = this.container.querySelector('.ntsh_dashboard-projector-poweron');
this.powerOffButton = this.container.querySelector('.ntsh_dashboard-projector-poweroff');
this.laserStatus = this.container.querySelector('.ntsh_dashboard-projector-laserstatus');
this.laserInfo = this.container.querySelector('.ntsh_dashboard-projector-laserinfo');
this.shutterOpenButton = this.container.querySelector('.ntsh_dashboard-projector-shutteropen');
this.shutterCloseButton = this.container.querySelector('.ntsh_dashboard-projector-shutterclose');
this.sourceStatus = this.container.querySelector('.ntsh_dashboard-projector-sourcestatus');
this.sourceInfo = this.container.querySelector('.ntsh_dashboard-projector-sourceinfo');
this.sourceHDMIButton = this.container.querySelector('.ntsh_dashboard-projector-sourcehdmi');
this.sourceDVIDButton = this.container.querySelector('.ntsh_dashboard-projector-sourcedvid');
this.sourceDisplayPortButton = this.container.querySelector('.ntsh_dashboard-projector-sourcedisplayport');
this.sourceSDIButton = this.container.querySelector('.ntsh_dashboard-projector-sourcesdi');
this.temperatureIntake = this.container.querySelector('.ntsh_dashboard-projector-temperature-temperatureintake');
this.temmperatureLaser = this.container.querySelector('.ntsh_dashboard-projector-temperature-temperaturelaser');
this.temperatureDMD = this.container.querySelector('.ntsh_dashboard-projector-temperature-temperaturedmd');
this.errorContainer = this.container.querySelector('.ntsh_dashboard-projector-error');
this.errorText = this.container.querySelector('.ntsh_dashboard-projector-errortext');
this._Main = Main;
this.registerListeners();
}
DashboardProjector.prototype.updateState = function (state) {
if (state == null)
return;
// ----------- Power -----------
(0, utils_1.setStatusState)(this.powerStatus, {
Disabled: 'red',
'Not Connected': 'red',
'Power On': 'green',
'Power Off': 'gray',
'Powering Up': 'yellow',
'Powering Down': 'yellow',
}[state.Powermd]);
this.powerInfo.innerText = state.Powermd;
this.powerOnButton.style.display =
state.Powermd == 'Power Off' ? 'flex' : 'none';
this.powerOffButton.style.display =
state.Powermd == 'Power On' ? 'flex' : 'none';
// ----------- Laser -----------
(0, utils_1.setStatusState)(this.laserStatus, state.LaserStatus == 'On' ? 'green' : 'gray');
this.laserInfo.innerText = "".concat(state.LaserStatus, " (").concat(state.Laserhr, " hrs)");
this.shutterOpenButton.style.display =
state.LaserStatus == 'On' || state.Powermd != 'Power On'
? 'none'
: 'flex';
this.shutterCloseButton.style.display =
state.LaserStatus == 'Off' || state.Powermd != 'Power On'
? 'none'
: 'flex';
// ----------- Source -----------
(0, utils_1.setStatusState)(this.sourceStatus, state.Sourcemd == 'No Source' ||
state.Sourcemd == '?' ||
state.Powermd != 'Power On'
? 'gray'
: 'green');
this.sourceInfo.innerText =
state.Powermd == 'Power On' ? state.Sourcemd : '';
this.sourceHDMIButton.style.display =
state.Sourcemd == 'HDMI' || state.Powermd != 'Power On'
? 'none'
: 'flex';
this.sourceDVIDButton.style.display =
state.Sourcemd == 'DVI-D' || state.Powermd != 'Power On'
? 'none'
: 'flex';
this.sourceDisplayPortButton.style.display =
state.Sourcemd == 'DisplayPort' || state.Powermd != 'Power On'
? 'none'
: 'flex';
this.sourceSDIButton.style.display =
state.Sourcemd == '3G-SDI' || state.Powermd != 'Power On'
? 'none'
: 'flex';
// ----------- Temperature -----------
this.temperatureIntake.innerText = "".concat(state.IntakeTempDeg, " ").concat(CELCIUS);
this.temmperatureLaser.innerText = "".concat(state.LaserTempDeg, " ").concat(CELCIUS);
this.temperatureDMD.innerText = "".concat(state.DMDTempDeg, " ").concat(CELCIUS);
// ----------- Error -----------
if (state.Err != '(No Error)') {
this.errorText.innerText = state.Err;
this.errorContainer.style.display = 'block';
}
else {
this.errorContainer.style.display = 'none';
this.errorText.innerText = '';
}
};
DashboardProjector.prototype.registerListeners = function () {
var _this = this;
this._Main.socket.on('projectorState', function (state) {
_this.updateState(state);
});
this.powerOnButton.onclick = function () {
_this._Main.socket.emit('projectorCommand', 'powerOn');
};
this.powerOffButton.onclick = function () {
return __awaiter(_this, void 0, void 0, function () {
var confirmed;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, morphux_1.MorphFeature.Confirm({
message: 'Are you sure you want to power on the projector?',
})];
case 1:
confirmed = _a.sent();
if (!confirmed)
return [2 /*return*/];
this._Main.socket.emit('projectorCommand', 'powerOff');
return [2 /*return*/];
}
});
});
};
this.shutterOpenButton.onclick = function () {
_this._Main.socket.emit('projectorCommand', 'shutterOpen');
};
this.shutterCloseButton.onclick = function () {
_this._Main.socket.emit('projectorCommand', 'shutterClose');
};
this.sourceHDMIButton.onclick = function () {
_this._Main.socket.emit('projectorCommand', 'source', 'HDMI');
};
this.sourceDVIDButton.onclick = function () {
_this._Main.socket.emit('projectorCommand', 'source', 'DVI-D');
};
this.sourceDisplayPortButton.onclick = function () {
_this._Main.socket.emit('projectorCommand', 'source', 'DisplayPort');
};
this.sourceSDIButton.onclick = function () {
_this._Main.socket.emit('projectorCommand', 'source', '3G-SDI');
};
};
return DashboardProjector;
}());
exports.DashboardProjector = DashboardProjector;
//# sourceMappingURL=dashboard.projector.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,74 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DashboardShowControl = void 0;
var utils_1 = require("./utils");
var CELCIUS = 'ºC';
var DashboardShowControl = /** @class */ (function () {
function DashboardShowControl(Main) {
this.container = document.querySelector('.ntsh_dashboard-showcontrol');
this.runningStatus = this.container.querySelector('.ntsh_dashboard-showcontrol-runningstatus');
this.runningInfo = this.container.querySelector('.ntsh_dashboard-showcontrol-runninginfo');
this.errorContainer = this.container.querySelector('.ntsh_dashboard-showcontrol-error');
this.errorText = this.container.querySelector('.ntsh_dashboard-showcontrol-errortext');
this.startButton = this.container.querySelector('.ntsh_dashboard-showcontrol-start');
this.stopButton = this.container.querySelector('.ntsh_dashboard-showcontrol-stop');
this._Main = Main;
this.registerListeners();
}
DashboardShowControl.prototype.updateState = function (state) {
var _a;
// ----------- Running -----------
var runningStatus = {
STOPPED: 'gray',
STARTING: 'yellow',
RUNNING: 'green',
STOPPING: 'yellow',
RETRYING: 'red',
HALTED: 'red',
}[state.status];
(0, utils_1.setStatusState)(this.runningStatus, runningStatus);
this.runningInfo.innerText = {
STOPPED: 'Idle',
STARTING: state.info,
RUNNING: 'Running',
STOPPING: 'Stopping...',
RETRYING: 'Problem detected! Retrying...',
HALTED: 'Halted due to problems!',
}[state.status];
// ----------- Buttons -----------
this.startButton.style.display =
state.status == 'STOPPED' ||
state.status == 'HALTED' ||
state.status == 'RETRYING'
? 'flex'
: 'none';
this.stopButton.style.display =
state.status == 'RUNNING' || state.status == 'RETRYING'
? 'flex'
: 'none';
// ----------- Error -----------
if (((_a = state === null || state === void 0 ? void 0 : state.error) !== null && _a !== void 0 ? _a : '').trim().length > 0) {
this.errorText.innerText = state.error;
this.errorContainer.style.display = 'block';
}
else {
this.errorContainer.style.display = 'none';
this.errorText.innerText = '';
}
};
DashboardShowControl.prototype.registerListeners = function () {
var _this = this;
this._Main.socket.on('showControlState', function (state) {
_this.updateState(state);
});
this.startButton.onclick = function () {
fetch('/api/v1/start');
};
this.stopButton.onclick = function () {
fetch('/api/v1/stop');
};
};
return DashboardShowControl;
}());
exports.DashboardShowControl = DashboardShowControl;
//# sourceMappingURL=dashboard.showcontrol.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"dashboard.showcontrol.js","sourceRoot":"","sources":["../ts/dashboard.showcontrol.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,176 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Testing = void 0;
var morphux_1 = require("morphux");
var Testing = /** @class */ (function () {
function Testing(Main) {
this.container = document.querySelector('.ntsh_testing');
this.weatherResetButton = this.container.querySelector('.ntsh_testing-weather-reset');
this.weather0Button = this.container.querySelector('.ntsh_testing-weather-0');
this.weather5Button = this.container.querySelector('.ntsh_testing-weather-5');
this.weather10Button = this.container.querySelector('.ntsh_testing-weather-10');
this.weather20Button = this.container.querySelector('.ntsh_testing-weather-20');
this.weather50Button = this.container.querySelector('.ntsh_testing-weather-50');
this.resetAllTracksButton = this.container.querySelector('.ntsh_testing-tracks-reset');
this.cloudAnimationsSimoultaneousContainer = this.container.querySelector('.ntsh_testing-cloud-animations-simoultaneous');
this.cloudAnimationsStandaloneContainer = this.container.querySelector('.ntsh_testing-cloud-animations-standalone');
this._Main = Main;
this.registerListeners();
}
Testing.prototype.registerListeners = function () {
var _this = this;
this.weatherResetButton.onclick = function () { return _this.setWeather('reset'); };
this.weather0Button.onclick = function () { return _this.setWeather(0); };
this.weather5Button.onclick = function () { return _this.setWeather(5); };
this.weather10Button.onclick = function () { return _this.setWeather(10); };
this.weather20Button.onclick = function () { return _this.setWeather(20); };
this.weather50Button.onclick = function () { return _this.setWeather(50); };
[
'Rain',
'Blink',
'Breath',
'Fill',
'Rainbow',
'Wave',
'Pulse',
'Ambient',
'Flow',
'Thunder',
'Swipe Left',
'Swipe Right',
'Swipe Down',
'Swipe Up',
'Sphere Pulse',
].forEach(function (effect) {
var simoultaneous = (0, morphux_1.ce)('div', ['mux_button', 'mux_normal', 'mux_text'], null, effect);
var standalone = simoultaneous.cloneNode(true);
_this.cloudAnimationsSimoultaneousContainer.appendChild(simoultaneous);
_this.cloudAnimationsStandaloneContainer.appendChild(standalone);
simoultaneous.onclick = function () {
return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.fetch("/dev/animation/cloud/simoultaneous/".concat(effect
.replace(/ /g, '')
.toLowerCase()))];
case 1:
_a.sent();
morphux_1.MorphFeature.Notification({
level: 'success',
message: "Cloud animation set to ".concat(effect, " (simoultaneous)!"),
});
return [2 /*return*/];
}
});
});
};
standalone.onclick = function () {
return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.fetch("/dev/animation/cloud/standalone/".concat(effect
.replace(/ /g, '')
.toLowerCase()))];
case 1:
_a.sent();
morphux_1.MorphFeature.Notification({
level: 'success',
message: "Cloud animation set to ".concat(effect, " (standalone)!"),
});
return [2 /*return*/];
}
});
});
};
});
this.resetAllTracksButton.onclick = function () {
return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.fetch('/dev/resetTracks')];
case 1:
_a.sent();
morphux_1.MorphFeature.Notification({
level: 'success',
message: "All tracks have been reset!",
});
return [2 /*return*/];
}
});
});
};
};
Testing.prototype.setWeather = function (rainAmount) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.fetch("/dev/weather/".concat(rainAmount))];
case 1:
_a.sent();
morphux_1.MorphFeature.Notification({
level: 'success',
message: rainAmount == 'reset'
? 'Returned to actual weather!'
: "Weather set to ".concat(rainAmount, "!"),
});
return [2 /*return*/];
}
});
});
};
Testing.prototype.fetch = function (address) {
return __awaiter(this, void 0, void 0, function () {
var request;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
morphux_1.MorphFeature.Loader({ active: true });
return [4 /*yield*/, fetch(address)];
case 1:
request = _a.sent();
morphux_1.MorphFeature.Loader({ active: false });
return [2 /*return*/];
}
});
});
};
return Testing;
}());
exports.Testing = Testing;
//# sourceMappingURL=dashboard.testing.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"dashboard.testing.js","sourceRoot":"","sources":["../ts/dashboard.testing.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,243 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DashboardUnity = void 0;
var morphux_1 = require("morphux");
var utils_1 = require("./utils");
var DashboardUnity = /** @class */ (function () {
function DashboardUnity(Main) {
this.container = document.querySelector('.ntsh_dashboard-unity');
this.processStatus = document.querySelector('.ntsh_dashboard-unity-processstatus');
this.processInfo = document.querySelector('.ntsh_dashboard-unity-processinfo');
this.restartButton = document.querySelector('.ntsh_dashboard-unity-restart');
this.uptimeInfo = document.querySelector('.ntsh_dashboard-unity-uptime');
this.webSocketStatus = document.querySelector('.ntsh_dashboard-unity-websocketstatus');
this.webSocketInfo = document.querySelector('.ntsh_dashboard-unity-websocketinfo');
this.zedStreamStatus = document.querySelector('.ntsh_dashboard-unity-zedstreamstatus');
this.zedStreamInfo = document.querySelector('.ntsh_dashboard-unity-zedstreaminfo');
this.zedStreamFps = document.querySelector('.ntsh_dashboard-unity-zedstreamfps');
this.zedStreamPath = document.querySelector('.ntsh_dashboard-unity-zedstreampath');
this.timelineWatching = document.querySelector('.ntsh_dashboard-unity-timeline-watching');
this.timelineStanding = document.querySelector('.ntsh_dashboard-unity-timeline-standing');
this.timelineProgress = document.querySelector('.ntsh_dashboard-unity-timeline-progress');
this.parametersTable = document.querySelector('.ntsh_dashboard-unity-parameters');
this.errorContainer = document.querySelector('.ntsh_dashboard-unity-error');
this.errorText = document.querySelector('.ntsh_dashboard-unity-errortext');
this._Main = Main;
this.registerListeners();
}
DashboardUnity.prototype.updateRunnerState = function (state) {
var _a, _b;
// ----------- Process -----------
if (state.state != 'RUNNING') {
state.startTime = -1;
this.restartButton.style.display = 'none';
}
else {
this.restartButton.style.display = 'flex';
}
(0, utils_1.setStatusState)(this.processStatus, {
RUNNING: 'green',
STOPPED: 'red',
STARTING: 'yellow',
PROBLEM: 'red',
}[state.state]);
this.processInfo.innerText = (_a = state.message) !== null && _a !== void 0 ? _a : '';
// ----------- Uptime -----------
var uptimeSeconds = state.startTime == -1 ? -1 : (Date.now() - state.startTime) / 1000;
this.uptimeInfo.innerText = (0, utils_1.formatUptime)(uptimeSeconds);
// ----------- Error -----------
if (((_b = state === null || state === void 0 ? void 0 : state.error) !== null && _b !== void 0 ? _b : '').trim().length > 0)
this.runnerError = state.error;
else
this.runnerError = null;
this.updateError();
this._Main.Logs.setUnityLogs(state.output.current);
};
DashboardUnity.prototype.updateWebSocketState = function (state) {
var _a, _b;
// ----------- WebSocket -----------
(0, utils_1.setStatusState)(this.webSocketStatus, {
CONNECTING: 'yellow',
CONNECTED: 'green',
DISCONNECTED: 'gray',
FAILED: 'red',
}[state.state]);
this.webSocketInfo.innerText = (_a = state.message) !== null && _a !== void 0 ? _a : '';
// ----------- ZED Stream -----------
(0, utils_1.setStatusState)(this.zedStreamStatus, state.parameters.zedReady ? 'green' : 'red');
this.zedStreamInfo.innerText = state.parameters.zedReady
? "Connected to ".concat(state.parameters.zedPath)
: 'Not ready';
this.zedStreamFps.innerText =
state.parameters.zedFPS == '-' ? '' : state.parameters.zedFPS;
// ----------- Timeline -----------
this.timelineWatching.innerText = state.parameters.timelineWatching
? 'Yes'
: 'No';
this.timelineStanding.innerText = state.parameters.timelineStanding
? 'Yes'
: 'No';
(0, utils_1.setProgressState)(this.timelineProgress, state.parameters.timelineProgress);
// ----------- Parameters -----------
this.renderParameterSliders(state.parameters.parameters);
// ----------- Error -----------
if (((_b = state === null || state === void 0 ? void 0 : state.error) !== null && _b !== void 0 ? _b : '').trim().length > 0)
this.webSocketError = state.error;
else
this.webSocketError = null;
this.updateError();
};
DashboardUnity.prototype.renderParameterSliders = function (parameters) {
var _this = this;
if (parameters.length === 0)
return;
var existingSliders = this.parametersTable.querySelectorAll('.ntsh_dashboard-unity-parameter-row');
if (existingSliders.length !== parameters.length) {
this.parametersTable.innerHTML = '';
parameters.forEach(function (param) {
var row = (0, morphux_1.ce)('tr', 'ntsh_dashboard-unity-parameter-row');
var nameCell = (0, morphux_1.ce)('td');
nameCell.appendChild((0, morphux_1.ce)('div', 'mux_text', null, param.sliderName));
row.appendChild(nameCell);
var progressCell = (0, morphux_1.ce)('td', 'no-service');
progressCell.appendChild((0, utils_1.createProgress)(param.outputValue));
row.appendChild(progressCell);
var sliderCell = (0, morphux_1.ce)('td', 'only-service');
var sliderProgress = (0, utils_1.createProgress)(param.outputValue);
var sliderValue = sliderProgress.querySelector('.ntsh_progress-value');
sliderValue.classList.add('mux_resizer');
sliderCell.appendChild(sliderProgress);
var resizer = new morphux_1.MorphComponent.Resizer({
existingContainer: sliderValue,
direction: 'right',
relative: true,
min: 0,
max: function () { return sliderProgress.clientWidth; },
});
var lastPercentage = -1;
resizer.on('resized', function (size) {
var percentage = Math.round((size / sliderProgress.clientWidth) * 100) /
100;
if (percentage === lastPercentage)
return;
lastPercentage = percentage;
_this._Main.socket.emit('unityWebSocket', 'parameterValue', param.sliderIndex, percentage);
(0, utils_1.setProgressState)(sliderProgress, percentage);
});
row.appendChild(sliderCell);
_this.parametersTable.appendChild(row);
});
}
else {
existingSliders.forEach(function (row, index) {
var value = parameters[index].outputValue;
var progressElement = row.querySelector('.no-service .ntsh_progress');
(0, utils_1.setProgressState)(progressElement, value);
var sliderElement = row.querySelector('.only-service .ntsh_progress');
if (sliderElement.querySelector('.mux_resizer-moving') == null)
(0, utils_1.setProgressState)(sliderElement, value);
});
}
};
DashboardUnity.prototype.updateError = function () {
var errors = [];
if (this.runnerError != null)
errors.push(this.runnerError);
if (this.webSocketError != null)
errors.push(this.webSocketError);
if (errors.length > 0) {
this.errorText.innerText = errors.join('\n');
this.errorContainer.style.display = 'block';
}
else {
this.errorContainer.style.display = 'none';
this.errorText.innerText = '';
}
};
DashboardUnity.prototype.registerListeners = function () {
var _this = this;
this._Main.socket.on('unityRunnerState', function (state) {
return _this.updateRunnerState(state);
});
this._Main.socket.on('unityWebSocketState', function (state) { return _this.updateWebSocketState(state); });
this.restartButton.addEventListener('click', function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
this.executeCommand('restart', 'Are you sure you want to restart the Unity Runner process?');
return [2 /*return*/];
});
}); });
};
DashboardUnity.prototype.executeCommand = function (command, message) {
return __awaiter(this, void 0, void 0, function () {
var confirmed;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, morphux_1.MorphFeature.Confirm({
title: 'Are you sure?',
message: message,
})];
case 1:
confirmed = _a.sent();
if (!confirmed)
return [2 /*return*/];
morphux_1.MorphFeature.Loader({
active: true,
message: "Requesting Unity Runner ".concat(command, "..."),
});
this._Main.socket.emit('unityRunner', command, function (response) {
morphux_1.MorphFeature.Loader({ active: false });
if (!response.succeed)
return morphux_1.MorphFeature.Alert({
title: 'Error',
message: response.message,
});
morphux_1.MorphFeature.Notification({
level: 'success',
message: "Unity Runner is ".concat(command, "ing..."),
});
});
return [2 /*return*/];
}
});
});
};
return DashboardUnity;
}());
exports.DashboardUnity = DashboardUnity;
//# sourceMappingURL=dashboard.unity.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,143 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DashboardUnityRunner = void 0;
var morphux_1 = require("morphux");
var utils_1 = require("./utils");
var CELCIUS = 'ºC';
var DashboardUnityRunner = /** @class */ (function () {
function DashboardUnityRunner(Main) {
this.container = document.querySelector('.ntsh_dashboard-unity');
this.processStatus = this.container.querySelector('.ntsh_dashboard-unity-processstatus');
this.processInfo = this.container.querySelector('.ntsh_dashboard-unity-processinfo');
this.restartButton = this.container.querySelector('.ntsh_dashboard-unity-restart');
this.uptimeInfo = this.container.querySelector('.ntsh_dashboard-unity-uptime');
this.errorContainer = this.container.querySelector('.ntsh_dashboard-unity-error');
this.errorText = this.container.querySelector('.ntsh_dashboard-unity-errortext');
this._Main = Main;
this.registerListeners();
}
DashboardUnityRunner.prototype.updateState = function (state) {
var _a, _b;
// ----------- Process -----------
if (state.state != 'RUNNING') {
state.startTime = -1;
this.restartButton.style.display = 'none';
}
else {
this.restartButton.style.display = 'flex';
}
(0, utils_1.setStatusState)(this.processStatus, {
RUNNING: 'green',
STOPPED: 'red',
STARTING: 'yellow',
PROBLEM: 'red',
}[state.state]);
this.processInfo.innerText = (_a = state.message) !== null && _a !== void 0 ? _a : '';
// ----------- Uptime -----------
var uptimeSeconds = state.startTime == -1 ? -1 : (Date.now() - state.startTime) / 1000;
this.uptimeInfo.innerText = (0, utils_1.formatUptime)(uptimeSeconds);
// ----------- Error -----------
var errors = [];
if (((_b = state === null || state === void 0 ? void 0 : state.error) !== null && _b !== void 0 ? _b : '').trim().length > 0)
errors.push(state.error);
if (errors.length > 0) {
this.errorText.innerText = errors.join('\n');
this.errorContainer.style.display = 'block';
}
else {
this.errorContainer.style.display = 'none';
this.errorText.innerText = '';
}
this._Main.Logs.setUnityLogs(state.output.current);
};
DashboardUnityRunner.prototype.registerListeners = function () {
var _this = this;
this._Main.socket.on('unityRunnerState', function (state) {
_this.updateState(state);
});
this._Main.socket.on('unityWebSocketState', function (state) {
console.log('Unity WebSocket State:', state);
});
this.restartButton.addEventListener('click', function () {
return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
this.executeCommand('restart', 'Are you sure you want to restart the Unity Runner process?');
return [2 /*return*/];
});
});
});
};
DashboardUnityRunner.prototype.executeCommand = function (command, message) {
return __awaiter(this, void 0, void 0, function () {
var confirmed;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, morphux_1.MorphFeature.Confirm({
title: 'Are you sure?',
message: message,
})];
case 1:
confirmed = _a.sent();
if (!confirmed)
return [2 /*return*/];
morphux_1.MorphFeature.Loader({
active: true,
message: "Requesting Unity Runner ".concat(command, "..."),
});
this._Main.socket.emit('unityRunner', command, function (response) {
morphux_1.MorphFeature.Loader({ active: false });
if (!response.succeed)
return morphux_1.MorphFeature.Alert({
title: 'Error',
message: response.message,
});
morphux_1.MorphFeature.Notification({
level: 'success',
message: "Unity Runner is ".concat(command, "ing..."),
});
});
return [2 /*return*/];
}
});
});
};
return DashboardUnityRunner;
}());
exports.DashboardUnityRunner = DashboardUnityRunner;
//# sourceMappingURL=dashboard.unityrunner.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"dashboard.unityrunner.js","sourceRoot":"","sources":["../ts/dashboard.unityrunner.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,38 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Leds = void 0;
var morphux_1 = require("morphux");
var Leds = /** @class */ (function () {
function Leds(Main) {
this.container = document.querySelector(".ntsh_tab[tabid=\"leds\"]");
this._Main = Main;
this.registerTabListener();
}
Leds.prototype.createPreviewFrame = function () {
var container = (0, morphux_1.ce)('div', 'ntsh_leds');
var urlParams = new URLSearchParams(window.location.search);
var transform = urlParams.has('transform')
? "?transform=".concat(urlParams.get('transform'))
: '';
var frame = (0, morphux_1.ce)('iframe', 'ntsh_leds-frame', {
src: "http://".concat(window.location.hostname, ":84").concat(transform),
});
container.appendChild(frame);
this.container.appendChild(container);
};
Leds.prototype.removePreviewFrame = function () {
this.container.innerHTML = '';
};
Leds.prototype.registerTabListener = function () {
var _this = this;
this._Main.TabController.registerListener('leds', function (visible) {
if (visible)
_this.createPreviewFrame();
else
_this.removePreviewFrame();
});
};
return Leds;
}());
exports.Leds = Leds;
//# sourceMappingURL=leds%20copy.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"leds copy.js","sourceRoot":"","sources":["../ts/leds copy.ts"],"names":[],"mappings":";;;AAAA,mCAA6B;AAG7B;IAOC,cAAY,IAAU;QAJtB,cAAS,GAAmB,QAAQ,CAAC,aAAa,CACjD,2BAAyB,CACzB,CAAC;QAGD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC5B,CAAC;IAED,iCAAkB,GAAlB;QACC,IAAI,SAAS,GAAG,IAAA,YAAE,EAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAEvC,IAAI,SAAS,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE5D,IAAI,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC;YACzC,CAAC,CAAC,qBAAc,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAE;YAC5C,CAAC,CAAC,EAAE,CAAC;QAEN,IAAI,KAAK,GAAG,IAAA,YAAE,EAAC,QAAQ,EAAE,iBAAiB,EAAE;YAC3C,GAAG,EAAE,iBAAU,MAAM,CAAC,QAAQ,CAAC,QAAQ,gBAAM,SAAS,CAAE;SACxD,CAAC,CAAC;QACH,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAE7B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,iCAAkB,GAAlB;QACC,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC;IAC/B,CAAC;IAEO,kCAAmB,GAA3B;QAAA,iBAKC;QAJA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAC,OAAO;YACzD,IAAI,OAAO;gBAAE,KAAI,CAAC,kBAAkB,EAAE,CAAC;;gBAClC,KAAI,CAAC,kBAAkB,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IACJ,CAAC;IACF,WAAC;AAAD,CAAC,AAxCD,IAwCC;AAxCY,oBAAI"}

38
frontend/views/dashboard/dist/leds.js vendored Normal file
View File

@@ -0,0 +1,38 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Leds = void 0;
var morphux_1 = require("morphux");
var Leds = /** @class */ (function () {
function Leds(Main) {
this.container = document.querySelector(".ntsh_tab[tabid=\"leds\"]");
this._Main = Main;
this.registerTabListener();
}
Leds.prototype.createPreviewFrame = function () {
var container = (0, morphux_1.ce)('div', 'ntsh_leds');
var urlParams = new URLSearchParams(window.location.search);
var transform = urlParams.has('transform')
? "?transform=".concat(urlParams.get('transform'))
: '';
var frame = (0, morphux_1.ce)('iframe', 'ntsh_leds-frame', {
src: "http://".concat(window.location.hostname, ":84").concat(transform),
});
container.appendChild(frame);
this.container.appendChild(container);
};
Leds.prototype.removePreviewFrame = function () {
this.container.innerHTML = '';
};
Leds.prototype.registerTabListener = function () {
var _this = this;
this._Main.TabController.registerListener('leds', function (visible) {
if (visible)
_this.createPreviewFrame();
else
_this.removePreviewFrame();
});
};
return Leds;
}());
exports.Leds = Leds;
//# sourceMappingURL=leds.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"leds.js","sourceRoot":"","sources":["../ts/leds.ts"],"names":[],"mappings":";;;AAAA,mCAA6B;AAG7B;IAOC,cAAY,IAAU;QAJtB,cAAS,GAAmB,QAAQ,CAAC,aAAa,CACjD,2BAAyB,CACzB,CAAC;QAGD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC5B,CAAC;IAED,iCAAkB,GAAlB;QACC,IAAI,SAAS,GAAG,IAAA,YAAE,EAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAEvC,IAAI,SAAS,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE5D,IAAI,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC;YACzC,CAAC,CAAC,qBAAc,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAE;YAC5C,CAAC,CAAC,EAAE,CAAC;QAEN,IAAI,KAAK,GAAG,IAAA,YAAE,EAAC,QAAQ,EAAE,iBAAiB,EAAE;YAC3C,GAAG,EAAE,iBAAU,MAAM,CAAC,QAAQ,CAAC,QAAQ,gBAAM,SAAS,CAAE;SACxD,CAAC,CAAC;QACH,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAE7B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,iCAAkB,GAAlB;QACC,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC;IAC/B,CAAC;IAEO,kCAAmB,GAA3B;QAAA,iBAKC;QAJA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAC,OAAO;YACzD,IAAI,OAAO;gBAAE,KAAI,CAAC,kBAAkB,EAAE,CAAC;;gBAClC,KAAI,CAAC,kBAAkB,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IACJ,CAAC;IACF,WAAC;AAAD,CAAC,AAxCD,IAwCC;AAxCY,oBAAI"}

19
frontend/views/dashboard/dist/logs.js vendored Normal file
View File

@@ -0,0 +1,19 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Logs = void 0;
var Logs = /** @class */ (function () {
function Logs() {
this.cameraLogsContainer = document.querySelector('.ntsh_tab[tabid="cameralogs"] .ntsh_logs');
this.unityLogsContainer = document.querySelector('.ntsh_tab[tabid="unitylogs"] .ntsh_logs');
}
Logs.prototype.setCameraLogs = function (logs) {
this.applyLogs(this.cameraLogsContainer, logs);
};
Logs.prototype.setUnityLogs = function (logs) {
this.applyLogs(this.unityLogsContainer, logs);
};
Logs.prototype.applyLogs = function (container, logs) { };
return Logs;
}());
exports.Logs = Logs;
//# sourceMappingURL=logs.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../ts/logs.ts"],"names":[],"mappings":";;;AAAA;IAAA;QACC,wBAAmB,GAAmB,QAAQ,CAAC,aAAa,CAC3D,sCAAsC,CACtC,CAAC;QACF,uBAAkB,GAAmB,QAAQ,CAAC,aAAa,CAC1D,qCAAqC,CACrC,CAAC;IAWH,CAAC;IATA,4BAAa,GAAb,UAAc,IAAc;QAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,2BAAY,GAAZ,UAAa,IAAc;QAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAEO,wBAAS,GAAjB,UAAkB,SAAyB,EAAE,IAAc,IAAG,CAAC;IAChE,WAAC;AAAD,CAAC,AAjBD,IAiBC;AAjBY,oBAAI"}

View File

@@ -0,0 +1,116 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.LogsHandler = void 0;
var morphux_1 = require("morphux");
var ansi_up_1 = require("ansi_up");
var LogsHandler = /** @class */ (function () {
function LogsHandler(Main) {
this.ansiUp = new ansi_up_1.AnsiUp();
this.cameraLogsContainer = document.querySelector('.ntsh_tab[tabid="cameralogs"] .ntsh_logs');
this.unityLogsContainer = document.querySelector('.ntsh_tab[tabid="unitylogs"] .ntsh_logs');
this.firstTime = new Set();
this._Main = Main;
this.registerListeners();
}
LogsHandler.prototype.setCameraLogs = function (logs) {
this.applyLogs(this.cameraLogsContainer, logs);
};
LogsHandler.prototype.setUnityLogs = function (logs) {
this.applyLogs(this.unityLogsContainer, logs);
};
LogsHandler.prototype.applyLogs = function (container, logs) {
return __awaiter(this, void 0, void 0, function () {
var logCount, isAtBottom;
var _this = this;
return __generator(this, function (_a) {
logCount = container.querySelectorAll('.ntsh_log.ntsh_log-normal').length;
if (logCount === logs.length)
return [2 /*return*/];
if (logCount > logs.length)
logCount = 0;
isAtBottom = !this.firstTime.has(container) ||
container.scrollTop + container.clientHeight >=
container.scrollHeight;
container.innerHTML = '';
logs.forEach(function (log, i) {
var element = (0, morphux_1.ce)('div', ['ntsh_log', 'ntsh_log-normal'], null, null, _this.ansiUp.ansi_to_html(log));
if (_this.firstTime.has(container) && i > logCount - 1) {
element.style.display = 'none';
var spawnDelay = (i - logCount) * 10;
setTimeout(function () {
element.style.display = 'block';
if (isAtBottom)
container.scrollTop = container.scrollHeight;
}, spawnDelay);
}
container.appendChild(element);
if (isAtBottom)
container.scrollTop = container.scrollHeight;
});
if (!this.firstTime.has(container)) {
container.scrollTop = container.scrollHeight;
this.firstTime.add(container);
}
return [2 /*return*/];
});
});
};
LogsHandler.prototype.registerListeners = function () {
var _this = this;
this._Main.TabController.registerListener('cameralogs', function (visible) {
if (!visible)
return;
setTimeout(function () {
_this.cameraLogsContainer.scrollTop =
_this.cameraLogsContainer.scrollHeight;
}, 10);
});
this._Main.TabController.registerListener('unitylogs', function (visible) {
if (!visible)
return;
setTimeout(function () {
_this.unityLogsContainer.scrollTop =
_this.unityLogsContainer.scrollHeight;
}, 10);
});
};
return LogsHandler;
}());
exports.LogsHandler = LogsHandler;
//# sourceMappingURL=logsHandler.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"logsHandler.js","sourceRoot":"","sources":["../ts/logsHandler.ts"],"names":[],"mappings":"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"}

36
frontend/views/dashboard/dist/main.js vendored Normal file
View File

@@ -0,0 +1,36 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Main = void 0;
var socket_io_client_1 = require("socket.io-client");
var menuBar_1 = require("./menuBar");
var tabController_1 = require("./tabController");
var morphux_1 = require("morphux");
var dashboard_camerarunner_1 = require("./dashboard.camerarunner");
var logsHandler_1 = require("./logsHandler");
var calibration_1 = require("./calibration");
var dashboard_unity_1 = require("./dashboard.unity");
var socket = (0, socket_io_client_1.io)('/');
var Main = /** @class */ (function () {
function Main() {
this.socket = socket;
this.MenuBar = new menuBar_1.MenuBar(this);
this.TabController = new tabController_1.TabController(this);
this.Logs = new logsHandler_1.LogsHandler(this);
this.Calibration = new calibration_1.Calibration(this);
this.DashboardCameraRunner = new dashboard_camerarunner_1.DashboardCameraRunner(this);
this.DashboardUnityRunner = new dashboard_unity_1.DashboardUnity(this);
if (window.location.search.includes('debug')) {
window.SN = this;
console.log('Debug mode enabled');
}
}
return Main;
}());
exports.Main = Main;
morphux_1.MorphFeature.Loader({ active: true, message: 'Connecting to server...' });
socket.on('connect', function () {
console.log('Connected to server');
morphux_1.MorphFeature.Loader({ active: false });
});
var _Main = new Main();
//# sourceMappingURL=main.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"main.js","sourceRoot":"","sources":["../ts/main.ts"],"names":[],"mappings":";;;AAAA,qDAAsC;AACtC,qCAAoC;AACpC,iDAAgD;AAChD,mCAAuC;AACvC,mEAAiE;AACjE,6CAA4C;AAC5C,6CAA4C;AAC5C,qDAAmD;AAEnD,IAAM,MAAM,GAAG,IAAA,qBAAE,EAAC,GAAG,CAAC,CAAC;AACvB;IAYC;QAXA,WAAM,GAAG,MAAM,CAAC;QAEhB,YAAO,GAAG,IAAI,iBAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,kBAAa,GAAG,IAAI,6BAAa,CAAC,IAAI,CAAC,CAAC;QAExC,SAAI,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,CAAC;QAC7B,gBAAW,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,CAAC;QAEpC,0BAAqB,GAAG,IAAI,8CAAqB,CAAC,IAAI,CAAC,CAAC;QACxD,yBAAoB,GAAG,IAAI,gCAAc,CAAC,IAAI,CAAC,CAAC;QAG/C,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7C,MAAc,CAAC,EAAE,GAAG,IAAI,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACnC,CAAC;IACF,CAAC;IACF,WAAC;AAAD,CAAC,AAlBD,IAkBC;AAlBY,oBAAI;AAoBjB,sBAAY,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;AAC1E,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE;IACpB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,sBAAY,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC"}

171
frontend/views/dashboard/dist/menubar.js vendored Normal file
View File

@@ -0,0 +1,171 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MenuBar = void 0;
var morphux_1 = require("morphux");
var Component_MenuBar_1 = require("morphux/dist/Components/MenuBar/Component.MenuBar");
var MenuBar = /** @class */ (function () {
function MenuBar(main) {
var _this = this;
this.container = document.querySelector('.ntsh_menubar');
this._Main = main;
this.build();
setTimeout(function () {
if ((localStorage === null || localStorage === void 0 ? void 0 : localStorage.getItem('serviceMode')) === 'true')
_this.toggleServiceMode(true, true);
}, 10);
}
MenuBar.prototype.build = function () {
var _this = this;
this.menubar = new Component_MenuBar_1.ComponentMenuBar({
left: [
{
type: 'image',
url: '/img/morphix_logo_white.png',
},
{
type: 'normal',
text: 'Dashboard',
materialIcon: 'dashboard',
uniqueIdentifier: 'dashboard',
selected: true,
click: function () { return _this._Main.TabController.showTab('dashboard'); },
},
{
type: 'normal',
text: 'Calibration',
uniqueIdentifier: 'calibration',
materialIcon: 'crop_free',
click: function () {
return _this._Main.TabController.showTab('calibration');
},
},
{
type: 'normal',
text: 'Unity Logs',
uniqueIdentifier: 'unitylogs',
materialIcon: 'deployed_code',
click: function () { return _this._Main.TabController.showTab('unitylogs'); },
},
{
type: 'normal',
text: 'Camera Logs',
uniqueIdentifier: 'cameralogs',
materialIcon: 'photo_camera',
click: function () { return _this._Main.TabController.showTab('cameralogs'); },
},
],
right: [
{
type: 'normal',
text: document.body.classList.contains('ntsh_service')
? 'Exit Service'
: 'Service Mode',
uniqueIdentifier: 'serviceMode',
materialIcon: document.body.classList.contains('ntsh_service')
? 'logout'
: 'engineering',
click: function () { return __awaiter(_this, void 0, void 0, function () {
var mobileMenu;
return __generator(this, function (_a) {
mobileMenu = document.querySelector('.mux_mobilemenu');
mobileMenu === null || mobileMenu === void 0 ? void 0 : mobileMenu.click();
this.toggleServiceMode();
return [2 /*return*/];
});
}); },
},
],
});
this.container.innerHTML = '';
this.container.appendChild(this.menubar.container);
};
MenuBar.prototype.toggleServiceMode = function (mode, skipPin) {
return __awaiter(this, void 0, void 0, function () {
var newMode, servicePin;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
newMode = mode !== null && mode !== void 0 ? mode : !document.body.classList.contains('ntsh_service');
if (!newMode) return [3 /*break*/, 3];
if (!(skipPin !== true)) return [3 /*break*/, 2];
return [4 /*yield*/, morphux_1.MorphFeature.Prompt({
title: 'Service Mode',
message: 'Enter the service PIN:',
type: 'number',
canBeEmpty: false,
placeholder: '****',
})];
case 1:
servicePin = _a.sent();
if (servicePin !== '4252') {
morphux_1.MorphFeature.Alert({
title: 'Error',
message: 'Incorrect PIN provided.',
});
return [2 /*return*/, false];
}
_a.label = 2;
case 2:
document.body.classList.add('ntsh_service');
localStorage.setItem('serviceMode', 'true');
morphux_1.MorphFeature.Notification({
level: 'success',
message: 'Service mode activated.',
});
return [3 /*break*/, 4];
case 3:
document.body.classList.remove('ntsh_service');
this._Main.TabController.showTab('dashboard');
localStorage.setItem('serviceMode', 'false');
morphux_1.MorphFeature.Notification({
level: 'success',
message: 'Service mode deactivated.',
});
_a.label = 4;
case 4:
this.build();
return [2 /*return*/, true];
}
});
});
};
return MenuBar;
}());
exports.MenuBar = MenuBar;
//# sourceMappingURL=menuBar.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"menuBar.js","sourceRoot":"","sources":["../ts/menuBar.ts"],"names":[],"mappings":"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"}

166
frontend/views/dashboard/dist/mmWave.js vendored Normal file
View File

@@ -0,0 +1,166 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mmWave = void 0;
var morphux_1 = require("morphux");
var MAPPING_CORNER_COLOR = '#f00';
var MAPPING_LINE_COLOR = '#9c0000ff';
var mmWave = /** @class */ (function () {
function mmWave(Main) {
this.container = document.querySelector('.ntsh_mmwave-container');
this.nodes = this.container.querySelector('.ntsh_mmwave-nodes');
this.lines = this.container.querySelector('.ntsh_mmwave-lines');
this.linesContext = this.lines.getContext('2d');
this._Main = Main;
this.registerListeners();
}
mmWave.prototype.registerListeners = function () {
var _this = this;
console.log('Registering mmWave listeners');
this._Main.socket.on('mmwaveROI', function (roi) {
_this.roi = roi;
_this.updateROI();
});
this._Main.socket.on('mmwaveMapping', function (mapping) {
_this.mapping = mapping;
_this.setMappingCorners();
});
// this._Main.socket.on('mmwaveTracks', (tracks: Track[]) => {
// this.updateTracks(tracks);
// });
this._Main.socket.on('mmwavePoints', function (mappedPoints) {
_this.updateTracks(mappedPoints);
});
this.container.onclick = function (e) {
var rect = _this.container.getBoundingClientRect();
var scaleX = _this.container.clientWidth / rect.width;
var scaleY = _this.container.clientHeight / rect.height;
var x = (e.clientX - rect.left) * scaleX;
var y = (e.clientY - rect.top) * scaleY;
var xPercentage = (x / _this.container.clientWidth) * 100;
var yPercentage = (y / _this.container.clientHeight) * 100;
var roiPos = _this.toROI(xPercentage, yPercentage);
console.log(roiPos);
};
window.addEventListener('resize', function () { return _this.scale(); });
};
mmWave.prototype.updateTracks = function (mappedPoints) {
var _this = this;
if (this.roi == null)
return;
mappedPoints.forEach(function (_a) {
var track = _a.track, mapped = _a.mapped;
var trackPoint = _this.nodes.querySelector(".ntsh_mmwave-track[trackid=\"".concat(track.trackId, "\"]"));
var trackLabel = trackPoint === null || trackPoint === void 0 ? void 0 : trackPoint.querySelector('.ntsh_mmwave-label');
if (trackPoint == null) {
trackPoint = (0, morphux_1.ce)('div', 'ntsh_mmwave-track', {
trackid: track.trackId,
});
trackPoint.appendChild((0, morphux_1.ce)('div', 'ntsh_mmwave-track-cross'));
trackPoint.appendChild((0, morphux_1.ce)('div', 'ntsh_mmwave-track-cross'));
trackLabel = (0, morphux_1.ce)('div', 'ntsh_mmwave-label');
trackPoint.appendChild(trackLabel);
_this.nodes.appendChild(trackPoint);
trackPoint.animate({
opacity: [0, 1],
}, { duration: 200 });
}
var _b = _this.toPercentage(track.x, track.y), xPercentage = _b.xPercentage, yPercentage = _b.yPercentage;
trackPoint.style.left = "".concat(xPercentage, "%");
trackPoint.style.top = "".concat(yPercentage, "%");
if (mapped == null)
return trackPoint.classList.add('ntsh_mmwave-track-outside');
trackPoint.classList.remove('ntsh_mmwave-track-outside');
trackLabel.innerHTML = '';
trackLabel.appendChild((0, morphux_1.ce)('span', 'ntsh_mmwave-label-id', null, track.trackId.toString()));
trackLabel.appendChild((0, morphux_1.ce)('span', null, null, "".concat(Math.round(mapped.x), "%, ").concat(Math.round(mapped.y), "%")));
});
var trackIds = mappedPoints.map(function (t) { return t.track.trackId; });
this.nodes
.querySelectorAll('.ntsh_mmwave-track')
.forEach(function (trackPoint) {
var trackId = parseInt(trackPoint.getAttribute('trackid'));
if (trackIds.includes(trackId))
return;
trackPoint.animate({
opacity: 0,
}, { duration: 200 }).onfinish = function () {
trackPoint.remove();
};
});
};
mmWave.prototype.updateROI = function () {
if (this.roi == null)
return;
var xDif = Math.abs(this.roi.x[1] - this.roi.x[0]);
var yDif = Math.abs(this.roi.y[1] - this.roi.y[0]);
var height = (1920 / xDif) * yDif;
this.container.style.minWidth = "1920px";
this.container.style.minHeight = "".concat(height, "px");
this.lines.height = height;
this.lines.width = 1920;
this.scale();
};
mmWave.prototype.setMappingCorners = function () {
if (this.mapping == null)
return;
this.nodes
.querySelectorAll('.ntsh_mmwave-corner')
.forEach(function (el) { return el.remove(); });
var tl = this.addCorner(this.mapping.topLeft.x, this.mapping.topLeft.y, 'tl');
var tr = this.addCorner(this.mapping.topRight.x, this.mapping.topRight.y, 'tr');
var bl = this.addCorner(this.mapping.bottomLeft.x, this.mapping.bottomLeft.y, 'bl');
var br = this.addCorner(this.mapping.bottomRight.x, this.mapping.bottomRight.y, 'br');
this.linesContext.clearRect(0, 0, this.lines.width, this.lines.height);
this.linesContext.strokeStyle = MAPPING_LINE_COLOR;
this.linesContext.lineWidth = 2;
this.linesContext.beginPath();
this.linesContext.moveTo((tl.xPercentage / 100) * this.lines.width, (tl.yPercentage / 100) * this.lines.height);
this.linesContext.lineTo((tr.xPercentage / 100) * this.lines.width, (tr.yPercentage / 100) * this.lines.height);
this.linesContext.lineTo((br.xPercentage / 100) * this.lines.width, (br.yPercentage / 100) * this.lines.height);
this.linesContext.lineTo((bl.xPercentage / 100) * this.lines.width, (bl.yPercentage / 100) * this.lines.height);
this.linesContext.closePath();
this.linesContext.stroke();
};
mmWave.prototype.addCorner = function (x, y, corner) {
var cornerPoint = (0, morphux_1.ce)('div', [
'ntsh_mmwave-corner',
"ntsh_mmwave-corner-".concat(corner),
]);
cornerPoint.style.setProperty('--sn-mmwave-corner-color', MAPPING_CORNER_COLOR);
cornerPoint.appendChild((0, morphux_1.ce)('div', 'ntsh_mmwave-corner-cross'));
cornerPoint.appendChild((0, morphux_1.ce)('div', 'ntsh_mmwave-corner-cross'));
var position = this.toPercentage(x, y);
cornerPoint.style.left = "".concat(position.xPercentage, "%");
cornerPoint.style.top = "".concat(position.yPercentage, "%");
cornerPoint.appendChild((0, morphux_1.ce)('div', 'ntsh_mmwave-label', null, "".concat(x, ", ").concat(y)));
this.nodes.appendChild(cornerPoint);
return position;
};
mmWave.prototype.toPercentage = function (x, y) {
var xPercentage = ((x - this.roi.x[0]) / (this.roi.x[1] - this.roi.x[0])) * 100;
var yPercentage = ((y - this.roi.y[0]) / (this.roi.y[1] - this.roi.y[0])) * 100;
return { xPercentage: xPercentage, yPercentage: yPercentage };
};
mmWave.prototype.toROI = function (xPercentage, yPercentage) {
var x = this.roi.x[0] +
(xPercentage / 100) * (this.roi.x[1] - this.roi.x[0]);
var y = this.roi.y[0] +
(yPercentage / 100) * (this.roi.y[1] - this.roi.y[0]);
return { x: x, y: y };
};
mmWave.prototype.scale = function () {
var elementWidth = this.container.clientWidth;
var elementHeight = this.container.clientHeight;
var parentWidth = this.container.parentElement.clientWidth;
var parentHeight = this.container.parentElement.clientHeight;
var ratioWidth = parentWidth / elementWidth;
var ratioHeight = parentHeight / elementHeight;
var ratio = elementHeight * ratioWidth > parentHeight
? ratioHeight
: ratioWidth;
this.container.style.transform = "scale(".concat(ratio, ")");
};
return mmWave;
}());
exports.mmWave = mmWave;
//# sourceMappingURL=mmWave.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,38 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Preview = void 0;
var morphux_1 = require("morphux");
var Preview = /** @class */ (function () {
function Preview(Main) {
this.container = document.querySelector(".ntsh_tab[tabid=\"preview\"]");
this._Main = Main;
this.registerTabListener();
}
Preview.prototype.createPreviewFrame = function () {
var container = (0, morphux_1.ce)('div', 'ntsh_preview');
var urlParams = new URLSearchParams(window.location.search);
var transform = urlParams.has('transform')
? "?transform=".concat(urlParams.get('transform'))
: '';
var frame = (0, morphux_1.ce)('iframe', 'ntsh_preview-frame', {
src: "http://".concat(window.location.hostname, ":84").concat(transform),
});
container.appendChild(frame);
this.container.appendChild(container);
};
Preview.prototype.removePreviewFrame = function () {
this.container.innerHTML = '';
};
Preview.prototype.registerTabListener = function () {
var _this = this;
this._Main.TabController.registerListener('preview', function (visible) {
if (visible)
_this.createPreviewFrame();
else
_this.removePreviewFrame();
});
};
return Preview;
}());
exports.Preview = Preview;
//# sourceMappingURL=preview.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../ts/preview.ts"],"names":[],"mappings":";;;AAAA,mCAA6B;AAG7B;IAOC,iBAAY,IAAU;QAJtB,cAAS,GAAmB,QAAQ,CAAC,aAAa,CACjD,8BAA4B,CAC5B,CAAC;QAGD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC5B,CAAC;IAED,oCAAkB,GAAlB;QACC,IAAI,SAAS,GAAG,IAAA,YAAE,EAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAE1C,IAAI,SAAS,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE5D,IAAI,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC;YACzC,CAAC,CAAC,qBAAc,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAE;YAC5C,CAAC,CAAC,EAAE,CAAC;QAEN,IAAI,KAAK,GAAG,IAAA,YAAE,EAAC,QAAQ,EAAE,oBAAoB,EAAE;YAC9C,GAAG,EAAE,iBAAU,MAAM,CAAC,QAAQ,CAAC,QAAQ,gBAAM,SAAS,CAAE;SACxD,CAAC,CAAC;QACH,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAE7B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,oCAAkB,GAAlB;QACC,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC;IAC/B,CAAC;IAEO,qCAAmB,GAA3B;QAAA,iBAKC;QAJA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAC,OAAO;YAC5D,IAAI,OAAO;gBAAE,KAAI,CAAC,kBAAkB,EAAE,CAAC;;gBAClC,KAAI,CAAC,kBAAkB,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IACJ,CAAC;IACF,cAAC;AAAD,CAAC,AAxCD,IAwCC;AAxCY,0BAAO"}

View File

@@ -0,0 +1,34 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Projection = void 0;
var morphux_1 = require("morphux");
var Projection = /** @class */ (function () {
function Projection(Main) {
this.container = document.querySelector(".ntsh_tab[tabid=\"projection\"]");
this._Main = Main;
this.registerTabListener();
}
Projection.prototype.createPreviewFrame = function () {
var container = (0, morphux_1.ce)('div', 'ntsh_projection');
var frame = (0, morphux_1.ce)('iframe', 'ntsh_projection-frame', {
src: "".concat(window.location.origin, "/visualization").concat(window.location.search),
});
container.appendChild(frame);
this.container.appendChild(container);
};
Projection.prototype.removePreviewFrame = function () {
this.container.innerHTML = '';
};
Projection.prototype.registerTabListener = function () {
var _this = this;
this._Main.TabController.registerListener('projection', function (visible) {
if (visible)
_this.createPreviewFrame();
else
_this.removePreviewFrame();
});
};
return Projection;
}());
exports.Projection = Projection;
//# sourceMappingURL=projection.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../ts/projection.ts"],"names":[],"mappings":";;;AAAA,mCAA6B;AAG7B;IAOC,oBAAY,IAAU;QAJtB,cAAS,GAAmB,QAAQ,CAAC,aAAa,CACjD,iCAA+B,CAC/B,CAAC;QAGD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC5B,CAAC;IAED,uCAAkB,GAAlB;QACC,IAAI,SAAS,GAAG,IAAA,YAAE,EAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAE7C,IAAI,KAAK,GAAG,IAAA,YAAE,EAAC,QAAQ,EAAE,uBAAuB,EAAE;YACjD,GAAG,EAAE,UAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,2BAAiB,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAE;SACvE,CAAC,CAAC;QACH,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAE7B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,uCAAkB,GAAlB;QACC,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC;IAC/B,CAAC;IAEO,wCAAmB,GAA3B;QAAA,iBAKC;QAJA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAC,OAAO;YAC/D,IAAI,OAAO;gBAAE,KAAI,CAAC,kBAAkB,EAAE,CAAC;;gBAClC,KAAI,CAAC,kBAAkB,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IACJ,CAAC;IACF,iBAAC;AAAD,CAAC,AAlCD,IAkCC;AAlCY,gCAAU"}

View File

@@ -0,0 +1,120 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TabController = void 0;
var morphux_1 = require("morphux");
var TabController = /** @class */ (function () {
function TabController(main) {
this.container = document.querySelector('.ntsh_tabs');
this.tabListeners = new Map();
this._Main = main;
this.registerNavigationListener();
}
TabController.prototype.registerListener = function (tabId, callback) {
if (this.tabListeners.has(tabId))
throw new Error("Listener for tab id ".concat(tabId, " has already been registered!"));
this.tabListeners.set(tabId, callback);
callback(this.currentTabId == tabId);
};
TabController.prototype.showTab = function (tabId) {
return __awaiter(this, void 0, void 0, function () {
var confirmed, succeed, tabName;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (this.currentTabId == tabId)
return [2 /*return*/];
if (!(tabId !== 'dashboard' &&
!document.body.classList.contains('ntsh_service'))) return [3 /*break*/, 3];
return [4 /*yield*/, morphux_1.MorphFeature.Confirm({
title: 'Service Mode Required',
message: "You need to be in service mode to access tab ".concat(tabId, ", switch to Service Mode now?"),
})];
case 1:
confirmed = _a.sent();
if (!confirmed)
return [2 /*return*/, this.showTab('dashboard')];
return [4 /*yield*/, this._Main.MenuBar.toggleServiceMode(true)];
case 2:
succeed = _a.sent();
if (!succeed)
return [2 /*return*/, this.showTab('dashboard')];
_a.label = 3;
case 3:
this._Main.MenuBar.menubar.setSelected(tabId);
if (this.tabListeners.has(this.currentTabId))
this.tabListeners.get(this.currentTabId)(false);
if (this.tabListeners.has(tabId))
this.tabListeners.get(tabId)(true);
this.currentTabId = tabId;
this.container
.querySelectorAll('.ntsh_tab')
.forEach(function (tab) { return tab.classList.remove('ntsh_tab-visible'); });
this.container
.querySelector(".ntsh_tab[tabid=\"".concat(tabId, "\"]"))
.classList.add('ntsh_tab-visible');
window.history.pushState({ tab: tabId }, '', "/".concat(tabId).concat(window.location.search));
tabName = {
dashboard: 'Dashboard',
calibration: 'Calibration',
cameralogs: 'Camera Logs',
unitylogs: 'Unity Logs',
}[tabId];
document.title = "NTSH Control - ".concat(tabName);
return [2 /*return*/];
}
});
});
};
TabController.prototype.registerNavigationListener = function () {
var _this = this;
window.addEventListener('popstate', function (event) {
var state = event.state;
if (state && state.tab)
_this.showTab(state.tab);
});
var startTab = window.location.pathname
.replace('/', '')
.split('/')
.shift();
this.showTab(startTab.length > 0 ? startTab : 'dashboard');
};
return TabController;
}());
exports.TabController = TabController;
//# sourceMappingURL=tabController.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"tabController.js","sourceRoot":"","sources":["../ts/tabController.ts"],"names":[],"mappings":"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"}

198
frontend/views/dashboard/dist/testing.js vendored Normal file
View File

@@ -0,0 +1,198 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Testing = void 0;
var morphux_1 = require("morphux");
var Testing = /** @class */ (function () {
function Testing(Main) {
this.container = document.querySelector('.ntsh_testing');
this.alphaContainer = this.container.querySelector('.ntsh_testing-ledalpha');
this.weatherResetButton = this.container.querySelector('.ntsh_testing-weather-reset');
this.weather0Button = this.container.querySelector('.ntsh_testing-weather-0');
this.weather5Button = this.container.querySelector('.ntsh_testing-weather-5');
this.weather10Button = this.container.querySelector('.ntsh_testing-weather-10');
this.weather20Button = this.container.querySelector('.ntsh_testing-weather-20');
this.weather50Button = this.container.querySelector('.ntsh_testing-weather-50');
this.resetAllTracksButton = this.container.querySelector('.ntsh_testing-tracks-reset');
this.cloudAnimationsSimoultaneousContainer = this.container.querySelector('.ntsh_testing-cloud-animations-simoultaneous');
this.cloudAnimationsStandaloneContainer = this.container.querySelector('.ntsh_testing-cloud-animations-standalone');
this._Main = Main;
this.registerListeners();
}
Testing.prototype.registerListeners = function () {
var _this = this;
Array.from({ length: 21 }, function (_, i) { return i; }).forEach(function (i) {
var button = (0, morphux_1.ce)('div', ['mux_button', 'mux_normal', 'mux_text'], null, "".concat(i * 5, "%"));
// if (i == 20) button.innerText = '100%';
_this.alphaContainer.appendChild(button);
button.onclick = function () {
return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.fetch("/dev/alpha/".concat(i * 0.05))];
case 1:
_a.sent();
morphux_1.MorphFeature.Notification({
level: 'success',
message: "LED alpha set to ".concat(i * 5, "%!"),
});
return [2 /*return*/];
}
});
});
};
});
this.weatherResetButton.onclick = function () { return _this.setWeather('reset'); };
this.weather0Button.onclick = function () { return _this.setWeather(0); };
this.weather5Button.onclick = function () { return _this.setWeather(5); };
this.weather10Button.onclick = function () { return _this.setWeather(10); };
this.weather20Button.onclick = function () { return _this.setWeather(20); };
this.weather50Button.onclick = function () { return _this.setWeather(50); };
[
'Rain',
'Blink',
'Breath',
'Fill',
'Rainbow',
'Wave',
'Pulse',
'Ambient',
'Flow',
'Thunder',
'Swipe Left',
'Swipe Right',
'Swipe Down',
'Swipe Up',
'Sphere Pulse',
].forEach(function (effect) {
var simoultaneous = (0, morphux_1.ce)('div', ['mux_button', 'mux_normal', 'mux_text'], null, effect);
var standalone = simoultaneous.cloneNode(true);
_this.cloudAnimationsSimoultaneousContainer.appendChild(simoultaneous);
_this.cloudAnimationsStandaloneContainer.appendChild(standalone);
simoultaneous.onclick = function () {
return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.fetch("/dev/animation/cloud/simoultaneous/".concat(effect
.replace(/ /g, '')
.toLowerCase()))];
case 1:
_a.sent();
morphux_1.MorphFeature.Notification({
level: 'success',
message: "Cloud animation set to ".concat(effect, " (simoultaneous)!"),
});
return [2 /*return*/];
}
});
});
};
standalone.onclick = function () {
return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.fetch("/dev/animation/cloud/standalone/".concat(effect
.replace(/ /g, '')
.toLowerCase()))];
case 1:
_a.sent();
morphux_1.MorphFeature.Notification({
level: 'success',
message: "Cloud animation set to ".concat(effect, " (standalone)!"),
});
return [2 /*return*/];
}
});
});
};
});
this.resetAllTracksButton.onclick = function () {
return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.fetch('/dev/resetTracks')];
case 1:
_a.sent();
morphux_1.MorphFeature.Notification({
level: 'success',
message: "All tracks have been reset!",
});
return [2 /*return*/];
}
});
});
};
};
Testing.prototype.setWeather = function (rainAmount) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.fetch("/dev/weather/".concat(rainAmount))];
case 1:
_a.sent();
morphux_1.MorphFeature.Notification({
level: 'success',
message: rainAmount == 'reset'
? 'Returned to actual weather!'
: "Weather set to ".concat(rainAmount, "!"),
});
return [2 /*return*/];
}
});
});
};
Testing.prototype.fetch = function (address) {
return __awaiter(this, void 0, void 0, function () {
var request;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
morphux_1.MorphFeature.Loader({ active: true });
return [4 /*yield*/, fetch(address)];
case 1:
request = _a.sent();
morphux_1.MorphFeature.Loader({ active: false });
return [2 /*return*/];
}
});
});
};
return Testing;
}());
exports.Testing = Testing;
//# sourceMappingURL=testing.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../ts/testing.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAA2C;AAI3C;IAyCC,iBAAY,IAAU;QAtCtB,cAAS,GAAmB,QAAQ,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QAEpE,mBAAc,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC5D,wBAAwB,CACxB,CAAC;QAEF,uBAAkB,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAChE,6BAA6B,CAC7B,CAAC;QACF,mBAAc,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC5D,yBAAyB,CACzB,CAAC;QACF,mBAAc,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC5D,yBAAyB,CACzB,CAAC;QACF,oBAAe,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC7D,0BAA0B,CAC1B,CAAC;QACF,oBAAe,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC7D,0BAA0B,CAC1B,CAAC;QACF,oBAAe,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAC7D,0BAA0B,CAC1B,CAAC;QAEF,yBAAoB,GAAmB,IAAI,CAAC,SAAS,CAAC,aAAa,CAClE,4BAA4B,CAC5B,CAAC;QAEF,0CAAqC,GACpC,IAAI,CAAC,SAAS,CAAC,aAAa,CAC3B,8CAA8C,CAC9C,CAAC;QACH,uCAAkC,GACjC,IAAI,CAAC,SAAS,CAAC,aAAa,CAC3B,2CAA2C,CAC3C,CAAC;QAGF,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC1B,CAAC;IAEO,mCAAiB,GAAzB;QAAA,iBAyFC;QAxFA,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,EAAD,CAAC,CAAC,CAAC,OAAO,CAAC,UAAC,CAAC;YACjD,IAAI,MAAM,GAAG,IAAA,YAAE,EACd,KAAK,EACL,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,EACxC,IAAI,EACJ,UAAG,CAAC,GAAG,CAAC,MAAG,CACO,CAAC;YACpB,0CAA0C;YAC1C,KAAI,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAExC,MAAM,CAAC,OAAO,GAAG;;;gCAChB,qBAAM,IAAI,CAAC,KAAK,CAAC,qBAAc,CAAC,GAAG,IAAI,CAAE,CAAC,EAAA;;4BAA1C,SAA0C,CAAC;4BAC3C,sBAAY,CAAC,YAAY,CAAC;gCACzB,KAAK,EAAE,SAAS;gCAChB,OAAO,EAAE,2BAAoB,CAAC,GAAG,CAAC,OAAI;6BACtC,CAAC,CAAC;;;;iBACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,kBAAkB,CAAC,OAAO,GAAG,cAAM,OAAA,KAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAxB,CAAwB,CAAC;QACjE,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,cAAM,OAAA,KAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAlB,CAAkB,CAAC;QACvD,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,cAAM,OAAA,KAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAlB,CAAkB,CAAC;QACvD,IAAI,CAAC,eAAe,CAAC,OAAO,GAAG,cAAM,OAAA,KAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAnB,CAAmB,CAAC;QACzD,IAAI,CAAC,eAAe,CAAC,OAAO,GAAG,cAAM,OAAA,KAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAnB,CAAmB,CAAC;QACzD,IAAI,CAAC,eAAe,CAAC,OAAO,GAAG,cAAM,OAAA,KAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAnB,CAAmB,CAAC;QAEzD;YACC,MAAM;YACN,OAAO;YACP,QAAQ;YACR,MAAM;YACN,SAAS;YACT,MAAM;YACN,OAAO;YACP,SAAS;YACT,MAAM;YACN,SAAS;YACT,YAAY;YACZ,aAAa;YACb,YAAY;YACZ,UAAU;YACV,cAAc;SACd,CAAC,OAAO,CAAC,UAAC,MAAM;YAChB,IAAI,aAAa,GAAG,IAAA,YAAE,EACrB,KAAK,EACL,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,EACxC,IAAI,EACJ,MAAM,CACN,CAAC;YAEF,IAAI,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,CAAmB,CAAC;YAEjE,KAAI,CAAC,qCAAqC,CAAC,WAAW,CACrD,aAAa,CACb,CAAC;YACF,KAAI,CAAC,kCAAkC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YAEhE,aAAa,CAAC,OAAO,GAAG;;;gCACvB,qBAAM,IAAI,CAAC,KAAK,CACf,6CAAsC,MAAM;iCAC1C,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;iCACjB,WAAW,EAAE,CAAE,CACjB,EAAA;;4BAJD,SAIC,CAAC;4BACF,sBAAY,CAAC,YAAY,CAAC;gCACzB,KAAK,EAAE,SAAS;gCAChB,OAAO,EAAE,iCAA0B,MAAM,sBAAmB;6BAC5D,CAAC,CAAC;;;;iBACH,CAAC;YACF,UAAU,CAAC,OAAO,GAAG;;;gCACpB,qBAAM,IAAI,CAAC,KAAK,CACf,0CAAmC,MAAM;iCACvC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;iCACjB,WAAW,EAAE,CAAE,CACjB,EAAA;;4BAJD,SAIC,CAAC;4BACF,sBAAY,CAAC,YAAY,CAAC;gCACzB,KAAK,EAAE,SAAS;gCAChB,OAAO,EAAE,iCAA0B,MAAM,mBAAgB;6BACzD,CAAC,CAAC;;;;iBACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,oBAAoB,CAAC,OAAO,GAAG;;;4BACnC,qBAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAA;;wBAApC,SAAoC,CAAC;wBACrC,sBAAY,CAAC,YAAY,CAAC;4BACzB,KAAK,EAAE,SAAS;4BAChB,OAAO,EAAE,6BAA6B;yBACtC,CAAC,CAAC;;;;aACH,CAAC;IACH,CAAC;IAEa,4BAAU,GAAxB,UAAyB,UAA4B;;;;4BACpD,qBAAM,IAAI,CAAC,KAAK,CAAC,uBAAgB,UAAU,CAAE,CAAC,EAAA;;wBAA9C,SAA8C,CAAC;wBAC/C,sBAAY,CAAC,YAAY,CAAC;4BACzB,KAAK,EAAE,SAAS;4BAChB,OAAO,EACN,UAAU,IAAI,OAAO;gCACpB,CAAC,CAAC,6BAA6B;gCAC/B,CAAC,CAAC,yBAAkB,UAAU,MAAG;yBACnC,CAAC,CAAC;;;;;KACH;IAEa,uBAAK,GAAnB,UAAoB,OAAe;;;;;;wBAClC,sBAAY,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;wBACxB,qBAAM,KAAK,CAAC,OAAO,CAAC,EAAA;;wBAA9B,OAAO,GAAG,SAAoB;wBAClC,sBAAY,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;;;;;KACvC;IACF,cAAC;AAAD,CAAC,AA1JD,IA0JC;AA1JY,0BAAO"}

62
frontend/views/dashboard/dist/utils.js vendored Normal file
View File

@@ -0,0 +1,62 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createProgress = exports.setProgressState = exports.setStatusState = exports.lerp = void 0;
exports.capitalizeFirstLetter = capitalizeFirstLetter;
exports.formatUptime = formatUptime;
exports.delay = delay;
var morphux_1 = require("morphux");
/**
* A linear interpolation helper function.
* @param a The start value.
* @param b The end value.
* @param t The interpolation factor (0 to 1).
* @returns The interpolated value.
*/
var lerp = function (a, b, t) {
return a + (b - a) * t;
};
exports.lerp = lerp;
var setStatusState = function (statusElement, state) {
statusElement.classList.remove('ntsh_status-green', 'ntsh_status-yellow', 'ntsh_status-red', 'ntsh_status-gray');
statusElement.classList.add("ntsh_status-".concat(state));
};
exports.setStatusState = setStatusState;
var setProgressState = function (progressElement, percentage) {
var value = progressElement.querySelector('.ntsh_progress-value');
value.style.width = "".concat(percentage * 100, "%");
var label = progressElement.querySelector('.ntsh_progress-label');
label.innerText = "".concat(Math.round(percentage * 100), "%");
};
exports.setProgressState = setProgressState;
var createProgress = function (value) {
var progress = (0, morphux_1.ce)('div', 'ntsh_progress');
progress.appendChild((0, morphux_1.ce)('div', 'ntsh_progress-value'));
progress.appendChild((0, morphux_1.ce)('div', 'ntsh_progress-label'));
(0, exports.setProgressState)(progress, value);
return progress;
};
exports.createProgress = createProgress;
function capitalizeFirstLetter(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
function formatUptime(seconds) {
if (seconds < 0)
return '';
var days = Math.floor(seconds / 86400);
seconds %= 86400;
var hours = Math.floor(seconds / 3600);
seconds %= 3600;
var minutes = Math.floor(seconds / 60);
seconds = Math.floor(seconds % 60);
var parts = [];
if (days > 0)
parts.push("".concat(days, "d"));
parts.push("".concat(hours.toString().padStart(2, '0'), ":").concat(minutes
.toString()
.padStart(2, '0'), ":").concat(seconds.toString().padStart(2, '0')));
return parts.join(' ');
}
function delay(duration) {
return new Promise(function (resolve) { return setTimeout(resolve, duration); });
}
//# sourceMappingURL=utils.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../ts/utils.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,267 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>NTSH Control</title>
<link rel="stylesheet" href="/material-symbols/index.css">
<link rel="stylesheet" href="./style.css">
<script defer src="./script.js" defer></script>
<link rel="icon" type="image/png" sizes="32x32" href="/img/cloud_thick.png">
</head>
<body>
<div class="sn">
<div class="ntsh_menubar">
</div>
<div class="ntsh_tabs">
<div class="ntsh_tab" tabid="dashboard">
<div class="ntsh_dashboard">
<div class="ntsh_dashboard-box ntsh_dashboard-camerarunner">
<div class="ntsh_dashboard-box-header mux_header">Camera Runner</div>
<table class="ntsh_vertical">
<tr>
<td>
<div class="mux_text">Connection</div>
</td>
<td>
<div class="ntsh_status ntsh_dashboard-camerarunner-connectionstatus"></div>
</td>
<td>
<div class="ntsh_dashboard-camerarunner-connectioninfo mux_text">
</div>
</td>
<td>
<div class="ntsh_buttons">
<div class="ntsh_button mux_text ntsh_dashboard-camerarunner-reboot">
Reboot
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="mux_text">Process</div>
</td>
<td>
<div class="ntsh_status ntsh_dashboard-camerarunner-processstatus"></div>
</td>
<td>
<div class="ntsh_dashboard-camerarunner-processinfo mux_text">
</div>
</td>
<td>
<div class="ntsh_buttons">
<div class="ntsh_button mux_text ntsh_dashboard-camerarunner-restart">
Restart Process
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="mux_text">Uptime</div>
</td>
<td>
</td>
<td>
<div class="ntsh_dashboard-camerarunner-uptime mux_text">
</div>
</td>
<td>
</td>
</tr>
</table>
<div class="ntsh_dashboard-error ntsh_dashboard-camerarunner-error">
<div class="mux_header">Error</div>
<div class="mux_text ntsh_dashboard-camerarunner-errortext">
</div>
</div>
</div>
<div class="ntsh_dashboard-box ntsh_dashboard-unity">
<div class="ntsh_dashboard-box-header mux_header">Unity</div>
<table class="ntsh_vertical">
<tr>
<td>
<div class="mux_text">Process</div>
</td>
<td>
<div class="ntsh_status ntsh_dashboard-unity-processstatus"></div>
</td>
<td>
<div class="ntsh_dashboard-unity-processinfo mux_text">
</div>
</td>
<td>
<div class="ntsh_buttons">
<div class="ntsh_button mux_text ntsh_dashboard-unity-restart">
Restart Process
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="mux_text">Uptime</div>
</td>
<td>
</td>
<td>
<div class="ntsh_dashboard-unity-uptime mux_text">
</div>
</td>
<td>
</td>
</tr>
<tr>
<td>
<div class="mux_text">WebSocket</div>
</td>
<td>
<div class="ntsh_status ntsh_dashboard-unity-websocketstatus"></div>
</td>
<td>
<div class="ntsh_dashboard-unity-websocketinfo mux_text">
</div>
</td>
<td>
</td>
</tr>
</table>
<div class="ntsh_dashboard-error ntsh_dashboard-unity-error">
<div class="mux_header">Error</div>
<div class="mux_text ntsh_dashboard-unity-errortext">
</div>
</div>
</div>
<div class="ntsh_dashboard-box ntsh_dashboard-unityzedstream">
<div class="ntsh_dashboard-box-header mux_header">ZED Stream</div>
<table class="ntsh_vertical">
<tr>
<td>
<div class="mux_text">Connection</div>
</td>
<td>
<div class="ntsh_status ntsh_dashboard-unity-zedstreamstatus"></div>
</td>
<td>
<div class="ntsh_dashboard-unity-zedstreaminfo mux_text">
</div>
</td>
<td>
</td>
</tr>
<tr>
<td>
<div class="mux_text">FPS</div>
</td>
<td>
</td>
<td>
<div class="ntsh_dashboard-unity-zedstreamfps mux_text">
</div>
</td>
<td>
</td>
</tr>
</table>
</div>
<div class="ntsh_dashboard-box ntsh_dashboard-unitytimeline">
<div class="ntsh_dashboard-box-header mux_header">Timeline</div>
<table class="ntsh_horizontal">
<tr>
<td>
<div class="mux_text">Watching</div>
</td>
<td>
<div class="mux_text">Standing</div>
</td>
<td>
<div class="mux_text">Progress</div>
</td>
</tr>
<tr>
<td>
<div class="mux_text mux_big ntsh_dashboard-unity-timeline-watching">
</div>
</td>
<td>
<div class="mux_text mux_big ntsh_dashboard-unity-timeline-standing">
</div>
</td>
<td>
<div class="mux_text mux_big ntsh_progress ntsh_dashboard-unity-timeline-progress">
<div class="ntsh_progress-value ntsh_progress-smooth"></div>
<div class="ntsh_progress-label"></div>
</div>
</td>
</tr>
</table>
</div>
<div class="ntsh_dashboard-box ntsh_dashboard-unityparameters">
<div class="ntsh_dashboard-box-header mux_header">Parameters</div>
<table class="ntsh_vertical ntsh_dashboard-unity-parameters">
<tr>
<td>
<div class="mux_text ntsh_dashboard-unity-parameters-loading">Waiting for Unity...
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="ntsh_tab" tabid="calibration">
<div class="ntsh_calibration">
<div class="ntsh_calibration-fullscreen">
<span class="material-symbols-outlined">
fullscreen
</span>
</div>
<img src="/calibrationImage">
</div>
</div>
<div class="ntsh_tab" tabid="cameralogs">
<div class="ntsh_logs mux_text">
<div class="ntsh_log ntsh_log-fill">
No logs yet...
</div>
</div>
</div>
<div class="ntsh_tab" tabid="unitylogs">
<div class="ntsh_logs mux_text">
<div class="ntsh_log ntsh_log-fill">
No logs yet...
</div>
</div>
</div>
</div>
</div>
</body>
</html>

942
frontend/views/dashboard/package-lock.json generated Normal file
View File

@@ -0,0 +1,942 @@
{
"name": "dashboard",
"version": "2025.5.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"license": "ISC",
"dependencies": {
"@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-json": "^6.1.0",
"@rollup/plugin-node-resolve": "^15.1.0",
"@types/node": "^20.12.8",
"ansi_up": "^6.0.6",
"material-symbols": "^0.17.4",
"morphux": "file:../../../../MorphUX",
"rollup": "^2.79.1",
"rollup-plugin-terser": "^7.0.2",
"socket.io-client": "^4.8.1"
},
"devDependencies": {
"@types/sortablejs": "^1.15.8",
"dts-bundle-generator": "^9.5.1"
}
},
"../../../../MorphUx": {
"name": "morphux",
"version": "2025.9.1",
"extraneous": true,
"license": "ISC",
"dependencies": {
"@egjs/hammerjs": "^2.0.17",
"@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-json": "^6.1.0",
"@rollup/plugin-node-resolve": "^15.1.0",
"@types/node": "^20.12.8",
"material-symbols": "^0.17.4",
"rollup": "^2.79.1",
"rollup-plugin-terser": "^7.0.2",
"sortablejs": "^1.2.1"
},
"devDependencies": {
"@types/sortablejs": "^1.15.8",
"dts-bundle-generator": "^9.5.1"
}
},
"../../../../MorphUX": {
"name": "morphux",
"version": "2025.9.1",
"license": "ISC",
"dependencies": {
"@egjs/hammerjs": "^2.0.17",
"@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-json": "^6.1.0",
"@rollup/plugin-node-resolve": "^15.1.0",
"@types/node": "^20.12.8",
"material-symbols": "^0.17.4",
"rollup": "^2.79.1",
"rollup-plugin-terser": "^7.0.2",
"sortablejs": "^1.2.1"
},
"devDependencies": {
"@types/sortablejs": "^1.15.8",
"dts-bundle-generator": "^9.5.1"
}
},
"node_modules/@babel/code-frame": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
"integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
"dependencies": {
"@babel/helper-validator-identifier": "^7.27.1",
"js-tokens": "^4.0.0",
"picocolors": "^1.1.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0",
"@jridgewell/trace-mapping": "^0.3.24"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/source-map": {
"version": "0.3.11",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
"integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.31",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@rollup/plugin-commonjs": {
"version": "25.0.8",
"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz",
"integrity": "sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==",
"dependencies": {
"@rollup/pluginutils": "^5.0.1",
"commondir": "^1.0.1",
"estree-walker": "^2.0.2",
"glob": "^8.0.3",
"is-reference": "1.2.1",
"magic-string": "^0.30.3"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"rollup": "^2.68.0||^3.0.0||^4.0.0"
},
"peerDependenciesMeta": {
"rollup": {
"optional": true
}
}
},
"node_modules/@rollup/plugin-json": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz",
"integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==",
"dependencies": {
"@rollup/pluginutils": "^5.1.0"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
},
"peerDependenciesMeta": {
"rollup": {
"optional": true
}
}
},
"node_modules/@rollup/plugin-node-resolve": {
"version": "15.3.1",
"resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz",
"integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==",
"dependencies": {
"@rollup/pluginutils": "^5.0.1",
"@types/resolve": "1.20.2",
"deepmerge": "^4.2.2",
"is-module": "^1.0.0",
"resolve": "^1.22.1"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"rollup": "^2.78.0||^3.0.0||^4.0.0"
},
"peerDependenciesMeta": {
"rollup": {
"optional": true
}
}
},
"node_modules/@rollup/pluginutils": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz",
"integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==",
"dependencies": {
"@types/estree": "^1.0.0",
"estree-walker": "^2.0.2",
"picomatch": "^4.0.2"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
},
"peerDependenciesMeta": {
"rollup": {
"optional": true
}
}
},
"node_modules/@socket.io/component-emitter": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
"integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="
},
"node_modules/@types/estree": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="
},
"node_modules/@types/node": {
"version": "20.19.13",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.13.tgz",
"integrity": "sha512-yCAeZl7a0DxgNVteXFHt9+uyFbqXGy/ShC4BlcHkoE0AfGXYv/BUiplV72DjMYXHDBXFjhvr6DD1NiRVfB4j8g==",
"dependencies": {
"undici-types": "~6.21.0"
}
},
"node_modules/@types/resolve": {
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
"integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="
},
"node_modules/@types/sortablejs": {
"version": "1.15.8",
"resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.8.tgz",
"integrity": "sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==",
"dev": true
},
"node_modules/acorn": {
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/ansi_up": {
"version": "6.0.6",
"resolved": "https://registry.npmjs.org/ansi_up/-/ansi_up-6.0.6.tgz",
"integrity": "sha512-yIa1x3Ecf8jWP4UWEunNjqNX6gzE4vg2gGz+xqRGY+TBSucnYp6RRdPV4brmtg6bQ1ljD48mZ5iGSEj7QEpRKA==",
"license": "MIT",
"engines": {
"node": "*"
}
},
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
},
"node_modules/cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"dev": true,
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.1",
"wrap-ansi": "^7.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
},
"node_modules/commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
"integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
},
"node_modules/debug": {
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
"dependencies": {
"ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/deepmerge": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/dts-bundle-generator": {
"version": "9.5.1",
"resolved": "https://registry.npmjs.org/dts-bundle-generator/-/dts-bundle-generator-9.5.1.tgz",
"integrity": "sha512-DxpJOb2FNnEyOzMkG11sxO2dmxPjthoVWxfKqWYJ/bI/rT1rvTMktF5EKjAYrRZu6Z6t3NhOUZ0sZ5ZXevOfbA==",
"dev": true,
"dependencies": {
"typescript": ">=5.0.2",
"yargs": "^17.6.0"
},
"bin": {
"dts-bundle-generator": "dist/bin/dts-bundle-generator.js"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"node_modules/engine.io-client": {
"version": "6.6.3",
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz",
"integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==",
"dependencies": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1",
"engine.io-parser": "~5.2.1",
"ws": "~8.17.1",
"xmlhttprequest-ssl": "~2.1.1"
}
},
"node_modules/engine.io-parser": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
"integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
},
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
},
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true,
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/glob": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
"integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
"deprecated": "Glob versions prior to v9 are no longer supported",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^5.0.1",
"once": "^1.3.0"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"engines": {
"node": ">=8"
}
},
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/is-core-module": {
"version": "2.16.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
"integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
"dependencies": {
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/is-module": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
"integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="
},
"node_modules/is-reference": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
"integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
"dependencies": {
"@types/estree": "*"
}
},
"node_modules/jest-worker": {
"version": "26.6.2",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
"integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
"dependencies": {
"@types/node": "*",
"merge-stream": "^2.0.0",
"supports-color": "^7.0.0"
},
"engines": {
"node": ">= 10.13.0"
}
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"node_modules/magic-string": {
"version": "0.30.19",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz",
"integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.5"
}
},
"node_modules/material-symbols": {
"version": "0.17.4",
"resolved": "https://registry.npmjs.org/material-symbols/-/material-symbols-0.17.4.tgz",
"integrity": "sha512-5zI+rSzAidMJxAIrQCVwnp4rMjFnx8aQg68lfFXtaDeksZzJ7m8eDl16y9bRNxMosuYbLKeDHDbOWHPJJTSLhQ=="
},
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
},
"node_modules/minimatch": {
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/morphux": {
"resolved": "../../../../MorphUX",
"link": true
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dependencies": {
"wrappy": "1"
}
},
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
},
"node_modules/picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"dependencies": {
"safe-buffer": "^5.1.0"
}
},
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/resolve": {
"version": "1.22.10",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
"integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
"dependencies": {
"is-core-module": "^2.16.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/rollup": {
"version": "2.79.2",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
"integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
"bin": {
"rollup": "dist/bin/rollup"
},
"engines": {
"node": ">=10.0.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/rollup-plugin-terser": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
"integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
"deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser",
"dependencies": {
"@babel/code-frame": "^7.10.4",
"jest-worker": "^26.2.1",
"serialize-javascript": "^4.0.0",
"terser": "^5.0.0"
},
"peerDependencies": {
"rollup": "^2.0.0"
}
},
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/serialize-javascript": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
"integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
"dependencies": {
"randombytes": "^2.1.0"
}
},
"node_modules/socket.io-client": {
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz",
"integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==",
"dependencies": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.2",
"engine.io-client": "~6.6.1",
"socket.io-parser": "~4.2.4"
},
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/socket.io-parser": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
"integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
"dependencies": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1"
},
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/terser": {
"version": "5.44.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz",
"integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==",
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
"acorn": "^8.15.0",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
"bin": {
"terser": "bin/terser"
},
"engines": {
"node": ">=10"
}
},
"node_modules/typescript": {
"version": "5.9.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz",
"integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
},
"node_modules/undici-types": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="
},
"node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
},
"node_modules/ws": {
"version": "8.17.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
"integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
},
"node_modules/xmlhttprequest-ssl": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
"integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true,
"engines": {
"node": ">=10"
}
},
"node_modules/yargs": {
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
"dependencies": {
"cliui": "^8.0.1",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.3",
"y18n": "^5.0.5",
"yargs-parser": "^21.1.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/yargs-parser": {
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"dev": true,
"engines": {
"node": ">=12"
}
}
}
}

View File

@@ -0,0 +1,27 @@
{
"scripts": {
"build": "sass scss/index.scss style.css && tsc && npm run bundle",
"watch-ts": "tsc -w",
"watch-scss": "sass scss/index.scss style.css -w",
"watch-rollup": "rollup -c --watch",
"watch-rebuildscss": "rm style.css && npm run watch-scss"
},
"author": "",
"license": "ISC",
"dependencies": {
"@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-json": "^6.1.0",
"@rollup/plugin-node-resolve": "^15.1.0",
"@types/node": "^20.12.8",
"ansi_up": "^6.0.6",
"material-symbols": "^0.17.4",
"morphux": "file:../../../../MorphUX",
"rollup": "^2.79.1",
"rollup-plugin-terser": "^7.0.2",
"socket.io-client": "^4.8.1"
},
"devDependencies": {
"@types/sortablejs": "^1.15.8",
"dts-bundle-generator": "^9.5.1"
}
}

View File

@@ -0,0 +1,19 @@
import cjs from '@rollup/plugin-commonjs';
import node from '@rollup/plugin-node-resolve';
import { terser } from 'rollup-plugin-terser';
import json from '@rollup/plugin-json';
const production = !process.env.ROLLUP_WATCH;
export default {
input: 'dist/main.js',
output: [
{ file: 'script.js', format: 'iife', sourcemap: true, inlineDynamicImports: true }
],
plugins: [
node({ browser: true }),
cjs(),
production && terser(),
json()
],
};

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,31 @@
.ntsh_calibration {
position: absolute;
inset: 0px;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
padding: var(--mux-edge-offset);
.ntsh_calibration-fullscreen {
position: absolute;
top: var(--mux-edge-offset);
right: var(--mux-edge-offset);
transition-duration: .2s;
cursor: pointer;
&:hover {
opacity: .7;
}
span {
font-size: 24px;
}
}
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}

View File

@@ -0,0 +1,178 @@
.ntsh_dashboard {
position: absolute;
inset: 0px;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(600px, 100%), 1fr));
grid-auto-rows: min-content;
align-items: stretch;
justify-items: stretch;
align-content: start;
overflow-y: auto;
gap: var(--mux-edge-offset);
box-sizing: border-box;
padding: var(--mux-edge-offset);
.ntsh_dashboard-box {
background: var(--mux-selected-color);
box-sizing: border-box;
padding: var(--mux-edge-offset);
border-radius: var(--mux-rounding);
.ntsh_dashboard-box-header {
padding-bottom: var(--mux-edge-offset-tiny);
border-bottom: 1px solid #979797;
margin-bottom: var(--mux-edge-offset-tiny);
font-size: 18px;
}
.mux_header:not(.ntsh_dashboard-box-header) {
margin-bottom: var(--mux-edge-offset-tiny);
}
}
.ntsh_dashboard-unity-parameters {
.ntsh_dashboard-unity-parameters-loading {
text-align: center;
color: #9d9d9d;
}
}
table {
width: 100%;
&.ntsh_vertical {
tr td {
height: 24px;
&:first-child {
width: min(150px, 20vw);
}
}
}
&.ntsh_horizontal {}
&.ntsh_center {
tr td {
text-align: center;
.ntsh_status {
margin: 0 auto;
}
}
}
tr {
td {
&:has(.ntsh_status) {
width: 30px;
}
}
}
}
.ntsh_dashboard-error {
display: none;
box-sizing: border-box;
padding: var(--mux-edge-offset-tiny);
border-radius: var(--mux-rounding);
margin-top: var(--mux-edge-offset-tiny);
background: #721e1e;
}
.ntsh_progress {
position: relative;
background: #2f2f2f;
width: 100%;
height: 20px;
border-radius: 4px;
overflow: hidden;
.ntsh_progress-value {
height: 100%;
background: #777777;
&.ntsh_progress-smooth {
transition-duration: .3s;
transition-timing-function: ease-in-out;
}
&.mux_resizer {
transition-duration: 0s;
.mux_resizer-grab {
background: var(--mux-primary-color);
border-radius: 4px;
height: 100%;
}
}
}
.ntsh_progress-label {
position: absolute;
z-index: 101;
inset: 0px;
display: flex;
justify-content: center;
align-items: center;
font-size: 12px;
color: #fff;
font-weight: 500;
text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000;
pointer-events: none;
}
}
.ntsh_status {
width: 24px;
height: 24px;
background: #868686;
border: 4px solid #00000071;
border-radius: 100%;
box-sizing: border-box;
&.ntsh_status-green {
background: #149214;
}
&.ntsh_status-yellow {
background: #ffbf00;
}
&.ntsh_status-red {
background: #ff0000;
}
&.ntsh_status-gray {
background: #868686;
}
}
.ntsh_buttons {
width: 100%;
display: flex;
justify-content: flex-end;
flex-wrap: wrap;
gap: var(--mux-edge-offset-tiny);
.ntsh_button {
min-width: 30px;
height: 30px;
box-sizing: border-box;
padding: 0px 4px;
display: flex;
justify-content: center;
align-items: center;
background: #787878;
cursor: pointer;
transition: background .2s;
&:hover {
background: #5a5a5a;
}
}
}
}

View File

@@ -0,0 +1,79 @@
@use '../node_modules/morphux/style.css';
@use './dashboard.scss';
@use './tabs.scss';
@use './calibration.scss';
:root {
--mux-primary-color: #247476;
--mux-primary-off-color: #1d5253;
}
body {
&:not(.ntsh_service) {
.ntsh_buttons {
display: none;
}
.mux_menubar-locater.mux_left {
.mux_menubar-item {
display: none;
}
}
.only-service {
display: none;
}
}
&.ntsh_service {
.no-service {
display: none;
}
}
}
.sn {
position: absolute;
inset: 0px;
overflow: hidden;
.ntsh_menubar {
position: absolute;
top: 0px;
left: 0px;
right: 0px;
height: 100%;
.mux_menubar {
.mux_menubar-item.mux_menubar-item-selected {
background: var(--mux-primary-off-color);
}
}
}
.ntsh_logs {
position: absolute;
inset: 0px;
box-sizing: border-box;
padding: var(--mux-edge-offset);
font-family: monospace;
background: black;
overflow-y: auto;
.ntsh_log {
&.ntsh_log-fill {
height: 100%;
display: flex;
justify-content: center;
align-items: center;
color: #939393;
}
&.ntsh_log-normal {
color: #c7c7c7;
}
}
}
}

View File

@@ -0,0 +1,14 @@
.ntsh_tabs {
position: absolute;
inset: 50px 0 0 0;
.ntsh_tab {
position: absolute;
inset: 0px;
display: none;
&.ntsh_tab-visible {
display: block;
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,40 @@
import { Main } from './main';
export class Calibration {
private _Main: Main;
container: HTMLDivElement = document.querySelector('.ntsh_calibration');
image: HTMLImageElement = this.container.querySelector('img');
fullscreenButton: HTMLDivElement = this.container.querySelector(
'.ntsh_calibration-fullscreen'
);
constructor(Main: Main) {
this._Main = Main;
this.registerListeners();
}
private fetchClock: NodeJS.Timeout;
startFetchClock() {
this.image.src = `/calibrationImage?t=${Date.now()}`;
this.fetchClock = setInterval(() => {
this.image.src = `/calibrationImage?t=${Date.now()}`;
}, 1000);
}
stopFetchClock() {
clearInterval(this.fetchClock);
}
private registerListeners() {
this._Main.TabController.registerListener('calibration', (visible) => {
if (visible) this.startFetchClock();
else this.stopFetchClock();
});
this.fullscreenButton.addEventListener('click', () => {
this.image.requestFullscreen();
});
}
}

View File

@@ -0,0 +1,192 @@
import { MorphFeature } from 'morphux';
import { Main } from './main';
import {
formatUptime,
ServiceState,
setStatusState,
StatusType,
} from './utils';
const CELCIUS = 'ºC';
export class DashboardCameraRunner {
private _Main: Main;
container: HTMLDivElement = document.querySelector(
'.ntsh_dashboard-camerarunner'
);
connectionStatus: HTMLDivElement = this.container.querySelector(
'.ntsh_dashboard-camerarunner-connectionstatus'
);
connectionInfo: HTMLDivElement = this.container.querySelector(
'.ntsh_dashboard-camerarunner-connectioninfo'
);
rebootButton: HTMLDivElement = this.container.querySelector(
'.ntsh_dashboard-camerarunner-reboot'
);
processStatus: HTMLDivElement = this.container.querySelector(
'.ntsh_dashboard-camerarunner-processstatus'
);
processInfo: HTMLDivElement = this.container.querySelector(
'.ntsh_dashboard-camerarunner-processinfo'
);
restartButton: HTMLDivElement = this.container.querySelector(
'.ntsh_dashboard-camerarunner-restart'
);
uptimeInfo: HTMLDivElement = this.container.querySelector(
'.ntsh_dashboard-camerarunner-uptime'
);
errorContainer: HTMLDivElement = this.container.querySelector(
'.ntsh_dashboard-camerarunner-error'
);
errorText: HTMLDivElement = this.container.querySelector(
'.ntsh_dashboard-camerarunner-errortext'
);
constructor(Main: Main) {
this._Main = Main;
this.registerListeners();
}
updateState(state: CameraRunnerStatus) {
// ----------- Connection -----------
setStatusState(
this.connectionStatus,
{
CONNECTING: 'yellow',
CONNECTED: 'green',
DISCONNECTED: 'red',
FAILED: 'red',
}[state.state] as StatusType
);
this.connectionInfo.innerText = state.message ?? '';
// ----------- Process -----------
if (state.state != 'CONNECTED') {
state.processStatus.state = 'STOPPED';
state.processStatus.message = 'Not connected';
state.processStatus.startTime = -1;
this.restartButton.style.display = 'none';
this.rebootButton.style.display = 'none';
} else {
this.rebootButton.style.display = 'flex';
if (state.processStatus.state == 'RUNNING')
this.restartButton.style.display = 'flex';
else this.restartButton.style.display = 'none';
}
setStatusState(
this.processStatus,
{
RUNNING: 'green',
STOPPED: 'gray',
STARTING: 'yellow',
PROBLEM: 'red',
}[state.processStatus.state] as StatusType
);
this.processInfo.innerText = state.processStatus.message ?? '';
// ----------- Uptime -----------
const uptimeSeconds =
state.processStatus.startTime == -1
? -1
: (Date.now() - state.processStatus.startTime) / 1000;
this.uptimeInfo.innerText = formatUptime(uptimeSeconds);
// ----------- Error -----------
const errors: string[] = [];
if ((state?.error ?? '').trim().length > 0) errors.push(state.error);
if ((state?.processStatus?.error ?? '').trim().length > 0)
errors.push(state.processStatus.error);
if (errors.length > 0) {
this.errorText.innerText = errors.join('\n');
this.errorContainer.style.display = 'block';
} else {
this.errorContainer.style.display = 'none';
this.errorText.innerText = '';
}
this._Main.Logs.setCameraLogs(state.processStatus.output.current);
}
registerListeners() {
this._Main.socket.on(
'cameraRunnerState',
(state: CameraRunnerStatus) => {
this.updateState(state);
}
);
this.restartButton.addEventListener('click', async () => {
this.executeCommand(
'restart',
'Are you sure you want to restart the Camera Runner process?'
);
});
this.rebootButton.addEventListener('click', async () => {
this.executeCommand(
'reboot',
'Are you sure you want to reboot the Camera Runner machine?'
);
});
}
private async executeCommand(command: string, message: string) {
const confirmed = await MorphFeature.Confirm({
title: 'Are you sure?',
message,
});
if (!confirmed) return;
MorphFeature.Loader({
active: true,
message: `Requesting Camera Runner ${command}...`,
});
this._Main.socket.emit(
'cameraRunner',
command,
(response: { succeed: boolean; message?: string }) => {
MorphFeature.Loader({ active: false });
if (!response.succeed)
return MorphFeature.Alert({
title: 'Error',
message: response.message,
});
MorphFeature.Notification({
level: 'success',
message: `Camera Runner is ${command}ing...`,
});
}
);
}
}
interface CameraRunnerStatus {
state: ServiceState;
message?: string;
error?: string;
processStatus: ProcessStatus;
}
export type ProcessStatusState = 'RUNNING' | 'STOPPED' | 'STARTING' | 'PROBLEM';
interface ProcessStatusSimple {
state: ProcessStatusState;
message?: string;
error?: string;
}
interface ProcessStatus extends ProcessStatusSimple {
startTime: number;
output: { current: string[]; last: string[] };
}

View File

@@ -0,0 +1,353 @@
import { ce, MorphComponent, MorphFeature } from 'morphux';
import { Main } from './main';
import {
createProgress,
formatUptime,
ServiceState,
setProgressState,
setStatusState,
StatusType,
} from './utils';
export class DashboardUnity {
private _Main: Main;
container: HTMLDivElement = document.querySelector('.ntsh_dashboard-unity');
processStatus: HTMLDivElement = document.querySelector(
'.ntsh_dashboard-unity-processstatus'
);
processInfo: HTMLDivElement = document.querySelector(
'.ntsh_dashboard-unity-processinfo'
);
restartButton: HTMLDivElement = document.querySelector(
'.ntsh_dashboard-unity-restart'
);
uptimeInfo: HTMLDivElement = document.querySelector(
'.ntsh_dashboard-unity-uptime'
);
webSocketStatus: HTMLDivElement = document.querySelector(
'.ntsh_dashboard-unity-websocketstatus'
);
webSocketInfo: HTMLDivElement = document.querySelector(
'.ntsh_dashboard-unity-websocketinfo'
);
zedStreamStatus: HTMLDivElement = document.querySelector(
'.ntsh_dashboard-unity-zedstreamstatus'
);
zedStreamInfo: HTMLDivElement = document.querySelector(
'.ntsh_dashboard-unity-zedstreaminfo'
);
zedStreamFps: HTMLDivElement = document.querySelector(
'.ntsh_dashboard-unity-zedstreamfps'
);
zedStreamPath: HTMLDivElement = document.querySelector(
'.ntsh_dashboard-unity-zedstreampath'
);
timelineWatching: HTMLDivElement = document.querySelector(
'.ntsh_dashboard-unity-timeline-watching'
);
timelineStanding: HTMLDivElement = document.querySelector(
'.ntsh_dashboard-unity-timeline-standing'
);
timelineProgress: HTMLDivElement = document.querySelector(
'.ntsh_dashboard-unity-timeline-progress'
);
parametersTable: HTMLTableElement = document.querySelector(
'.ntsh_dashboard-unity-parameters'
);
errorContainer: HTMLDivElement = document.querySelector(
'.ntsh_dashboard-unity-error'
);
errorText: HTMLDivElement = document.querySelector(
'.ntsh_dashboard-unity-errortext'
);
constructor(Main: Main) {
this._Main = Main;
this.registerListeners();
}
private runnerError: string;
updateRunnerState(state: UnityRunnerStatus) {
// ----------- Process -----------
if (state.state != 'RUNNING') {
state.startTime = -1;
this.restartButton.style.display = 'none';
} else {
this.restartButton.style.display = 'flex';
}
setStatusState(
this.processStatus,
{
RUNNING: 'green',
STOPPED: 'red',
STARTING: 'yellow',
PROBLEM: 'red',
}[state.state] as StatusType
);
this.processInfo.innerText = state.message ?? '';
// ----------- Uptime -----------
const uptimeSeconds =
state.startTime == -1 ? -1 : (Date.now() - state.startTime) / 1000;
this.uptimeInfo.innerText = formatUptime(uptimeSeconds);
// ----------- Error -----------
if ((state?.error ?? '').trim().length > 0)
this.runnerError = state.error;
else this.runnerError = null;
this.updateError();
this._Main.Logs.setUnityLogs(state.output.current);
}
private webSocketError: string;
updateWebSocketState(state: UnityWebSocketStatus) {
// ----------- WebSocket -----------
setStatusState(
this.webSocketStatus,
{
CONNECTING: 'yellow',
CONNECTED: 'green',
DISCONNECTED: 'gray',
FAILED: 'red',
}[state.state] as StatusType
);
this.webSocketInfo.innerText = state.message ?? '';
// ----------- ZED Stream -----------
setStatusState(
this.zedStreamStatus,
state.parameters.zedReady ? 'green' : 'red'
);
this.zedStreamInfo.innerText = state.parameters.zedReady
? `Connected to ${state.parameters.zedPath}`
: 'Not ready';
this.zedStreamFps.innerText =
state.parameters.zedFPS == '-' ? '' : state.parameters.zedFPS;
// ----------- Timeline -----------
this.timelineWatching.innerText = state.parameters.timelineWatching
? 'Yes'
: 'No';
this.timelineStanding.innerText = state.parameters.timelineStanding
? 'Yes'
: 'No';
setProgressState(
this.timelineProgress,
state.parameters.timelineProgress
);
// ----------- Parameters -----------
this.renderParameterSliders(state.parameters.parameters);
// ----------- Error -----------
if ((state?.error ?? '').trim().length > 0)
this.webSocketError = state.error;
else this.webSocketError = null;
this.updateError();
}
private renderParameterSliders(parameters: UnityParameters['parameters']) {
if (parameters.length === 0) return;
const existingSliders = this.parametersTable.querySelectorAll(
'.ntsh_dashboard-unity-parameter-row'
);
if (existingSliders.length !== parameters.length) {
this.parametersTable.innerHTML = '';
parameters.forEach((param) => {
const row = ce('tr', 'ntsh_dashboard-unity-parameter-row');
const nameCell = ce('td');
nameCell.appendChild(
ce('div', 'mux_text', null, param.sliderName)
);
row.appendChild(nameCell);
const progressCell = ce('td', 'no-service');
progressCell.appendChild(createProgress(param.outputValue));
row.appendChild(progressCell);
const sliderCell = ce('td', 'only-service');
const sliderProgress = createProgress(param.outputValue);
const sliderValue: HTMLDivElement =
sliderProgress.querySelector('.ntsh_progress-value');
sliderValue.classList.add('mux_resizer');
sliderCell.appendChild(sliderProgress);
const resizer = new MorphComponent.Resizer({
existingContainer: sliderValue,
direction: 'right',
relative: true,
min: 0,
max: () => sliderProgress.clientWidth,
});
let lastPercentage: number = -1;
resizer.on('resized', (size) => {
const percentage =
Math.round((size / sliderProgress.clientWidth) * 100) /
100;
if (percentage === lastPercentage) return;
lastPercentage = percentage;
this._Main.socket.emit(
'unityWebSocket',
'parameterValue',
param.sliderIndex,
percentage
);
setProgressState(sliderProgress, percentage);
});
row.appendChild(sliderCell);
this.parametersTable.appendChild(row);
});
} else {
existingSliders.forEach((row, index) => {
const value = parameters[index].outputValue;
const progressElement: HTMLDivElement = row.querySelector(
'.no-service .ntsh_progress'
);
setProgressState(progressElement, value);
const sliderElement: HTMLDivElement = row.querySelector(
'.only-service .ntsh_progress'
);
if (sliderElement.querySelector('.mux_resizer-moving') == null)
setProgressState(sliderElement, value);
});
}
}
private updateError() {
const errors: string[] = [];
if (this.runnerError != null) errors.push(this.runnerError);
if (this.webSocketError != null) errors.push(this.webSocketError);
if (errors.length > 0) {
this.errorText.innerText = errors.join('\n');
this.errorContainer.style.display = 'block';
} else {
this.errorContainer.style.display = 'none';
this.errorText.innerText = '';
}
}
registerListeners() {
this._Main.socket.on('unityRunnerState', (state: UnityRunnerStatus) =>
this.updateRunnerState(state)
);
this._Main.socket.on(
'unityWebSocketState',
(state: UnityWebSocketStatus) => this.updateWebSocketState(state)
);
this.restartButton.addEventListener('click', async () => {
this.executeCommand(
'restart',
'Are you sure you want to restart the Unity Runner process?'
);
});
}
private async executeCommand(command: string, message: string) {
const confirmed = await MorphFeature.Confirm({
title: 'Are you sure?',
message,
});
if (!confirmed) return;
MorphFeature.Loader({
active: true,
message: `Requesting Unity Runner ${command}...`,
});
this._Main.socket.emit(
'unityRunner',
command,
(response: { succeed: boolean; message?: string }) => {
MorphFeature.Loader({ active: false });
if (!response.succeed)
return MorphFeature.Alert({
title: 'Error',
message: response.message,
});
MorphFeature.Notification({
level: 'success',
message: `Unity Runner is ${command}ing...`,
});
}
);
}
}
interface UnityRunnerStatus {
state: 'RUNNING' | 'STOPPED' | 'STARTING' | 'PROBLEM';
message?: string;
error?: string;
startTime: number;
output: { current: string[]; last: string[] };
}
interface UnityWebSocketStatus {
state: ServiceState;
message?: string;
error?: string;
parameters: UnityParameters;
}
interface UnityParameters {
timelineWatching: boolean;
timelineStanding: boolean;
timelineProgress: number;
zedPath: string;
zedReady: boolean;
zedFPS: string;
parameters: UnitySocketMessageHeartbeat['heartbeat']['dataSliders'];
}
interface UnitySocketMessageBase {
type: string;
timestamp: number;
}
interface UnitySocketMessageHeartbeat extends UnitySocketMessageBase {
type: 'heartbeat_data';
heartbeat: {
dataSliders: {
sliderIndex: number;
sliderName: string;
outputValue: number;
}[];
dataTimeline: {
isStanding: boolean;
isWatching: boolean;
timelineProgress: number;
};
zedCamera: {
cameraFPS: string;
isZedReady: boolean;
streamInputIP: string;
streamInputPort: number;
zedGrabError: number;
};
};
}

View File

@@ -0,0 +1,96 @@
import { ce } from 'morphux';
import { delay } from './utils';
import { Main } from './main';
import { AnsiUp } from 'ansi_up';
export class LogsHandler {
private _Main: Main;
ansiUp = new AnsiUp();
cameraLogsContainer: HTMLDivElement = document.querySelector(
'.ntsh_tab[tabid="cameralogs"] .ntsh_logs'
);
unityLogsContainer: HTMLDivElement = document.querySelector(
'.ntsh_tab[tabid="unitylogs"] .ntsh_logs'
);
constructor(Main: Main) {
this._Main = Main;
this.registerListeners();
}
setCameraLogs(logs: string[]) {
this.applyLogs(this.cameraLogsContainer, logs);
}
setUnityLogs(logs: string[]) {
this.applyLogs(this.unityLogsContainer, logs);
}
private firstTime: Set<HTMLDivElement> = new Set();
private async applyLogs(container: HTMLDivElement, logs: string[]) {
let logCount = container.querySelectorAll(
'.ntsh_log.ntsh_log-normal'
).length;
if (logCount === logs.length) return;
if (logCount > logs.length) logCount = 0;
const isAtBottom =
!this.firstTime.has(container) ||
container.scrollTop + container.clientHeight >=
container.scrollHeight;
container.innerHTML = '';
logs.forEach((log, i) => {
const element = ce(
'div',
['ntsh_log', 'ntsh_log-normal'],
null,
null,
this.ansiUp.ansi_to_html(log)
);
if (this.firstTime.has(container) && i > logCount - 1) {
element.style.display = 'none';
const spawnDelay = (i - logCount) * 10;
setTimeout(() => {
element.style.display = 'block';
if (isAtBottom)
container.scrollTop = container.scrollHeight;
}, spawnDelay);
}
container.appendChild(element);
if (isAtBottom) container.scrollTop = container.scrollHeight;
});
if (!this.firstTime.has(container)) {
container.scrollTop = container.scrollHeight;
this.firstTime.add(container);
}
}
private registerListeners() {
this._Main.TabController.registerListener('cameralogs', (visible) => {
if (!visible) return;
setTimeout(() => {
this.cameraLogsContainer.scrollTop =
this.cameraLogsContainer.scrollHeight;
}, 10);
});
this._Main.TabController.registerListener('unitylogs', (visible) => {
if (!visible) return;
setTimeout(() => {
this.unityLogsContainer.scrollTop =
this.unityLogsContainer.scrollHeight;
}, 10);
});
}
}

View File

@@ -0,0 +1,37 @@
import { io } from 'socket.io-client';
import { MenuBar } from './menuBar';
import { TabController } from './tabController';
import { MorphFeature } from 'morphux';
import { DashboardCameraRunner } from './dashboard.camerarunner';
import { LogsHandler } from './logsHandler';
import { Calibration } from './calibration';
import { DashboardUnity } from './dashboard.unity';
const socket = io('/');
export class Main {
socket = socket;
MenuBar = new MenuBar(this);
TabController = new TabController(this);
Logs = new LogsHandler(this);
Calibration = new Calibration(this);
DashboardCameraRunner = new DashboardCameraRunner(this);
DashboardUnityRunner = new DashboardUnity(this);
constructor() {
if (window.location.search.includes('debug')) {
(window as any).SN = this;
console.log('Debug mode enabled');
}
}
}
MorphFeature.Loader({ active: true, message: 'Connecting to server...' });
socket.on('connect', () => {
console.log('Connected to server');
MorphFeature.Loader({ active: false });
});
const _Main = new Main();

View File

@@ -0,0 +1,142 @@
import { MorphComponent, MorphFeature } from 'morphux';
import { Main } from './main';
import { ComponentMenuBar } from 'morphux/dist/Components/MenuBar/Component.MenuBar';
export class MenuBar {
private _Main: Main;
container: HTMLDivElement = document.querySelector('.ntsh_menubar');
menubar: ComponentMenuBar;
constructor(main: Main) {
this._Main = main;
this.build();
setTimeout(() => {
if (localStorage?.getItem('serviceMode') === 'true')
this.toggleServiceMode(true, true);
}, 10);
}
build() {
this.menubar = new ComponentMenuBar({
left: [
{
type: 'image',
url: '/img/morphix_logo_white.png',
},
{
type: 'normal',
text: 'Dashboard',
materialIcon: 'dashboard',
uniqueIdentifier: 'dashboard',
selected: true,
click: () => this._Main.TabController.showTab('dashboard'),
},
{
type: 'normal',
text: 'Calibration',
uniqueIdentifier: 'calibration',
materialIcon: 'crop_free',
click: () =>
this._Main.TabController.showTab('calibration'),
},
{
type: 'normal',
text: 'Unity Logs',
uniqueIdentifier: 'unitylogs',
materialIcon: 'deployed_code',
click: () => this._Main.TabController.showTab('unitylogs'),
},
{
type: 'normal',
text: 'Camera Logs',
uniqueIdentifier: 'cameralogs',
materialIcon: 'photo_camera',
click: () => this._Main.TabController.showTab('cameralogs'),
},
],
right: [
{
type: 'normal',
text: document.body.classList.contains('ntsh_service')
? 'Exit Service'
: 'Service Mode',
uniqueIdentifier: 'serviceMode',
materialIcon: document.body.classList.contains(
'ntsh_service'
)
? 'logout'
: 'engineering',
click: async () => {
const mobileMenu: HTMLDivElement =
document.querySelector('.mux_mobilemenu');
mobileMenu?.click();
this.toggleServiceMode();
},
},
],
});
this.container.innerHTML = '';
this.container.appendChild(this.menubar.container);
}
async toggleServiceMode(
mode?: boolean,
skipPin?: boolean
): Promise<boolean> {
const newMode =
mode ?? !document.body.classList.contains('ntsh_service');
if (newMode) {
if (skipPin !== true) {
const servicePin: string = await MorphFeature.Prompt({
title: 'Service Mode',
message: 'Enter the service PIN:',
type: 'number',
canBeEmpty: false,
placeholder: '****',
});
if (servicePin !== '4252') {
MorphFeature.Alert({
title: 'Error',
message: 'Incorrect PIN provided.',
});
return false;
}
}
document.body.classList.add('ntsh_service');
localStorage.setItem('serviceMode', 'true');
MorphFeature.Notification({
level: 'success',
message: 'Service mode activated.',
});
} else {
document.body.classList.remove('ntsh_service');
this._Main.TabController.showTab('dashboard');
localStorage.setItem('serviceMode', 'false');
MorphFeature.Notification({
level: 'success',
message: 'Service mode deactivated.',
});
}
this.build();
return true;
}
}

View File

@@ -0,0 +1,88 @@
import { MorphFeature } from 'morphux';
import { Main } from './main';
export type Tabs = 'dashboard' | 'calibration' | 'cameralogs' | 'unitylogs';
export class TabController {
private _Main: Main;
container: HTMLDivElement = document.querySelector('.ntsh_tabs');
currentTabId: Tabs;
constructor(main: Main) {
this._Main = main;
this.registerNavigationListener();
}
private tabListeners: Map<Tabs, (visible: boolean) => void> = new Map();
registerListener(tabId: Tabs, callback: (visible: boolean) => void) {
if (this.tabListeners.has(tabId))
throw new Error(
`Listener for tab id ${tabId} has already been registered!`
);
this.tabListeners.set(tabId, callback);
callback(this.currentTabId == tabId);
}
async showTab(tabId: Tabs) {
if (this.currentTabId == tabId) return;
if (
tabId !== 'dashboard' &&
!document.body.classList.contains('ntsh_service')
) {
const confirmed = await MorphFeature.Confirm({
title: 'Service Mode Required',
message: `You need to be in service mode to access tab ${tabId}, switch to Service Mode now?`,
});
if (!confirmed) return this.showTab('dashboard');
const succeed = await this._Main.MenuBar.toggleServiceMode(true);
if (!succeed) return this.showTab('dashboard');
}
this._Main.MenuBar.menubar.setSelected(tabId);
if (this.tabListeners.has(this.currentTabId))
this.tabListeners.get(this.currentTabId)(false);
if (this.tabListeners.has(tabId)) this.tabListeners.get(tabId)(true);
this.currentTabId = tabId;
this.container
.querySelectorAll('.ntsh_tab')
.forEach((tab) => tab.classList.remove('ntsh_tab-visible'));
this.container
.querySelector(`.ntsh_tab[tabid="${tabId}"]`)
.classList.add('ntsh_tab-visible');
window.history.pushState(
{ tab: tabId },
'',
`/${tabId}${window.location.search}`
);
var tabName = {
dashboard: 'Dashboard',
calibration: 'Calibration',
cameralogs: 'Camera Logs',
unitylogs: 'Unity Logs',
}[tabId];
document.title = `NTSH Control - ${tabName}`;
}
private registerNavigationListener() {
window.addEventListener('popstate', (event) => {
const state = event.state;
if (state && state.tab) this.showTab(state.tab);
});
var startTab = window.location.pathname
.replace('/', '')
.split('/')
.shift() as Tabs;
this.showTab(startTab.length > 0 ? startTab : 'dashboard');
}
}

View File

@@ -0,0 +1,81 @@
import { ce } from 'morphux';
/**
* A linear interpolation helper function.
* @param a The start value.
* @param b The end value.
* @param t The interpolation factor (0 to 1).
* @returns The interpolated value.
*/
export const lerp = (a: number, b: number, t: number): number =>
a + (b - a) * t;
export const setStatusState = (
statusElement: HTMLDivElement,
state: StatusType
) => {
statusElement.classList.remove(
'ntsh_status-green',
'ntsh_status-yellow',
'ntsh_status-red',
'ntsh_status-gray'
);
statusElement.classList.add(`ntsh_status-${state}`);
};
export type StatusType = 'green' | 'yellow' | 'red' | 'gray';
export const setProgressState = (
progressElement: HTMLDivElement,
percentage: number
) => {
const value: HTMLDivElement = progressElement.querySelector(
'.ntsh_progress-value'
);
value.style.width = `${percentage * 100}%`;
const label: HTMLDivElement = progressElement.querySelector(
'.ntsh_progress-label'
);
label.innerText = `${Math.round(percentage * 100)}%`;
};
export const createProgress = (value: number) => {
const progress = ce('div', 'ntsh_progress');
progress.appendChild(ce('div', 'ntsh_progress-value'));
progress.appendChild(ce('div', 'ntsh_progress-label'));
setProgressState(progress, value);
return progress;
};
export function capitalizeFirstLetter(string: string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
export type ServiceState =
| 'CONNECTING'
| 'CONNECTED'
| 'DISCONNECTED'
| 'FAILED';
export function formatUptime(seconds: number): string {
if (seconds < 0) return '';
const days = Math.floor(seconds / 86400);
seconds %= 86400;
const hours = Math.floor(seconds / 3600);
seconds %= 3600;
const minutes = Math.floor(seconds / 60);
seconds = Math.floor(seconds % 60);
const parts = [];
if (days > 0) parts.push(`${days}d`);
parts.push(
`${hours.toString().padStart(2, '0')}:${minutes
.toString()
.padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`
);
return parts.join(' ');
}
export function delay(duration: number) {
return new Promise((resolve) => setTimeout(resolve, duration));
}

View File

@@ -0,0 +1,9 @@
{
"compilerOptions": {
"outDir": "dist",
"sourceMap": true
},
"include": [
"ts/**/*"
]
}