jsgui3-server 0.0.149 → 0.0.150
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/agents/Mobile Developer.agent.md +89 -0
- package/AGENTS.md +4 -0
- package/README.md +130 -0
- package/admin-ui/client.js +73 -43
- package/admin-ui/v1/admin_auth_service.js +197 -0
- package/admin-ui/v1/admin_user_store.js +71 -0
- package/admin-ui/v1/client.js +17 -0
- package/admin-ui/v1/controls/admin_shell.js +1399 -0
- package/admin-ui/v1/controls/group_box.js +84 -0
- package/admin-ui/v1/controls/stat_card.js +125 -0
- package/admin-ui/v1/server.js +658 -0
- package/admin-ui/v1/utils/formatters.js +68 -0
- package/docs/admin-extension-guide.md +345 -0
- package/docs/books/adaptive-control-improvements/01-control-candidate-matrix.md +122 -0
- package/docs/books/adaptive-control-improvements/02-tier-1-layout-playbooks.md +207 -0
- package/docs/books/adaptive-control-improvements/03-tier-2-navigation-form-overlay.md +140 -0
- package/docs/books/adaptive-control-improvements/04-cross-cutting-platform-functionality.md +141 -0
- package/docs/books/adaptive-control-improvements/05-styling-theming-density-upgrades.md +114 -0
- package/docs/books/adaptive-control-improvements/06-testing-quality-gates.md +97 -0
- package/docs/books/adaptive-control-improvements/07-delivery-roadmap-and-ownership.md +137 -0
- package/docs/books/adaptive-control-improvements/08-appendix-tier1-acceptance-and-pr-templates.md +261 -0
- package/docs/books/adaptive-control-improvements/README.md +66 -0
- package/docs/books/admin-ui-authentication/01-threat-model-and-goals.md +124 -0
- package/docs/books/admin-ui-authentication/02-session-model-and-token-model.md +75 -0
- package/docs/books/admin-ui-authentication/03-auth-middleware-patterns.md +77 -0
- package/docs/books/admin-ui-authentication/README.md +25 -0
- package/docs/books/creating-a-new-admin-ui/01-introduction-and-vision.md +130 -0
- package/docs/books/creating-a-new-admin-ui/02-architecture-and-data-flow.md +298 -0
- package/docs/books/creating-a-new-admin-ui/03-server-introspection.md +381 -0
- package/docs/books/creating-a-new-admin-ui/04-admin-module-adapter-layer.md +592 -0
- package/docs/books/creating-a-new-admin-ui/05-domain-controls-stat-cards-and-gauges.md +513 -0
- package/docs/books/creating-a-new-admin-ui/06-domain-controls-process-manager.md +544 -0
- package/docs/books/creating-a-new-admin-ui/07-domain-controls-resource-pool-inspector.md +493 -0
- package/docs/books/creating-a-new-admin-ui/08-domain-controls-route-table-and-api-explorer.md +586 -0
- package/docs/books/creating-a-new-admin-ui/09-domain-controls-log-viewer-and-activity-feed.md +490 -0
- package/docs/books/creating-a-new-admin-ui/10-domain-controls-build-status-and-bundle-inspector.md +526 -0
- package/docs/books/creating-a-new-admin-ui/11-domain-controls-configuration-panel.md +808 -0
- package/docs/books/creating-a-new-admin-ui/12-admin-shell-layout-sidebar-navigation.md +210 -0
- package/docs/books/creating-a-new-admin-ui/13-telemetry-integration.md +556 -0
- package/docs/books/creating-a-new-admin-ui/14-realtime-sse-observable-integration.md +485 -0
- package/docs/books/creating-a-new-admin-ui/15-styling-theming-aero-design-system.md +521 -0
- package/docs/books/creating-a-new-admin-ui/16-testing-and-quality-assurance.md +147 -0
- package/docs/books/creating-a-new-admin-ui/17-next-steps-process-resource-roadmap.md +356 -0
- package/docs/books/creating-a-new-admin-ui/README.md +68 -0
- package/docs/books/device-adaptive-composition/01-platform-feature-audit.md +177 -0
- package/docs/books/device-adaptive-composition/02-responsive-composition-model.md +187 -0
- package/docs/books/device-adaptive-composition/03-data-model-vs-view-model.md +231 -0
- package/docs/books/device-adaptive-composition/04-styling-theme-breakpoints.md +234 -0
- package/docs/books/device-adaptive-composition/05-showcase-app-multi-device-assessment.md +193 -0
- package/docs/books/device-adaptive-composition/06-implementation-patterns-and-apis.md +346 -0
- package/docs/books/device-adaptive-composition/07-testing-harness-and-quality-gates.md +265 -0
- package/docs/books/device-adaptive-composition/08-roadmap-and-adoption-plan.md +250 -0
- package/docs/books/device-adaptive-composition/README.md +47 -0
- package/docs/comparison-report-express-plex-cpanel.md +549 -0
- package/docs/designs/server-admin-interface-aero.svg +611 -0
- package/docs/troubleshooting.md +84 -53
- package/module.js +16 -11
- package/package.json +1 -1
- package/serve-factory.js +1 -0
- package/server.js +199 -0
- package/tests/README.md +5 -0
- package/tests/admin-ui-jsgui-controls.test.js +581 -0
- package/tests/test-runner.js +1 -0
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-071799b982906680f5fd699d.js +0 -40
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-07352945ad5c92654fcb8b65.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-138a601fadb6191ea314c6fd.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-171f6c381c2cadf2e9fa7087.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-1d973388156b84a04373fac9.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-20e117bc8a10d2cd16234bbe.js +0 -40
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-2b028a82b0e5efddba42425f.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-4518556cd5c7e059e82b22b8.js +0 -40
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-5bac1aa0f213902f718ed74f.js +0 -40
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-5f9996ac7822caf777d92f56.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-60a92c702e65fd9cf748e3ec.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-6164c1f8f738995c541895d2.js +0 -44
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-6718a85eb9e5aa782dd47a05.js +0 -45
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-69e280f14e37aee76a1d4675.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-7570d1b030d44b111ed59c4c.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-7798c9bbd55e510d5039f936.js +0 -42
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-78cd511ea1ef18ecb03d1be5.js +0 -40
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-7d482e0b95bcb5e3c543118b.js +0 -43
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-80e9476d1127c55b40fdb36f.js +0 -40
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-810ced55d5320a3088a05b13.js +0 -40
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-8423565f1a40e329afc8c6cf.js +0 -40
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-900bef783b8cee36506ec282.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-a1a37aff6416fdad74040ddf.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-ad48d5e8eda40f175b4df090.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-aec5a2d963015528c9099462.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-af9d34e0f1722fab9e28c269.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-b818e4015e2f1fe86280b5ab.js +0 -41
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-bcb2541adc70b7aba61768c5.js +0 -44
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-bfe89d2c78ed44f95ed7dd73.js +0 -40
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-c06f04806a1e688e1187110c.js +0 -40
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-c3f3adf904f585afc544b96a.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-d45acb873e1d8e32d5e60f2e.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-db06f132533706f4a0163b8c.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-f660f40d78b135fc8560a862.js +0 -39
- package/.jsgui3-server-cache/jsgui3-html-shims/jsgui3-html-controls-shim-f9dee4ec18a96e09bee06bae.js +0 -39
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const jsgui = require('jsgui3-client');
|
|
4
|
+
const { controls, Control } = jsgui;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Group_Box — a Windows-style grouping container with a title
|
|
8
|
+
* rendered on the top border. Used to visually separate sections
|
|
9
|
+
* of the admin dashboard.
|
|
10
|
+
*
|
|
11
|
+
* Book reference: Chapter 6 — Implementation Patterns (reusable wrapper)
|
|
12
|
+
* Layer: D (Concrete Render)
|
|
13
|
+
*/
|
|
14
|
+
class Group_Box extends Control {
|
|
15
|
+
constructor(spec = {}) {
|
|
16
|
+
spec.__type_name = spec.__type_name || 'group_box';
|
|
17
|
+
super(spec);
|
|
18
|
+
const { context } = this;
|
|
19
|
+
|
|
20
|
+
const compose = () => {
|
|
21
|
+
// Legend / title
|
|
22
|
+
const title_text = spec.title || '';
|
|
23
|
+
if (title_text) {
|
|
24
|
+
const legend = new controls.div({ context, 'class': 'group-box-legend' });
|
|
25
|
+
legend.add(title_text);
|
|
26
|
+
this.add(legend);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Content container — callers add children here
|
|
30
|
+
const content = new controls.div({ context, 'class': 'group-box-content' });
|
|
31
|
+
this.add(content);
|
|
32
|
+
this._content = content;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
if (!spec.el) {
|
|
36
|
+
compose();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Returns the inner content container so callers can do:
|
|
42
|
+
* group.inner.add(child);
|
|
43
|
+
*/
|
|
44
|
+
get inner() {
|
|
45
|
+
return this._content;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
activate() {
|
|
49
|
+
if (!this.__active) {
|
|
50
|
+
super.activate();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
Group_Box.css = `
|
|
56
|
+
.group-box {
|
|
57
|
+
position: relative;
|
|
58
|
+
border: 1px solid #3a3a5a;
|
|
59
|
+
border-radius: 8px;
|
|
60
|
+
margin-bottom: 20px;
|
|
61
|
+
padding: 20px 16px 16px;
|
|
62
|
+
background: transparent;
|
|
63
|
+
}
|
|
64
|
+
.group-box-legend {
|
|
65
|
+
position: absolute;
|
|
66
|
+
top: -10px;
|
|
67
|
+
left: 16px;
|
|
68
|
+
padding: 0 8px;
|
|
69
|
+
font-size: 0.75rem;
|
|
70
|
+
font-weight: 600;
|
|
71
|
+
text-transform: uppercase;
|
|
72
|
+
letter-spacing: 0.08em;
|
|
73
|
+
color: #8888aa;
|
|
74
|
+
background: #1a1a2e;
|
|
75
|
+
}
|
|
76
|
+
.group-box-content {
|
|
77
|
+
display: flex;
|
|
78
|
+
flex-wrap: wrap;
|
|
79
|
+
gap: 16px;
|
|
80
|
+
}
|
|
81
|
+
`;
|
|
82
|
+
|
|
83
|
+
controls.Group_Box = Group_Box;
|
|
84
|
+
module.exports = Group_Box;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const jsgui = require('jsgui3-client');
|
|
4
|
+
const { controls, Control } = jsgui;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Stat_Card — a single KPI card showing value, label, and optional detail.
|
|
8
|
+
* Accent colour on the left border is set via spec.accent (CSS colour string).
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* new Stat_Card({
|
|
12
|
+
* context,
|
|
13
|
+
* label: 'Uptime',
|
|
14
|
+
* value: '3h 22m',
|
|
15
|
+
* detail: 'Since 09:41',
|
|
16
|
+
* accent: '#4facfe'
|
|
17
|
+
* })
|
|
18
|
+
*
|
|
19
|
+
* Book reference: Chapter 6 — Implementation Patterns (domain control)
|
|
20
|
+
* Layer: D (Concrete Render) — pure presentation, no data fetching
|
|
21
|
+
*/
|
|
22
|
+
class Stat_Card extends Control {
|
|
23
|
+
constructor(spec = {}) {
|
|
24
|
+
spec.__type_name = spec.__type_name || 'stat_card';
|
|
25
|
+
super(spec);
|
|
26
|
+
const { context } = this;
|
|
27
|
+
|
|
28
|
+
const compose = () => {
|
|
29
|
+
// Accent stripe colour
|
|
30
|
+
const accent = spec.accent || '#4facfe';
|
|
31
|
+
this.dom.attributes.style = `border-left-color: ${accent};`;
|
|
32
|
+
|
|
33
|
+
// Value (big number / text)
|
|
34
|
+
const value_el = new controls.div({ context, 'class': 'stat-value' });
|
|
35
|
+
value_el.add(String(spec.value != null ? spec.value : '—'));
|
|
36
|
+
this.add(value_el);
|
|
37
|
+
this._value_el = value_el;
|
|
38
|
+
|
|
39
|
+
// Label
|
|
40
|
+
const label_el = new controls.div({ context, 'class': 'stat-label' });
|
|
41
|
+
label_el.add(String(spec.label || ''));
|
|
42
|
+
this.add(label_el);
|
|
43
|
+
this._label_el = label_el;
|
|
44
|
+
|
|
45
|
+
// Detail (small secondary text)
|
|
46
|
+
if (spec.detail) {
|
|
47
|
+
const detail_el = new controls.div({ context, 'class': 'stat-detail' });
|
|
48
|
+
detail_el.add(String(spec.detail));
|
|
49
|
+
this.add(detail_el);
|
|
50
|
+
this._detail_el = detail_el;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
if (!spec.el) {
|
|
55
|
+
compose();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ─── Client-side updates ─────────────────────────────────
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Update displayed value (client-side only).
|
|
63
|
+
*/
|
|
64
|
+
set_value(value) {
|
|
65
|
+
if (this._value_el && this._value_el.el) {
|
|
66
|
+
this._value_el.el.textContent = String(value != null ? value : '—');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Update displayed detail text (client-side only).
|
|
72
|
+
*/
|
|
73
|
+
set_detail(text) {
|
|
74
|
+
if (this._detail_el && this._detail_el.el) {
|
|
75
|
+
this._detail_el.el.textContent = String(text);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
activate() {
|
|
80
|
+
if (!this.__active) {
|
|
81
|
+
super.activate();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
Stat_Card.css = `
|
|
87
|
+
.stat_card {
|
|
88
|
+
background: #2a2a4a;
|
|
89
|
+
border-left: 4px solid #4facfe;
|
|
90
|
+
border-radius: 8px;
|
|
91
|
+
padding: 20px 24px;
|
|
92
|
+
min-width: 180px;
|
|
93
|
+
flex: 1 1 180px;
|
|
94
|
+
max-width: 280px;
|
|
95
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
|
|
96
|
+
transition: transform 0.15s ease, box-shadow 0.15s ease;
|
|
97
|
+
cursor: default;
|
|
98
|
+
}
|
|
99
|
+
.stat_card:hover {
|
|
100
|
+
transform: translateY(-2px);
|
|
101
|
+
box-shadow: 0 4px 16px rgba(0,0,0,0.25);
|
|
102
|
+
}
|
|
103
|
+
.stat-value {
|
|
104
|
+
font-size: 1.75rem;
|
|
105
|
+
font-weight: 700;
|
|
106
|
+
color: #ffffff;
|
|
107
|
+
line-height: 1.2;
|
|
108
|
+
margin-bottom: 4px;
|
|
109
|
+
}
|
|
110
|
+
.stat-label {
|
|
111
|
+
font-size: 0.8rem;
|
|
112
|
+
font-weight: 500;
|
|
113
|
+
text-transform: uppercase;
|
|
114
|
+
letter-spacing: 0.06em;
|
|
115
|
+
color: #8888aa;
|
|
116
|
+
margin-bottom: 6px;
|
|
117
|
+
}
|
|
118
|
+
.stat-detail {
|
|
119
|
+
font-size: 0.75rem;
|
|
120
|
+
color: #6a6a8a;
|
|
121
|
+
}
|
|
122
|
+
`;
|
|
123
|
+
|
|
124
|
+
controls.Stat_Card = Stat_Card;
|
|
125
|
+
module.exports = Stat_Card;
|