feat: full de-Angularization with Bootstrap 5 migration

- Removed AngularJS 1.4.8 completely — no more framework dependency
- Extracted core RCON logic into pure vanilla JS (js/rcon.js)
- Added lightweight hash-based SPA router (js/router.js)
- Rewrote all 6 pages as vanilla JS modules in js/pages/
- Migrated Bootstrap 3 → Bootstrap 5 (cards instead of panels, bootstrap-icons instead of glyphicons)
- Removed jQuery dependency (Bootstrap 5 is vanilla JS)
- Purged all Angular templates from html/
- Removed npm artifacts (package.json, node_modules)
- Added nginx.example.conf for static hosting
- Updated rcon.css dark theme for BS5 variables
- Static file only — no Node.js backend required

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
2026-06-13 17:51:50 +02:00
co-authored by Copilot
parent 0fd94044a8
commit 0a178d17b9
32 changed files with 1242 additions and 1702 deletions
+47 -50
View File
@@ -1,71 +1,68 @@
<!DOCTYPE html>
<html lang="en" ng-app="RconApp">
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Websocket Rcon</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/nvd3/1.8.2/nv.d3.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap-theme.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css" rel="stylesheet">
<link href="rcon.css" rel="stylesheet">
</head>
<body ng-controller="RconController">
<div ng-include="'html/header.html'" ng-show="Connected"></div>
<div class="container">
<div ng-include="'html/connect.html'" ng-show="!Connected"></div>
<div ng-show="Connected" class="col-sm-2 sidebar">
<ul class="nav nav-sidebar">
<li ng-repeat="page in pages" ng-class="{'active' : $route.current.Title == page.Title }">
<a href="#{{Nav( page.originalPath )}}">{{page.Title}}</a>
</li>
</ul>
<body class="bg-dark text-light">
<!-- Server info header (hidden until connected) -->
<nav class="navbar navbar-dark bg-primary" id="server-header" style="display:none">
<div class="container">
<a class="navbar-brand" href="#" id="header-hostname"></a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar-collapse-header">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbar-collapse-header">
<span class="navbar-text me-3" title="Uptime" id="header-uptime"></span>
<span class="navbar-text me-3" title="Map Name" id="header-map"></span>
<span class="navbar-text me-3" title="Players" id="header-players"></span>
<span class="navbar-text me-3" title="Framerate" id="header-fps"></span>
<span class="navbar-text me-3" title="Entity Count" id="header-entities"></span>
<button class="btn btn-danger ms-auto" type="button" id="btn-disconnect">Disconnect</button>
</div>
</div>
</nav>
<div class="col-sm-10" ng-show="Connected">
<h1 class="page-header">{{$route.current.Title}}</h1>
<div class="row" ng-view></div>
<!-- Main layout: hidden until connected -->
<div id="app-connected" style="display:none">
<div class="container">
<div class="row">
<div class="col-md-2">
<ul class="nav flex-column nav-sidebar" id="sidebar-nav"></ul>
</div>
<div class="col-md-10">
<h1 id="page-title"></h1>
<div id="app-view"></div>
</div>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<!-- Connect page: shown when not connected -->
<div id="app-connect" class="container"></div>
<!-- AngularJS -->
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-route.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-animate.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-aria.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-messages.min.js"></script>
<!-- Bootstrap -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/js/bootstrap.js"></script>
<!-- For charts -->
<!-- Bootstrap 5 JS (vanilla, no jQuery needed) -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<!-- Charts -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.16/d3.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/nvd3/1.8.1/nv.d3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-nvd3/1.0.9/angular-nvd3.min.js"></script>
<!-- Data manipulation -->
<script src="js/linq.min.js"></script>
<!-- Our stuff -->
<script src="js/rconService.js"></script>
<!-- App scripts -->
<script src="js/utils.js"></script>
<script src="js/rcon.js"></script>
<script src="js/router.js"></script>
<script src="js/pages/connect.js"></script>
<script src="js/pages/serverInfo.js"></script>
<script src="js/pages/console.js"></script>
<script src="js/pages/chat.js"></script>
<script src="js/pages/playerlist.js"></script>
<script src="js/pages/playerInfo.js"></script>
<script src="js/app.js"></script>
<script src="js/connection.js"></script>
<script src="js/serverInfo.js"></script>
<script src="js/console.js"></script>
<script src="js/playerlist.js"></script>
<script src="js/playerInfo.js"></script>
<script src="js/chat.js"></script>
</body>
</html>