@nsshunt/stsui 1.10.78 → 1.10.80
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/dist/stsui.mjs +32 -53
- package/dist/stsui.mjs.map +1 -1
- package/dist/stsui.umd.js +32 -53
- package/dist/stsui.umd.js.map +1 -1
- package/package.json +5 -5
package/dist/stsui.mjs
CHANGED
|
@@ -1,32 +1,15 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
|
-
return value;
|
|
6
|
-
};
|
|
7
|
-
var __accessCheck = (obj, member, msg) => {
|
|
8
|
-
if (!member.has(obj))
|
|
9
|
-
throw TypeError("Cannot " + msg);
|
|
10
|
-
};
|
|
11
|
-
var __privateGet = (obj, member, getter) => {
|
|
12
|
-
__accessCheck(obj, member, "read from private field");
|
|
13
|
-
return getter ? getter.call(obj) : member.get(obj);
|
|
14
|
-
};
|
|
15
|
-
var __privateAdd = (obj, member, value) => {
|
|
16
|
-
if (member.has(obj))
|
|
17
|
-
throw TypeError("Cannot add the same private member more than once");
|
|
18
|
-
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
2
|
+
var __typeError = (msg) => {
|
|
3
|
+
throw TypeError(msg);
|
|
19
4
|
};
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
var
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
};
|
|
29
|
-
var _cursor, _renderPanelFn, _cursorInfo, _CalcBoxPos, _UpdateUIBoxPos, _ReSize, _UpdatePanelPosition, _SetupPanels, SetupPanels_fn, _UpdateUI, UpdateUI_fn;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
7
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
8
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
9
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
10
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
11
|
+
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
12
|
+
var _cursor, _renderPanelFn, _cursorInfo, _CalcBoxPos, _UpdateUIBoxPos, _ReSize, _UpdatePanelPosition, _STSUIFrame_instances, SetupPanels_fn, UpdateUI_fn;
|
|
30
13
|
import EventEmitter from "node:events";
|
|
31
14
|
import blessed from "blessed";
|
|
32
15
|
import { v4 } from "uuid";
|
|
@@ -89,17 +72,7 @@ class STSUIFrame extends EventEmitter {
|
|
|
89
72
|
*/
|
|
90
73
|
constructor(data, renderPanelFn = null) {
|
|
91
74
|
super();
|
|
92
|
-
|
|
93
|
-
ClickEx(panel: any) {
|
|
94
|
-
//@@ override in sub-class
|
|
95
|
-
}
|
|
96
|
-
*/
|
|
97
|
-
/**
|
|
98
|
-
*
|
|
99
|
-
* Setup all panels
|
|
100
|
-
*/
|
|
101
|
-
__privateAdd(this, _SetupPanels);
|
|
102
|
-
__privateAdd(this, _UpdateUI);
|
|
75
|
+
__privateAdd(this, _STSUIFrame_instances);
|
|
103
76
|
//export class STSUIFrame {
|
|
104
77
|
__publicField(this, "uiBoxes", {});
|
|
105
78
|
// { box: <<blessed box>>, boxHeader: <<blessed box>> }
|
|
@@ -123,10 +96,8 @@ class STSUIFrame extends EventEmitter {
|
|
|
123
96
|
* @returns object with top, left, width and height correctly set
|
|
124
97
|
*/
|
|
125
98
|
__privateAdd(this, _CalcBoxPos, (panel) => {
|
|
126
|
-
if (!this.screen)
|
|
127
|
-
|
|
128
|
-
if (!panel.pos)
|
|
129
|
-
return null;
|
|
99
|
+
if (!this.screen) return null;
|
|
100
|
+
if (!panel.pos) return null;
|
|
130
101
|
let screenHeight = this.screen.height;
|
|
131
102
|
if (this.uidata.menu !== null) {
|
|
132
103
|
screenHeight -= this.uidata.menu.length;
|
|
@@ -245,7 +216,7 @@ class STSUIFrame extends EventEmitter {
|
|
|
245
216
|
this.screen.key(["escape"], () => {
|
|
246
217
|
this.emit("escape");
|
|
247
218
|
});
|
|
248
|
-
__privateMethod(this,
|
|
219
|
+
__privateMethod(this, _STSUIFrame_instances, SetupPanels_fn).call(this);
|
|
249
220
|
__privateSet(this, _cursorInfo, blessed.box({
|
|
250
221
|
parent: this.screen,
|
|
251
222
|
bottom: 0,
|
|
@@ -322,28 +293,28 @@ class STSUIFrame extends EventEmitter {
|
|
|
322
293
|
if (this.screen && this.screen.height / (this.uidata.grid.rows + 1) > this.minHeight) {
|
|
323
294
|
this.uidata.grid.rows++;
|
|
324
295
|
this.CheckCursor();
|
|
325
|
-
__privateMethod(this,
|
|
296
|
+
__privateMethod(this, _STSUIFrame_instances, UpdateUI_fn).call(this);
|
|
326
297
|
}
|
|
327
298
|
});
|
|
328
299
|
__publicField(this, "DecRows", () => {
|
|
329
300
|
if (this.uidata.grid.rows > this.minRows) {
|
|
330
301
|
this.uidata.grid.rows--;
|
|
331
302
|
this.CheckCursor();
|
|
332
|
-
__privateMethod(this,
|
|
303
|
+
__privateMethod(this, _STSUIFrame_instances, UpdateUI_fn).call(this);
|
|
333
304
|
}
|
|
334
305
|
});
|
|
335
306
|
__publicField(this, "IncCols", () => {
|
|
336
307
|
if (this.screen && this.screen.width / (this.uidata.grid.cols + 1) > this.minWidth) {
|
|
337
308
|
this.uidata.grid.cols++;
|
|
338
309
|
this.CheckCursor();
|
|
339
|
-
__privateMethod(this,
|
|
310
|
+
__privateMethod(this, _STSUIFrame_instances, UpdateUI_fn).call(this);
|
|
340
311
|
}
|
|
341
312
|
});
|
|
342
313
|
__publicField(this, "DecCols", () => {
|
|
343
314
|
if (this.uidata.grid.cols > this.minCols) {
|
|
344
315
|
this.uidata.grid.cols--;
|
|
345
316
|
this.CheckCursor();
|
|
346
|
-
__privateMethod(this,
|
|
317
|
+
__privateMethod(this, _STSUIFrame_instances, UpdateUI_fn).call(this);
|
|
347
318
|
}
|
|
348
319
|
});
|
|
349
320
|
__publicField(this, "CheckCursor", () => {
|
|
@@ -362,7 +333,7 @@ class STSUIFrame extends EventEmitter {
|
|
|
362
333
|
if (__privateGet(this, _cursor) > endpos) {
|
|
363
334
|
__privateSet(this, _cursor, endpos);
|
|
364
335
|
}
|
|
365
|
-
__privateMethod(this,
|
|
336
|
+
__privateMethod(this, _STSUIFrame_instances, UpdateUI_fn).call(this);
|
|
366
337
|
}
|
|
367
338
|
});
|
|
368
339
|
__publicField(this, "PrevPage", () => {
|
|
@@ -371,7 +342,7 @@ class STSUIFrame extends EventEmitter {
|
|
|
371
342
|
if (__privateGet(this, _cursor) < 0) {
|
|
372
343
|
__privateSet(this, _cursor, 0);
|
|
373
344
|
}
|
|
374
|
-
__privateMethod(this,
|
|
345
|
+
__privateMethod(this, _STSUIFrame_instances, UpdateUI_fn).call(this);
|
|
375
346
|
}
|
|
376
347
|
});
|
|
377
348
|
__publicField(this, "Exit", () => {
|
|
@@ -405,7 +376,7 @@ class STSUIFrame extends EventEmitter {
|
|
|
405
376
|
}
|
|
406
377
|
set gridData(gridData) {
|
|
407
378
|
this.uidata = gridData;
|
|
408
|
-
__privateMethod(this,
|
|
379
|
+
__privateMethod(this, _STSUIFrame_instances, SetupPanels_fn).call(this);
|
|
409
380
|
this.UpdateCursorInfo();
|
|
410
381
|
this.Render();
|
|
411
382
|
}
|
|
@@ -414,7 +385,7 @@ class STSUIFrame extends EventEmitter {
|
|
|
414
385
|
}
|
|
415
386
|
set gridDataPanels(gridDataPanels) {
|
|
416
387
|
this.uidata.panels = gridDataPanels;
|
|
417
|
-
__privateMethod(this,
|
|
388
|
+
__privateMethod(this, _STSUIFrame_instances, SetupPanels_fn).call(this);
|
|
418
389
|
this.UpdateCursorInfo();
|
|
419
390
|
this.Render();
|
|
420
391
|
}
|
|
@@ -438,7 +409,16 @@ _CalcBoxPos = new WeakMap();
|
|
|
438
409
|
_UpdateUIBoxPos = new WeakMap();
|
|
439
410
|
_ReSize = new WeakMap();
|
|
440
411
|
_UpdatePanelPosition = new WeakMap();
|
|
441
|
-
|
|
412
|
+
_STSUIFrame_instances = new WeakSet();
|
|
413
|
+
/*
|
|
414
|
+
ClickEx(panel: any) {
|
|
415
|
+
//@@ override in sub-class
|
|
416
|
+
}
|
|
417
|
+
*/
|
|
418
|
+
/**
|
|
419
|
+
*
|
|
420
|
+
* Setup all panels
|
|
421
|
+
*/
|
|
442
422
|
SetupPanels_fn = function() {
|
|
443
423
|
if (!this.screen) {
|
|
444
424
|
return;
|
|
@@ -544,7 +524,6 @@ SetupPanels_fn = function() {
|
|
|
544
524
|
}
|
|
545
525
|
}
|
|
546
526
|
};
|
|
547
|
-
_UpdateUI = new WeakSet();
|
|
548
527
|
UpdateUI_fn = function() {
|
|
549
528
|
this.SetupUI();
|
|
550
529
|
};
|
package/dist/stsui.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stsui.mjs","sources":["../src/menubar.ts","../src/stsuiframe.ts"],"sourcesContent":["import blessed from 'blessed';\nimport * as stsBlessed from './index'\n\nexport interface menuitem {\n\ttext: string,\n\tkey: string,\n\tcb(): void\n}\n\nexport interface MenuBarOptions {\n\ttop: boolean\n\tmenuitems: menuitem[]\n}\n\nexport class MenuBar\n{\n private listb:stsBlessed.listbar | null = null;\n\n // options := { screen: <blessed screen>, top: <bool>, menuitems: [ { text: <string>, key: <string>, cb: <call back func> } ] }\n constructor(screen: stsBlessed.screen, options: MenuBarOptions) {\n const compoptions: stsBlessed.elementOptions = {\n parent: screen,\n left: 0,\n right: 0,\n height: 1,\n width: 'shrink',\n mouse: true,\n keys: true,\n autoCommandKeys: true,\n scrollable: true,\n style: {\n fg: 'yellow',\n bg: 'blue',\n\n item: {\n hover: {\n fg: 'white',\n bg: 'green',\n }\n },\n selected: {\n fg: 'black',\n bg: 'yellow',\n }\n }\n }\n if (options.top === true) {\n compoptions.top = 0;\n } else {\n compoptions.bottom = 0;\n }\n\n compoptions.commands = { };\n options.menuitems.forEach((menuItem) => {\n if (compoptions.commands) {\n compoptions.commands[menuItem.text] = {\n keys: [ menuItem.key ],\n callback: menuItem.cb\n }\n }\n })\n\n this.listb = blessed.listbar(compoptions);\n }\n\n get listbar()\n {\n return this.listb;\n }\n}\n","import EventEmitter from 'node:events'\n\n// https://github.com/yaronn/blessed-contrib\n//var contrib = require('blessed-contrib');\nimport blessed from 'blessed';\n\nimport { v4 as uuidv4 } from 'uuid';\n\nimport * as stsBlessed from './index'\nimport * as MenuBar from './menubar'\n\nexport type menuOptions = MenuBar.MenuBarOptions[]\n\nexport interface widget {\n widget: string // Name of the blessed widget\n options: stsBlessed.elementOptions // blessed widget options - used in the constructor of the blessed widget\n}\n\nexport interface widgets {\n [widgetName: string]: widget\n}\n\nexport interface panel {\n id: string,\n pos?: {\n row: number,\n col: number,\n rowSpan: number,\n colSpan: number\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: any\n panelHeader: string,\n widgets: widgets | null\n}\n\nexport interface panels {\n [panelId: string]: panel\n}\n\nexport interface gridData {\n\ttitle: string\n\tgrid: { rows: number, cols: number },\n\tmenu: menuOptions,\n\tpanels: panels\n}\n\nexport interface renderPanelCb {\n\t(box: stsBlessed.box, panel: panel): void\n}\n\nexport interface boxPos {\n\ttop: number,\n\tleft: number,\n\twidth: number,\n\theight: number\n}\n\nexport interface uiBox {\n\tbox: stsBlessed.box, // blessed box\n\tboxHeader: stsBlessed.listbar // blessed box\n}\n\nexport interface uiBoxes {\n\t[key: string]: uiBox\n}\n\nexport class STSUIFrame extends EventEmitter {\n//export class STSUIFrame {\n private uiBoxes:uiBoxes = { }; // { box: <<blessed box>>, boxHeader: <<blessed box>> }\n private screen: stsBlessed.screen | null = null;\n #cursor = 0; // panel index with the complete model data.\n #renderPanelFn: renderPanelCb | null = null;\n private screenHeaderText = '...';\n\n private minRows = 1;\n private minCols = 1;\n private minWidth = 40;\n private minHeight = 7;\n\n #cursorInfo: stsBlessed.box | null = null;\n private sortInfo: stsBlessed.box | null = null; // Current sort mode UI box control\n private screenHeader: stsBlessed.box | null = null;\n\n private uidata: gridData;\n\n /**\n * \n * @param {*} data The screen layout data. Schema: { title: <str>,\n * grid: { rows: <int>, cols: <int> }, \n * panels: [ { id: <str>, pos: { row: <int>, col: <int>, rowSpan: <int>, colSpan: <int> }, \n * template: <handlebars func>, widgets: { [ { <prop_name>: <blessed widget> } ] } } ] }\n */\n constructor(data: gridData, renderPanelFn: renderPanelCb | null = null) {\n super();\n this.uidata = data;\n this.#renderPanelFn = renderPanelFn;\n this.SetupUI();\n }\n\n /**\n * \n * @param {number} position The index (0 based) for the panel item to be calculated\n * @returns object with top, left, width and height correctly set\n */\n #CalcBoxPos = (panel: panel): boxPos | null => {\n // Calculate the position and dimensions for this UI element\n\n if (!this.screen) return null;\n if (!panel.pos) return null;\n\n let screenHeight = this.screen.height;\n if (this.uidata.menu !== null) {\n screenHeight -= this.uidata.menu.length; // Allow for any menu items\n }\n const screenWidth = this.screen.width;\n\n const rows = this.uidata.grid.rows;\n const cols = this.uidata.grid.cols;\n\n const pos = panel.pos;\n\n const colWidth = Math.floor(screenWidth / cols);\n const rowHeight = Math.floor(screenHeight / rows);\n\n // Allow for a top offset if a top menu is present\n let topoffset = 0;\n if (this.uidata.menu !== null) {\n for (const [, value] of Object.entries(this.uidata.menu)) {\n if (value.top === true) {\n topoffset = 1;\n break;\n }\n }\n }\n\n const boxPos: boxPos = {\n top: (pos.row * rowHeight) + topoffset,\n left: pos.col * colWidth,\n width: colWidth * pos.colSpan,\n height: rowHeight * pos.rowSpan\n }\n\n // Now check if this panel is on the far right and if so adjust for a perfect fit\n\n if ((pos.col + pos.colSpan) === cols) {\n //if (pos.col === (cols - 1)) {\n boxPos.width = screenWidth - (pos.col * colWidth);\n }\n\n // Now check if this panel is on the bottom and if so adjust for a perfect fit\n if ((pos.row + pos.rowSpan) === rows) {\n boxPos.height = screenHeight - (pos.row * rowHeight);\n }\n\n return boxPos;\n }\n\n #UpdateUIBoxPos = (panel: panel, uiBox: uiBox): void => {\n const pos: boxPos | null = this.#CalcBoxPos(panel);\n if (!pos) {\n return;\n }\n\n uiBox.box.top = pos.top;\n uiBox.box.left = pos.left;\n uiBox.box.width = pos.width;\n uiBox.box.height = pos.height;\n\n uiBox.boxHeader.top = pos.top;\n uiBox.boxHeader.left = pos.left + 2;\n\n if (typeof panel.widgets !== 'undefined' && panel.widgets !== null) {\n for (const [, value] of Object.entries(panel.widgets)) {\n if (value.widget === 'log') {\n const widget = uiBox.box.get(value.widget) as stsBlessed.element;\n if (widget.position.top >= (uiBox.box.height - 4)) {\n widget.position.top = uiBox.box.height - 4;\n } else {\n if (value.options.top) {\n widget.position.top = value.options.top;\n }\n }\n }\n }\n }\n };\n\n /**\n * ReSize the grid layout\n */\n #ReSize = (): void => {\n for (const [, value] of Object.entries(this.uiBoxes)) {\n this.#UpdateUIBoxPos(value.box.get('panel') as panel, value);\n }\n }\n\n #UpdatePanelPosition = (panel: panel, row: number, col: number, uiBox: uiBox): void => {\n // Update the panel position within the current screen view\n panel.pos = { row: row, col: col, rowSpan: 1, colSpan: 1 };\n this.#UpdateUIBoxPos(panel, uiBox);\n uiBox.boxHeader.setContent(panel.panelHeader);\n }\n\n /*\n ClickEx(panel: any) {\n //@@ override in sub-class\n }\n */\n\n /**\n * \n * Setup all panels\n */\n #SetupPanels(): void {\n if (!this.screen) {\n return;\n }\n\n const panelKeys = Object.keys(this.uidata.panels);\n\n // Check for deleted panels\n const uiBoxIds = Object.keys(this.uiBoxes);\n for (let i=0; i < uiBoxIds.length; i++) {\n if (typeof this.uidata.panels[uiBoxIds[i]] === 'undefined') {\n let uiBox: uiBox | null = this.uiBoxes[uiBoxIds[i]];\n if (typeof uiBox !== 'undefined') {\n this.screen.remove(uiBox.boxHeader);\n this.screen.remove(uiBox.box);\n uiBox = null;\n delete this.uiBoxes[uiBoxIds[i]];\n }\n }\n }\n\n const touched: Record<string, boolean> = { };\n\n for (let i=0; i < (this.uidata.grid.cols * this.uidata.grid.rows); i++) {\n const gridPos = this.#cursor + i;\n const col = i % this.uidata.grid.cols;\n const row = Math.floor(i / this.uidata.grid.cols);\n\n // Get the panel for this position within the grid\n const panel: panel = this.uidata.panels[panelKeys[gridPos]];\n if (typeof panel !== 'undefined') {\n if (typeof this.uiBoxes[panel.id] === 'undefined') {\n // Update the panel position within the current screen view\n panel.pos = { row: row, col: col, rowSpan: 1, colSpan: 1 };\n\n const calculatedBoxPos = this.#CalcBoxPos(panel);\n if (!calculatedBoxPos) {\n return\n }\n const { top, left, width, height } = this.#CalcBoxPos(panel) as boxPos;\n\n // Create the UI box\n const box: stsBlessed.box = blessed.box({\n parent: this.screen,\n top: top,\n left: left,\n width: width,\n height: height,\n style:\n {\n bg: '#101010' // was gray\n ,fg: 'white'\n },\n border:\n {\n type: 'line'\n },\n keys: false, // Do not allow default key handling for this box\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n const boxHeader: stsBlessed.listbar = blessed.box({\n parent: this.screen,\n top: top,\n left: left+2,\n width: 'shrink',\n height: 1,\n style:\n {\n bg: 'gray'\n , fg: 'white'\n },\n keys: false, // Do not allow default key handling for this box\n mouse: false,\n content: panel.panelHeader,\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n this.uiBoxes[panel.id] = { box: box, boxHeader: boxHeader };\n\n boxHeader.setIndex(-1);\n\n // https://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-inside-a-callback\n box.on('click', () => {\n //this.emit('click', box.data.panel);\n this.emit('click', box.get('panel') as panel);\n //this.ClickEx(box.get('panel') as panel);\n });\n\n if (typeof panel.widgets !== 'undefined' && panel.widgets !== null) {\n for (const [, value] of Object.entries(panel.widgets)) {\n // Create a fresh copy of the options for this widget instance.\n // If this is not done, all widgets will use the same options object and will not be able\n // to update screen elements individually.\n const widgetoptions = {...value.options};\n\n // Ensure that we always show at least 2 lines of log data even if this means we position over the top of\n // elements above this position.\n if (widgetoptions.top && (widgetoptions.top >= (box.height - 3))) {\n widgetoptions.top = box.height - 4;\n }\n const widget: stsBlessed.element = blessed[value.widget].call(this, widgetoptions);\n widget.set('id', uuidv4());\n box.append(widget);\n box.set(value.widget, widget); // Set the user data for this widget. This allows the handlebars template access via the name from the box object.\n }\n }\n\n // The entire panel is accessible using the _panel property.\n // This is so that the model is accessible from within the handlebars templates.\n // Access to a named widget can be done using box._panel.widgets[name] or box._panel.widgets.name\n box.set('panel', panel);\n\n this.uiBoxes[panel.id].box = box;\n\n touched[panel.id] = true;\n } else {\n //@@ need to hide previous positions\n //@@ and show ones that are visible\n this.#UpdatePanelPosition(panel, row, col, this.uiBoxes[panel.id]);\n\n touched[panel.id] = true;\n //this.#uiBox[panel.id].box.show();\n }\n\n // Render the uiBox with the renderPanelFn using the panel as the utility including the model\n if (this.#renderPanelFn) {\n this.#renderPanelFn(this.uiBoxes[panel.id].box, panel);\n }\n }\n }\n\n for (const [key, ] of Object.entries(this.uiBoxes)) {\n if (typeof touched[key] === 'undefined') {\n this.uiBoxes[key].box.hide();\n this.uiBoxes[key].boxHeader.hide();\n } else {\n this.uiBoxes[key].box.show();\n this.uiBoxes[key].boxHeader.show();\n }\n }\n\n }\n\n get gridData(): gridData {\n return this.uidata;\n }\n\n set gridData(gridData: gridData) {\n this.uidata = gridData;\n this.#SetupPanels();\n this.UpdateCursorInfo();\n this.Render();\n }\n\n get gridDataPanels(): panels {\n return this.uidata.panels;\n }\n\n set gridDataPanels(gridDataPanels: panels) {\n this.uidata.panels = gridDataPanels;\n this.#SetupPanels();\n this.UpdateCursorInfo();\n this.Render();\n }\n\n /*\n ExitEx() {\n //@@ override in sub-class\n }\n\n EscapeEx() {\n //@@ override in sub-class\n }\n */\n\n // https://www.npmjs.com/package/blessed\n\n // data:= { title: <str>,\n // grid: { rows: <int>, cols: <int> }, \n // menu: [ { top: <bool>, menuitems: [ { text: <string>, key: <string>, cb: <func> } ] } ]\n // panels: [ { id: <str>, pos: { row: <int>, col: <int>, rowSpan: <int>, colSpan: <int> }, template: <str> } ] }\n /**\n * \n * @param {*} data UI Data\n */\n SetupUI = (): void => {\n this.DestroyUI();\n\n if (this.screen === null) {\n // Create a screen object.\n this.screen = blessed.screen({\n smartCSR: true\n });\n }\n\n if (!this.screen) {\n return;\n }\n\n const data = this.uidata;\n this.screen.title = data.title;\n this.screen.on('resize', () => {\n this.#ReSize();\n this.Render();\n });\n\n if (data.menu !== null) {\n for (let i = 0; i < data.menu.length; i++) {\n new MenuBar.MenuBar(this.screen, data.menu[i]);\n }\n }\n\n // Allow the serrvice to terminate by pressing Control-C.\n this.screen.key(['C-c'], (): void => {\n this.DestroyUI();\n this.emit('exit');\n //this.ExitEx();\n // Cleanly shutdown the main process. Exit code success (> 0 is exit in error state)\n //setTimeout(() => process.kill(process.pid), 0);\n });\n\n this.screen.key(['escape'], (): void => {\n this.emit('escape');\n //this.EscapeEx();\n // Cleanly shutdown the main process. Exit code success (> 0 is exit in error state)\n //setTimeout(() => process.kill(process.pid), 0);\n });\n\n this.#SetupPanels();\n\n this.#cursorInfo = blessed.box({\n parent: this.screen,\n bottom: 0,\n right: 0,\n width: 'shrink',\n height: 1,\n style:\n {\n bg: 'gray'\n , fg: 'white'\n },\n keys: false, // Do not allow default key handling for this box\n mouse: false,\n content: '',\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n this.sortInfo = blessed.box({\n parent: this.screen,\n top: 0,\n right: 0,\n width: 'shrink',\n height: 1,\n style:\n {\n bg: 'gray'\n , fg: 'white'\n },\n keys: false, // Do not allow default key handling for this box\n mouse: false,\n content: '',\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n\n this.screenHeader = blessed.box({\n parent: this.screen,\n top: 0,\n left: 'center',\n width: 'shrink',\n height: 1,\n style:\n {\n bg: 'gray'\n , fg: 'white'\n },\n keys: false, // Do not allow default key handling for this box\n mouse: false,\n content: `[ ... ]`,\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n this.UpdateCursorInfo();\n this.UpdateSortInfo('Default');\n this.UpdateScreenHeader(this.screenHeaderText);\n\n // Render the screen.\n this.Render();\n }\n\n UpdateCursorInfo = (): void => {\n if (this.#cursorInfo) {\n this.#cursorInfo.setContent(`Cursor: ${this.#cursor} / ${this.TotalPanelNumber}`);\n }\n }\n\n UpdateSortInfo = (sortMode: string): void => {\n if (this.sortInfo) {\n this.sortInfo.setContent(`Sort: ${sortMode}`);\n }\n }\n\n UpdateScreenHeader = (screenHeaderText: string): void => {\n this.screenHeaderText = screenHeaderText;\n if (this.screenHeader) {\n this.screenHeader.setContent(`[ ${screenHeaderText} ]`);\n }\n }\n\n get rows(): number {\n return this.uidata.grid.rows;\n }\n\n get cols(): number {\n return this.uidata.grid.cols;\n }\n\n IncRows = (): void => {\n if (this.screen && (this.screen.height / (this.uidata.grid.rows+1) > this.minHeight)) {\n this.uidata.grid.rows++;\n this.CheckCursor();\n this.#UpdateUI();\n }\n }\n\n DecRows = (): void => {\n if (this.uidata.grid.rows > this.minRows) {\n this.uidata.grid.rows--;\n this.CheckCursor();\n this.#UpdateUI();\n }\n }\n\n IncCols = (): void => {\n if (this.screen && (this.screen.width / (this.uidata.grid.cols+1) > this.minWidth)) {\n this.uidata.grid.cols++;\n this.CheckCursor();\n this.#UpdateUI();\n }\n }\n\n DecCols = (): void => {\n if (this.uidata.grid.cols > this.minCols) {\n this.uidata.grid.cols--;\n this.CheckCursor();\n this.#UpdateUI();\n }\n }\n\n get ScreenCells(): number {\n return this.uidata.grid.cols * this.uidata.grid.rows;\n }\n\n get TotalPanelNumber(): number {\n return Object.keys(this.uidata.panels).length;\n }\n\n CheckCursor = (): void => {\n if (this.#cursor > (this.TotalPanelNumber - this.ScreenCells)) {\n this.#cursor = this.TotalPanelNumber - this.ScreenCells;\n if (this.#cursor < 0) {\n this.#cursor = 0;\n }\n }\n this.UpdateCursorInfo();\n }\n\n NextPage = (): void => {\n const endpos = this.TotalPanelNumber - this.ScreenCells;\n if (this.#cursor < endpos) {\n this.#cursor += this.ScreenCells;\n if (this.#cursor > endpos) {\n this.#cursor = endpos;\n }\n this.#UpdateUI();\n }\n }\n\n PrevPage = (): void => {\n if (this.#cursor > 0) {\n this.#cursor -= this.ScreenCells;\n if (this.#cursor < 0) {\n this.#cursor = 0;\n }\n this.#UpdateUI();\n }\n }\n\n #UpdateUI(): void {\n this.SetupUI();\n\n //@@ fix screen render - should not need to blow entire screen away ...\n //this.#SetupPanels();\n //this.UpdateCursorInfo();\n //this.Render();\n }\n\n Exit = (): void => {\n this.DestroyUI();\n this.emit('exit');\n //this.ExitEx();\n }\n\n /**\n * \n */\n DestroyUI = (): void => {\n // Destroy the screen and disable UI log processing\n if (this.screen !== null) {\n this.uiBoxes = { };\n this.screen.destroy();\n this.screen = null;\n }\n }\n\n /**\n * Render the screen.\n */\n Render = (): void => {\n if (this.screen) {\n this.screen.render();\n }\n }\n}\n"],"names":["MenuBar.MenuBar","uuidv4"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stsui.mjs","sources":["../src/menubar.ts","../src/stsuiframe.ts"],"sourcesContent":["import blessed from 'blessed';\nimport * as stsBlessed from './index'\n\nexport interface menuitem {\n\ttext: string,\n\tkey: string,\n\tcb(): void\n}\n\nexport interface MenuBarOptions {\n\ttop: boolean\n\tmenuitems: menuitem[]\n}\n\nexport class MenuBar\n{\n private listb:stsBlessed.listbar | null = null;\n\n // options := { screen: <blessed screen>, top: <bool>, menuitems: [ { text: <string>, key: <string>, cb: <call back func> } ] }\n constructor(screen: stsBlessed.screen, options: MenuBarOptions) {\n const compoptions: stsBlessed.elementOptions = {\n parent: screen,\n left: 0,\n right: 0,\n height: 1,\n width: 'shrink',\n mouse: true,\n keys: true,\n autoCommandKeys: true,\n scrollable: true,\n style: {\n fg: 'yellow',\n bg: 'blue',\n\n item: {\n hover: {\n fg: 'white',\n bg: 'green',\n }\n },\n selected: {\n fg: 'black',\n bg: 'yellow',\n }\n }\n }\n if (options.top === true) {\n compoptions.top = 0;\n } else {\n compoptions.bottom = 0;\n }\n\n compoptions.commands = { };\n options.menuitems.forEach((menuItem) => {\n if (compoptions.commands) {\n compoptions.commands[menuItem.text] = {\n keys: [ menuItem.key ],\n callback: menuItem.cb\n }\n }\n })\n\n this.listb = blessed.listbar(compoptions);\n }\n\n get listbar()\n {\n return this.listb;\n }\n}\n","import EventEmitter from 'node:events'\n\n// https://github.com/yaronn/blessed-contrib\n//var contrib = require('blessed-contrib');\nimport blessed from 'blessed';\n\nimport { v4 as uuidv4 } from 'uuid';\n\nimport * as stsBlessed from './index'\nimport * as MenuBar from './menubar'\n\nexport type menuOptions = MenuBar.MenuBarOptions[]\n\nexport interface widget {\n widget: string // Name of the blessed widget\n options: stsBlessed.elementOptions // blessed widget options - used in the constructor of the blessed widget\n}\n\nexport interface widgets {\n [widgetName: string]: widget\n}\n\nexport interface panel {\n id: string,\n pos?: {\n row: number,\n col: number,\n rowSpan: number,\n colSpan: number\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: any\n panelHeader: string,\n widgets: widgets | null\n}\n\nexport interface panels {\n [panelId: string]: panel\n}\n\nexport interface gridData {\n\ttitle: string\n\tgrid: { rows: number, cols: number },\n\tmenu: menuOptions,\n\tpanels: panels\n}\n\nexport interface renderPanelCb {\n\t(box: stsBlessed.box, panel: panel): void\n}\n\nexport interface boxPos {\n\ttop: number,\n\tleft: number,\n\twidth: number,\n\theight: number\n}\n\nexport interface uiBox {\n\tbox: stsBlessed.box, // blessed box\n\tboxHeader: stsBlessed.listbar // blessed box\n}\n\nexport interface uiBoxes {\n\t[key: string]: uiBox\n}\n\nexport class STSUIFrame extends EventEmitter {\n//export class STSUIFrame {\n private uiBoxes:uiBoxes = { }; // { box: <<blessed box>>, boxHeader: <<blessed box>> }\n private screen: stsBlessed.screen | null = null;\n #cursor = 0; // panel index with the complete model data.\n #renderPanelFn: renderPanelCb | null = null;\n private screenHeaderText = '...';\n\n private minRows = 1;\n private minCols = 1;\n private minWidth = 40;\n private minHeight = 7;\n\n #cursorInfo: stsBlessed.box | null = null;\n private sortInfo: stsBlessed.box | null = null; // Current sort mode UI box control\n private screenHeader: stsBlessed.box | null = null;\n\n private uidata: gridData;\n\n /**\n * \n * @param {*} data The screen layout data. Schema: { title: <str>,\n * grid: { rows: <int>, cols: <int> }, \n * panels: [ { id: <str>, pos: { row: <int>, col: <int>, rowSpan: <int>, colSpan: <int> }, \n * template: <handlebars func>, widgets: { [ { <prop_name>: <blessed widget> } ] } } ] }\n */\n constructor(data: gridData, renderPanelFn: renderPanelCb | null = null) {\n super();\n this.uidata = data;\n this.#renderPanelFn = renderPanelFn;\n this.SetupUI();\n }\n\n /**\n * \n * @param {number} position The index (0 based) for the panel item to be calculated\n * @returns object with top, left, width and height correctly set\n */\n #CalcBoxPos = (panel: panel): boxPos | null => {\n // Calculate the position and dimensions for this UI element\n\n if (!this.screen) return null;\n if (!panel.pos) return null;\n\n let screenHeight = this.screen.height;\n if (this.uidata.menu !== null) {\n screenHeight -= this.uidata.menu.length; // Allow for any menu items\n }\n const screenWidth = this.screen.width;\n\n const rows = this.uidata.grid.rows;\n const cols = this.uidata.grid.cols;\n\n const pos = panel.pos;\n\n const colWidth = Math.floor(screenWidth / cols);\n const rowHeight = Math.floor(screenHeight / rows);\n\n // Allow for a top offset if a top menu is present\n let topoffset = 0;\n if (this.uidata.menu !== null) {\n for (const [, value] of Object.entries(this.uidata.menu)) {\n if (value.top === true) {\n topoffset = 1;\n break;\n }\n }\n }\n\n const boxPos: boxPos = {\n top: (pos.row * rowHeight) + topoffset,\n left: pos.col * colWidth,\n width: colWidth * pos.colSpan,\n height: rowHeight * pos.rowSpan\n }\n\n // Now check if this panel is on the far right and if so adjust for a perfect fit\n\n if ((pos.col + pos.colSpan) === cols) {\n //if (pos.col === (cols - 1)) {\n boxPos.width = screenWidth - (pos.col * colWidth);\n }\n\n // Now check if this panel is on the bottom and if so adjust for a perfect fit\n if ((pos.row + pos.rowSpan) === rows) {\n boxPos.height = screenHeight - (pos.row * rowHeight);\n }\n\n return boxPos;\n }\n\n #UpdateUIBoxPos = (panel: panel, uiBox: uiBox): void => {\n const pos: boxPos | null = this.#CalcBoxPos(panel);\n if (!pos) {\n return;\n }\n\n uiBox.box.top = pos.top;\n uiBox.box.left = pos.left;\n uiBox.box.width = pos.width;\n uiBox.box.height = pos.height;\n\n uiBox.boxHeader.top = pos.top;\n uiBox.boxHeader.left = pos.left + 2;\n\n if (typeof panel.widgets !== 'undefined' && panel.widgets !== null) {\n for (const [, value] of Object.entries(panel.widgets)) {\n if (value.widget === 'log') {\n const widget = uiBox.box.get(value.widget) as stsBlessed.element;\n if (widget.position.top >= (uiBox.box.height - 4)) {\n widget.position.top = uiBox.box.height - 4;\n } else {\n if (value.options.top) {\n widget.position.top = value.options.top;\n }\n }\n }\n }\n }\n };\n\n /**\n * ReSize the grid layout\n */\n #ReSize = (): void => {\n for (const [, value] of Object.entries(this.uiBoxes)) {\n this.#UpdateUIBoxPos(value.box.get('panel') as panel, value);\n }\n }\n\n #UpdatePanelPosition = (panel: panel, row: number, col: number, uiBox: uiBox): void => {\n // Update the panel position within the current screen view\n panel.pos = { row: row, col: col, rowSpan: 1, colSpan: 1 };\n this.#UpdateUIBoxPos(panel, uiBox);\n uiBox.boxHeader.setContent(panel.panelHeader);\n }\n\n /*\n ClickEx(panel: any) {\n //@@ override in sub-class\n }\n */\n\n /**\n * \n * Setup all panels\n */\n #SetupPanels(): void {\n if (!this.screen) {\n return;\n }\n\n const panelKeys = Object.keys(this.uidata.panels);\n\n // Check for deleted panels\n const uiBoxIds = Object.keys(this.uiBoxes);\n for (let i=0; i < uiBoxIds.length; i++) {\n if (typeof this.uidata.panels[uiBoxIds[i]] === 'undefined') {\n let uiBox: uiBox | null = this.uiBoxes[uiBoxIds[i]];\n if (typeof uiBox !== 'undefined') {\n this.screen.remove(uiBox.boxHeader);\n this.screen.remove(uiBox.box);\n uiBox = null;\n delete this.uiBoxes[uiBoxIds[i]];\n }\n }\n }\n\n const touched: Record<string, boolean> = { };\n\n for (let i=0; i < (this.uidata.grid.cols * this.uidata.grid.rows); i++) {\n const gridPos = this.#cursor + i;\n const col = i % this.uidata.grid.cols;\n const row = Math.floor(i / this.uidata.grid.cols);\n\n // Get the panel for this position within the grid\n const panel: panel = this.uidata.panels[panelKeys[gridPos]];\n if (typeof panel !== 'undefined') {\n if (typeof this.uiBoxes[panel.id] === 'undefined') {\n // Update the panel position within the current screen view\n panel.pos = { row: row, col: col, rowSpan: 1, colSpan: 1 };\n\n const calculatedBoxPos = this.#CalcBoxPos(panel);\n if (!calculatedBoxPos) {\n return\n }\n const { top, left, width, height } = this.#CalcBoxPos(panel) as boxPos;\n\n // Create the UI box\n const box: stsBlessed.box = blessed.box({\n parent: this.screen,\n top: top,\n left: left,\n width: width,\n height: height,\n style:\n {\n bg: '#101010' // was gray\n ,fg: 'white'\n },\n border:\n {\n type: 'line'\n },\n keys: false, // Do not allow default key handling for this box\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n const boxHeader: stsBlessed.listbar = blessed.box({\n parent: this.screen,\n top: top,\n left: left+2,\n width: 'shrink',\n height: 1,\n style:\n {\n bg: 'gray'\n , fg: 'white'\n },\n keys: false, // Do not allow default key handling for this box\n mouse: false,\n content: panel.panelHeader,\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n this.uiBoxes[panel.id] = { box: box, boxHeader: boxHeader };\n\n boxHeader.setIndex(-1);\n\n // https://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-inside-a-callback\n box.on('click', () => {\n //this.emit('click', box.data.panel);\n this.emit('click', box.get('panel') as panel);\n //this.ClickEx(box.get('panel') as panel);\n });\n\n if (typeof panel.widgets !== 'undefined' && panel.widgets !== null) {\n for (const [, value] of Object.entries(panel.widgets)) {\n // Create a fresh copy of the options for this widget instance.\n // If this is not done, all widgets will use the same options object and will not be able\n // to update screen elements individually.\n const widgetoptions = {...value.options};\n\n // Ensure that we always show at least 2 lines of log data even if this means we position over the top of\n // elements above this position.\n if (widgetoptions.top && (widgetoptions.top >= (box.height - 3))) {\n widgetoptions.top = box.height - 4;\n }\n const widget: stsBlessed.element = blessed[value.widget].call(this, widgetoptions);\n widget.set('id', uuidv4());\n box.append(widget);\n box.set(value.widget, widget); // Set the user data for this widget. This allows the handlebars template access via the name from the box object.\n }\n }\n\n // The entire panel is accessible using the _panel property.\n // This is so that the model is accessible from within the handlebars templates.\n // Access to a named widget can be done using box._panel.widgets[name] or box._panel.widgets.name\n box.set('panel', panel);\n\n this.uiBoxes[panel.id].box = box;\n\n touched[panel.id] = true;\n } else {\n //@@ need to hide previous positions\n //@@ and show ones that are visible\n this.#UpdatePanelPosition(panel, row, col, this.uiBoxes[panel.id]);\n\n touched[panel.id] = true;\n //this.#uiBox[panel.id].box.show();\n }\n\n // Render the uiBox with the renderPanelFn using the panel as the utility including the model\n if (this.#renderPanelFn) {\n this.#renderPanelFn(this.uiBoxes[panel.id].box, panel);\n }\n }\n }\n\n for (const [key, ] of Object.entries(this.uiBoxes)) {\n if (typeof touched[key] === 'undefined') {\n this.uiBoxes[key].box.hide();\n this.uiBoxes[key].boxHeader.hide();\n } else {\n this.uiBoxes[key].box.show();\n this.uiBoxes[key].boxHeader.show();\n }\n }\n\n }\n\n get gridData(): gridData {\n return this.uidata;\n }\n\n set gridData(gridData: gridData) {\n this.uidata = gridData;\n this.#SetupPanels();\n this.UpdateCursorInfo();\n this.Render();\n }\n\n get gridDataPanels(): panels {\n return this.uidata.panels;\n }\n\n set gridDataPanels(gridDataPanels: panels) {\n this.uidata.panels = gridDataPanels;\n this.#SetupPanels();\n this.UpdateCursorInfo();\n this.Render();\n }\n\n /*\n ExitEx() {\n //@@ override in sub-class\n }\n\n EscapeEx() {\n //@@ override in sub-class\n }\n */\n\n // https://www.npmjs.com/package/blessed\n\n // data:= { title: <str>,\n // grid: { rows: <int>, cols: <int> }, \n // menu: [ { top: <bool>, menuitems: [ { text: <string>, key: <string>, cb: <func> } ] } ]\n // panels: [ { id: <str>, pos: { row: <int>, col: <int>, rowSpan: <int>, colSpan: <int> }, template: <str> } ] }\n /**\n * \n * @param {*} data UI Data\n */\n SetupUI = (): void => {\n this.DestroyUI();\n\n if (this.screen === null) {\n // Create a screen object.\n this.screen = blessed.screen({\n smartCSR: true\n });\n }\n\n if (!this.screen) {\n return;\n }\n\n const data = this.uidata;\n this.screen.title = data.title;\n this.screen.on('resize', () => {\n this.#ReSize();\n this.Render();\n });\n\n if (data.menu !== null) {\n for (let i = 0; i < data.menu.length; i++) {\n new MenuBar.MenuBar(this.screen, data.menu[i]);\n }\n }\n\n // Allow the serrvice to terminate by pressing Control-C.\n this.screen.key(['C-c'], (): void => {\n this.DestroyUI();\n this.emit('exit');\n //this.ExitEx();\n // Cleanly shutdown the main process. Exit code success (> 0 is exit in error state)\n //setTimeout(() => process.kill(process.pid), 0);\n });\n\n this.screen.key(['escape'], (): void => {\n this.emit('escape');\n //this.EscapeEx();\n // Cleanly shutdown the main process. Exit code success (> 0 is exit in error state)\n //setTimeout(() => process.kill(process.pid), 0);\n });\n\n this.#SetupPanels();\n\n this.#cursorInfo = blessed.box({\n parent: this.screen,\n bottom: 0,\n right: 0,\n width: 'shrink',\n height: 1,\n style:\n {\n bg: 'gray'\n , fg: 'white'\n },\n keys: false, // Do not allow default key handling for this box\n mouse: false,\n content: '',\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n this.sortInfo = blessed.box({\n parent: this.screen,\n top: 0,\n right: 0,\n width: 'shrink',\n height: 1,\n style:\n {\n bg: 'gray'\n , fg: 'white'\n },\n keys: false, // Do not allow default key handling for this box\n mouse: false,\n content: '',\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n\n this.screenHeader = blessed.box({\n parent: this.screen,\n top: 0,\n left: 'center',\n width: 'shrink',\n height: 1,\n style:\n {\n bg: 'gray'\n , fg: 'white'\n },\n keys: false, // Do not allow default key handling for this box\n mouse: false,\n content: `[ ... ]`,\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n this.UpdateCursorInfo();\n this.UpdateSortInfo('Default');\n this.UpdateScreenHeader(this.screenHeaderText);\n\n // Render the screen.\n this.Render();\n }\n\n UpdateCursorInfo = (): void => {\n if (this.#cursorInfo) {\n this.#cursorInfo.setContent(`Cursor: ${this.#cursor} / ${this.TotalPanelNumber}`);\n }\n }\n\n UpdateSortInfo = (sortMode: string): void => {\n if (this.sortInfo) {\n this.sortInfo.setContent(`Sort: ${sortMode}`);\n }\n }\n\n UpdateScreenHeader = (screenHeaderText: string): void => {\n this.screenHeaderText = screenHeaderText;\n if (this.screenHeader) {\n this.screenHeader.setContent(`[ ${screenHeaderText} ]`);\n }\n }\n\n get rows(): number {\n return this.uidata.grid.rows;\n }\n\n get cols(): number {\n return this.uidata.grid.cols;\n }\n\n IncRows = (): void => {\n if (this.screen && (this.screen.height / (this.uidata.grid.rows+1) > this.minHeight)) {\n this.uidata.grid.rows++;\n this.CheckCursor();\n this.#UpdateUI();\n }\n }\n\n DecRows = (): void => {\n if (this.uidata.grid.rows > this.minRows) {\n this.uidata.grid.rows--;\n this.CheckCursor();\n this.#UpdateUI();\n }\n }\n\n IncCols = (): void => {\n if (this.screen && (this.screen.width / (this.uidata.grid.cols+1) > this.minWidth)) {\n this.uidata.grid.cols++;\n this.CheckCursor();\n this.#UpdateUI();\n }\n }\n\n DecCols = (): void => {\n if (this.uidata.grid.cols > this.minCols) {\n this.uidata.grid.cols--;\n this.CheckCursor();\n this.#UpdateUI();\n }\n }\n\n get ScreenCells(): number {\n return this.uidata.grid.cols * this.uidata.grid.rows;\n }\n\n get TotalPanelNumber(): number {\n return Object.keys(this.uidata.panels).length;\n }\n\n CheckCursor = (): void => {\n if (this.#cursor > (this.TotalPanelNumber - this.ScreenCells)) {\n this.#cursor = this.TotalPanelNumber - this.ScreenCells;\n if (this.#cursor < 0) {\n this.#cursor = 0;\n }\n }\n this.UpdateCursorInfo();\n }\n\n NextPage = (): void => {\n const endpos = this.TotalPanelNumber - this.ScreenCells;\n if (this.#cursor < endpos) {\n this.#cursor += this.ScreenCells;\n if (this.#cursor > endpos) {\n this.#cursor = endpos;\n }\n this.#UpdateUI();\n }\n }\n\n PrevPage = (): void => {\n if (this.#cursor > 0) {\n this.#cursor -= this.ScreenCells;\n if (this.#cursor < 0) {\n this.#cursor = 0;\n }\n this.#UpdateUI();\n }\n }\n\n #UpdateUI(): void {\n this.SetupUI();\n\n //@@ fix screen render - should not need to blow entire screen away ...\n //this.#SetupPanels();\n //this.UpdateCursorInfo();\n //this.Render();\n }\n\n Exit = (): void => {\n this.DestroyUI();\n this.emit('exit');\n //this.ExitEx();\n }\n\n /**\n * \n */\n DestroyUI = (): void => {\n // Destroy the screen and disable UI log processing\n if (this.screen !== null) {\n this.uiBoxes = { };\n this.screen.destroy();\n this.screen = null;\n }\n }\n\n /**\n * Render the screen.\n */\n Render = (): void => {\n if (this.screen) {\n this.screen.render();\n }\n }\n}\n"],"names":["MenuBar.MenuBar","uuidv4"],"mappings":"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"}
|
package/dist/stsui.umd.js
CHANGED
|
@@ -2,35 +2,18 @@
|
|
|
2
2
|
typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("node:events"), require("blessed"), require("uuid")) : typeof define === "function" && define.amd ? define(["exports", "node:events", "blessed", "uuid"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global["@nsshunt/stsui"] = {}, global.events, global.blessed, global.uuid));
|
|
3
3
|
})(this, function(exports2, EventEmitter, blessed, uuid) {
|
|
4
4
|
"use strict";var __defProp = Object.defineProperty;
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
8
|
-
return value;
|
|
9
|
-
};
|
|
10
|
-
var __accessCheck = (obj, member, msg) => {
|
|
11
|
-
if (!member.has(obj))
|
|
12
|
-
throw TypeError("Cannot " + msg);
|
|
13
|
-
};
|
|
14
|
-
var __privateGet = (obj, member, getter) => {
|
|
15
|
-
__accessCheck(obj, member, "read from private field");
|
|
16
|
-
return getter ? getter.call(obj) : member.get(obj);
|
|
17
|
-
};
|
|
18
|
-
var __privateAdd = (obj, member, value) => {
|
|
19
|
-
if (member.has(obj))
|
|
20
|
-
throw TypeError("Cannot add the same private member more than once");
|
|
21
|
-
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
22
|
-
};
|
|
23
|
-
var __privateSet = (obj, member, value, setter) => {
|
|
24
|
-
__accessCheck(obj, member, "write to private field");
|
|
25
|
-
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
26
|
-
return value;
|
|
27
|
-
};
|
|
28
|
-
var __privateMethod = (obj, member, method) => {
|
|
29
|
-
__accessCheck(obj, member, "access private method");
|
|
30
|
-
return method;
|
|
5
|
+
var __typeError = (msg) => {
|
|
6
|
+
throw TypeError(msg);
|
|
31
7
|
};
|
|
8
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
10
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
11
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
12
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
13
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
14
|
+
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
32
15
|
|
|
33
|
-
var _cursor, _renderPanelFn, _cursorInfo, _CalcBoxPos, _UpdateUIBoxPos, _ReSize, _UpdatePanelPosition,
|
|
16
|
+
var _cursor, _renderPanelFn, _cursorInfo, _CalcBoxPos, _UpdateUIBoxPos, _ReSize, _UpdatePanelPosition, _STSUIFrame_instances, SetupPanels_fn, UpdateUI_fn;
|
|
34
17
|
class MenuBar {
|
|
35
18
|
// options := { screen: <blessed screen>, top: <bool>, menuitems: [ { text: <string>, key: <string>, cb: <call back func> } ] }
|
|
36
19
|
constructor(screen, options) {
|
|
@@ -90,17 +73,7 @@ var __privateMethod = (obj, member, method) => {
|
|
|
90
73
|
*/
|
|
91
74
|
constructor(data, renderPanelFn = null) {
|
|
92
75
|
super();
|
|
93
|
-
|
|
94
|
-
ClickEx(panel: any) {
|
|
95
|
-
//@@ override in sub-class
|
|
96
|
-
}
|
|
97
|
-
*/
|
|
98
|
-
/**
|
|
99
|
-
*
|
|
100
|
-
* Setup all panels
|
|
101
|
-
*/
|
|
102
|
-
__privateAdd(this, _SetupPanels);
|
|
103
|
-
__privateAdd(this, _UpdateUI);
|
|
76
|
+
__privateAdd(this, _STSUIFrame_instances);
|
|
104
77
|
//export class STSUIFrame {
|
|
105
78
|
__publicField(this, "uiBoxes", {});
|
|
106
79
|
// { box: <<blessed box>>, boxHeader: <<blessed box>> }
|
|
@@ -124,10 +97,8 @@ var __privateMethod = (obj, member, method) => {
|
|
|
124
97
|
* @returns object with top, left, width and height correctly set
|
|
125
98
|
*/
|
|
126
99
|
__privateAdd(this, _CalcBoxPos, (panel) => {
|
|
127
|
-
if (!this.screen)
|
|
128
|
-
|
|
129
|
-
if (!panel.pos)
|
|
130
|
-
return null;
|
|
100
|
+
if (!this.screen) return null;
|
|
101
|
+
if (!panel.pos) return null;
|
|
131
102
|
let screenHeight = this.screen.height;
|
|
132
103
|
if (this.uidata.menu !== null) {
|
|
133
104
|
screenHeight -= this.uidata.menu.length;
|
|
@@ -246,7 +217,7 @@ var __privateMethod = (obj, member, method) => {
|
|
|
246
217
|
this.screen.key(["escape"], () => {
|
|
247
218
|
this.emit("escape");
|
|
248
219
|
});
|
|
249
|
-
__privateMethod(this,
|
|
220
|
+
__privateMethod(this, _STSUIFrame_instances, SetupPanels_fn).call(this);
|
|
250
221
|
__privateSet(this, _cursorInfo, blessed.box({
|
|
251
222
|
parent: this.screen,
|
|
252
223
|
bottom: 0,
|
|
@@ -323,28 +294,28 @@ var __privateMethod = (obj, member, method) => {
|
|
|
323
294
|
if (this.screen && this.screen.height / (this.uidata.grid.rows + 1) > this.minHeight) {
|
|
324
295
|
this.uidata.grid.rows++;
|
|
325
296
|
this.CheckCursor();
|
|
326
|
-
__privateMethod(this,
|
|
297
|
+
__privateMethod(this, _STSUIFrame_instances, UpdateUI_fn).call(this);
|
|
327
298
|
}
|
|
328
299
|
});
|
|
329
300
|
__publicField(this, "DecRows", () => {
|
|
330
301
|
if (this.uidata.grid.rows > this.minRows) {
|
|
331
302
|
this.uidata.grid.rows--;
|
|
332
303
|
this.CheckCursor();
|
|
333
|
-
__privateMethod(this,
|
|
304
|
+
__privateMethod(this, _STSUIFrame_instances, UpdateUI_fn).call(this);
|
|
334
305
|
}
|
|
335
306
|
});
|
|
336
307
|
__publicField(this, "IncCols", () => {
|
|
337
308
|
if (this.screen && this.screen.width / (this.uidata.grid.cols + 1) > this.minWidth) {
|
|
338
309
|
this.uidata.grid.cols++;
|
|
339
310
|
this.CheckCursor();
|
|
340
|
-
__privateMethod(this,
|
|
311
|
+
__privateMethod(this, _STSUIFrame_instances, UpdateUI_fn).call(this);
|
|
341
312
|
}
|
|
342
313
|
});
|
|
343
314
|
__publicField(this, "DecCols", () => {
|
|
344
315
|
if (this.uidata.grid.cols > this.minCols) {
|
|
345
316
|
this.uidata.grid.cols--;
|
|
346
317
|
this.CheckCursor();
|
|
347
|
-
__privateMethod(this,
|
|
318
|
+
__privateMethod(this, _STSUIFrame_instances, UpdateUI_fn).call(this);
|
|
348
319
|
}
|
|
349
320
|
});
|
|
350
321
|
__publicField(this, "CheckCursor", () => {
|
|
@@ -363,7 +334,7 @@ var __privateMethod = (obj, member, method) => {
|
|
|
363
334
|
if (__privateGet(this, _cursor) > endpos) {
|
|
364
335
|
__privateSet(this, _cursor, endpos);
|
|
365
336
|
}
|
|
366
|
-
__privateMethod(this,
|
|
337
|
+
__privateMethod(this, _STSUIFrame_instances, UpdateUI_fn).call(this);
|
|
367
338
|
}
|
|
368
339
|
});
|
|
369
340
|
__publicField(this, "PrevPage", () => {
|
|
@@ -372,7 +343,7 @@ var __privateMethod = (obj, member, method) => {
|
|
|
372
343
|
if (__privateGet(this, _cursor) < 0) {
|
|
373
344
|
__privateSet(this, _cursor, 0);
|
|
374
345
|
}
|
|
375
|
-
__privateMethod(this,
|
|
346
|
+
__privateMethod(this, _STSUIFrame_instances, UpdateUI_fn).call(this);
|
|
376
347
|
}
|
|
377
348
|
});
|
|
378
349
|
__publicField(this, "Exit", () => {
|
|
@@ -406,7 +377,7 @@ var __privateMethod = (obj, member, method) => {
|
|
|
406
377
|
}
|
|
407
378
|
set gridData(gridData) {
|
|
408
379
|
this.uidata = gridData;
|
|
409
|
-
__privateMethod(this,
|
|
380
|
+
__privateMethod(this, _STSUIFrame_instances, SetupPanels_fn).call(this);
|
|
410
381
|
this.UpdateCursorInfo();
|
|
411
382
|
this.Render();
|
|
412
383
|
}
|
|
@@ -415,7 +386,7 @@ var __privateMethod = (obj, member, method) => {
|
|
|
415
386
|
}
|
|
416
387
|
set gridDataPanels(gridDataPanels) {
|
|
417
388
|
this.uidata.panels = gridDataPanels;
|
|
418
|
-
__privateMethod(this,
|
|
389
|
+
__privateMethod(this, _STSUIFrame_instances, SetupPanels_fn).call(this);
|
|
419
390
|
this.UpdateCursorInfo();
|
|
420
391
|
this.Render();
|
|
421
392
|
}
|
|
@@ -439,7 +410,16 @@ var __privateMethod = (obj, member, method) => {
|
|
|
439
410
|
_UpdateUIBoxPos = new WeakMap();
|
|
440
411
|
_ReSize = new WeakMap();
|
|
441
412
|
_UpdatePanelPosition = new WeakMap();
|
|
442
|
-
|
|
413
|
+
_STSUIFrame_instances = new WeakSet();
|
|
414
|
+
/*
|
|
415
|
+
ClickEx(panel: any) {
|
|
416
|
+
//@@ override in sub-class
|
|
417
|
+
}
|
|
418
|
+
*/
|
|
419
|
+
/**
|
|
420
|
+
*
|
|
421
|
+
* Setup all panels
|
|
422
|
+
*/
|
|
443
423
|
SetupPanels_fn = function() {
|
|
444
424
|
if (!this.screen) {
|
|
445
425
|
return;
|
|
@@ -545,7 +525,6 @@ var __privateMethod = (obj, member, method) => {
|
|
|
545
525
|
}
|
|
546
526
|
}
|
|
547
527
|
};
|
|
548
|
-
_UpdateUI = new WeakSet();
|
|
549
528
|
UpdateUI_fn = function() {
|
|
550
529
|
this.SetupUI();
|
|
551
530
|
};
|
package/dist/stsui.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stsui.umd.js","sources":["../src/menubar.ts","../src/stsuiframe.ts"],"sourcesContent":["import blessed from 'blessed';\nimport * as stsBlessed from './index'\n\nexport interface menuitem {\n\ttext: string,\n\tkey: string,\n\tcb(): void\n}\n\nexport interface MenuBarOptions {\n\ttop: boolean\n\tmenuitems: menuitem[]\n}\n\nexport class MenuBar\n{\n private listb:stsBlessed.listbar | null = null;\n\n // options := { screen: <blessed screen>, top: <bool>, menuitems: [ { text: <string>, key: <string>, cb: <call back func> } ] }\n constructor(screen: stsBlessed.screen, options: MenuBarOptions) {\n const compoptions: stsBlessed.elementOptions = {\n parent: screen,\n left: 0,\n right: 0,\n height: 1,\n width: 'shrink',\n mouse: true,\n keys: true,\n autoCommandKeys: true,\n scrollable: true,\n style: {\n fg: 'yellow',\n bg: 'blue',\n\n item: {\n hover: {\n fg: 'white',\n bg: 'green',\n }\n },\n selected: {\n fg: 'black',\n bg: 'yellow',\n }\n }\n }\n if (options.top === true) {\n compoptions.top = 0;\n } else {\n compoptions.bottom = 0;\n }\n\n compoptions.commands = { };\n options.menuitems.forEach((menuItem) => {\n if (compoptions.commands) {\n compoptions.commands[menuItem.text] = {\n keys: [ menuItem.key ],\n callback: menuItem.cb\n }\n }\n })\n\n this.listb = blessed.listbar(compoptions);\n }\n\n get listbar()\n {\n return this.listb;\n }\n}\n","import EventEmitter from 'node:events'\n\n// https://github.com/yaronn/blessed-contrib\n//var contrib = require('blessed-contrib');\nimport blessed from 'blessed';\n\nimport { v4 as uuidv4 } from 'uuid';\n\nimport * as stsBlessed from './index'\nimport * as MenuBar from './menubar'\n\nexport type menuOptions = MenuBar.MenuBarOptions[]\n\nexport interface widget {\n widget: string // Name of the blessed widget\n options: stsBlessed.elementOptions // blessed widget options - used in the constructor of the blessed widget\n}\n\nexport interface widgets {\n [widgetName: string]: widget\n}\n\nexport interface panel {\n id: string,\n pos?: {\n row: number,\n col: number,\n rowSpan: number,\n colSpan: number\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: any\n panelHeader: string,\n widgets: widgets | null\n}\n\nexport interface panels {\n [panelId: string]: panel\n}\n\nexport interface gridData {\n\ttitle: string\n\tgrid: { rows: number, cols: number },\n\tmenu: menuOptions,\n\tpanels: panels\n}\n\nexport interface renderPanelCb {\n\t(box: stsBlessed.box, panel: panel): void\n}\n\nexport interface boxPos {\n\ttop: number,\n\tleft: number,\n\twidth: number,\n\theight: number\n}\n\nexport interface uiBox {\n\tbox: stsBlessed.box, // blessed box\n\tboxHeader: stsBlessed.listbar // blessed box\n}\n\nexport interface uiBoxes {\n\t[key: string]: uiBox\n}\n\nexport class STSUIFrame extends EventEmitter {\n//export class STSUIFrame {\n private uiBoxes:uiBoxes = { }; // { box: <<blessed box>>, boxHeader: <<blessed box>> }\n private screen: stsBlessed.screen | null = null;\n #cursor = 0; // panel index with the complete model data.\n #renderPanelFn: renderPanelCb | null = null;\n private screenHeaderText = '...';\n\n private minRows = 1;\n private minCols = 1;\n private minWidth = 40;\n private minHeight = 7;\n\n #cursorInfo: stsBlessed.box | null = null;\n private sortInfo: stsBlessed.box | null = null; // Current sort mode UI box control\n private screenHeader: stsBlessed.box | null = null;\n\n private uidata: gridData;\n\n /**\n * \n * @param {*} data The screen layout data. Schema: { title: <str>,\n * grid: { rows: <int>, cols: <int> }, \n * panels: [ { id: <str>, pos: { row: <int>, col: <int>, rowSpan: <int>, colSpan: <int> }, \n * template: <handlebars func>, widgets: { [ { <prop_name>: <blessed widget> } ] } } ] }\n */\n constructor(data: gridData, renderPanelFn: renderPanelCb | null = null) {\n super();\n this.uidata = data;\n this.#renderPanelFn = renderPanelFn;\n this.SetupUI();\n }\n\n /**\n * \n * @param {number} position The index (0 based) for the panel item to be calculated\n * @returns object with top, left, width and height correctly set\n */\n #CalcBoxPos = (panel: panel): boxPos | null => {\n // Calculate the position and dimensions for this UI element\n\n if (!this.screen) return null;\n if (!panel.pos) return null;\n\n let screenHeight = this.screen.height;\n if (this.uidata.menu !== null) {\n screenHeight -= this.uidata.menu.length; // Allow for any menu items\n }\n const screenWidth = this.screen.width;\n\n const rows = this.uidata.grid.rows;\n const cols = this.uidata.grid.cols;\n\n const pos = panel.pos;\n\n const colWidth = Math.floor(screenWidth / cols);\n const rowHeight = Math.floor(screenHeight / rows);\n\n // Allow for a top offset if a top menu is present\n let topoffset = 0;\n if (this.uidata.menu !== null) {\n for (const [, value] of Object.entries(this.uidata.menu)) {\n if (value.top === true) {\n topoffset = 1;\n break;\n }\n }\n }\n\n const boxPos: boxPos = {\n top: (pos.row * rowHeight) + topoffset,\n left: pos.col * colWidth,\n width: colWidth * pos.colSpan,\n height: rowHeight * pos.rowSpan\n }\n\n // Now check if this panel is on the far right and if so adjust for a perfect fit\n\n if ((pos.col + pos.colSpan) === cols) {\n //if (pos.col === (cols - 1)) {\n boxPos.width = screenWidth - (pos.col * colWidth);\n }\n\n // Now check if this panel is on the bottom and if so adjust for a perfect fit\n if ((pos.row + pos.rowSpan) === rows) {\n boxPos.height = screenHeight - (pos.row * rowHeight);\n }\n\n return boxPos;\n }\n\n #UpdateUIBoxPos = (panel: panel, uiBox: uiBox): void => {\n const pos: boxPos | null = this.#CalcBoxPos(panel);\n if (!pos) {\n return;\n }\n\n uiBox.box.top = pos.top;\n uiBox.box.left = pos.left;\n uiBox.box.width = pos.width;\n uiBox.box.height = pos.height;\n\n uiBox.boxHeader.top = pos.top;\n uiBox.boxHeader.left = pos.left + 2;\n\n if (typeof panel.widgets !== 'undefined' && panel.widgets !== null) {\n for (const [, value] of Object.entries(panel.widgets)) {\n if (value.widget === 'log') {\n const widget = uiBox.box.get(value.widget) as stsBlessed.element;\n if (widget.position.top >= (uiBox.box.height - 4)) {\n widget.position.top = uiBox.box.height - 4;\n } else {\n if (value.options.top) {\n widget.position.top = value.options.top;\n }\n }\n }\n }\n }\n };\n\n /**\n * ReSize the grid layout\n */\n #ReSize = (): void => {\n for (const [, value] of Object.entries(this.uiBoxes)) {\n this.#UpdateUIBoxPos(value.box.get('panel') as panel, value);\n }\n }\n\n #UpdatePanelPosition = (panel: panel, row: number, col: number, uiBox: uiBox): void => {\n // Update the panel position within the current screen view\n panel.pos = { row: row, col: col, rowSpan: 1, colSpan: 1 };\n this.#UpdateUIBoxPos(panel, uiBox);\n uiBox.boxHeader.setContent(panel.panelHeader);\n }\n\n /*\n ClickEx(panel: any) {\n //@@ override in sub-class\n }\n */\n\n /**\n * \n * Setup all panels\n */\n #SetupPanels(): void {\n if (!this.screen) {\n return;\n }\n\n const panelKeys = Object.keys(this.uidata.panels);\n\n // Check for deleted panels\n const uiBoxIds = Object.keys(this.uiBoxes);\n for (let i=0; i < uiBoxIds.length; i++) {\n if (typeof this.uidata.panels[uiBoxIds[i]] === 'undefined') {\n let uiBox: uiBox | null = this.uiBoxes[uiBoxIds[i]];\n if (typeof uiBox !== 'undefined') {\n this.screen.remove(uiBox.boxHeader);\n this.screen.remove(uiBox.box);\n uiBox = null;\n delete this.uiBoxes[uiBoxIds[i]];\n }\n }\n }\n\n const touched: Record<string, boolean> = { };\n\n for (let i=0; i < (this.uidata.grid.cols * this.uidata.grid.rows); i++) {\n const gridPos = this.#cursor + i;\n const col = i % this.uidata.grid.cols;\n const row = Math.floor(i / this.uidata.grid.cols);\n\n // Get the panel for this position within the grid\n const panel: panel = this.uidata.panels[panelKeys[gridPos]];\n if (typeof panel !== 'undefined') {\n if (typeof this.uiBoxes[panel.id] === 'undefined') {\n // Update the panel position within the current screen view\n panel.pos = { row: row, col: col, rowSpan: 1, colSpan: 1 };\n\n const calculatedBoxPos = this.#CalcBoxPos(panel);\n if (!calculatedBoxPos) {\n return\n }\n const { top, left, width, height } = this.#CalcBoxPos(panel) as boxPos;\n\n // Create the UI box\n const box: stsBlessed.box = blessed.box({\n parent: this.screen,\n top: top,\n left: left,\n width: width,\n height: height,\n style:\n {\n bg: '#101010' // was gray\n ,fg: 'white'\n },\n border:\n {\n type: 'line'\n },\n keys: false, // Do not allow default key handling for this box\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n const boxHeader: stsBlessed.listbar = blessed.box({\n parent: this.screen,\n top: top,\n left: left+2,\n width: 'shrink',\n height: 1,\n style:\n {\n bg: 'gray'\n , fg: 'white'\n },\n keys: false, // Do not allow default key handling for this box\n mouse: false,\n content: panel.panelHeader,\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n this.uiBoxes[panel.id] = { box: box, boxHeader: boxHeader };\n\n boxHeader.setIndex(-1);\n\n // https://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-inside-a-callback\n box.on('click', () => {\n //this.emit('click', box.data.panel);\n this.emit('click', box.get('panel') as panel);\n //this.ClickEx(box.get('panel') as panel);\n });\n\n if (typeof panel.widgets !== 'undefined' && panel.widgets !== null) {\n for (const [, value] of Object.entries(panel.widgets)) {\n // Create a fresh copy of the options for this widget instance.\n // If this is not done, all widgets will use the same options object and will not be able\n // to update screen elements individually.\n const widgetoptions = {...value.options};\n\n // Ensure that we always show at least 2 lines of log data even if this means we position over the top of\n // elements above this position.\n if (widgetoptions.top && (widgetoptions.top >= (box.height - 3))) {\n widgetoptions.top = box.height - 4;\n }\n const widget: stsBlessed.element = blessed[value.widget].call(this, widgetoptions);\n widget.set('id', uuidv4());\n box.append(widget);\n box.set(value.widget, widget); // Set the user data for this widget. This allows the handlebars template access via the name from the box object.\n }\n }\n\n // The entire panel is accessible using the _panel property.\n // This is so that the model is accessible from within the handlebars templates.\n // Access to a named widget can be done using box._panel.widgets[name] or box._panel.widgets.name\n box.set('panel', panel);\n\n this.uiBoxes[panel.id].box = box;\n\n touched[panel.id] = true;\n } else {\n //@@ need to hide previous positions\n //@@ and show ones that are visible\n this.#UpdatePanelPosition(panel, row, col, this.uiBoxes[panel.id]);\n\n touched[panel.id] = true;\n //this.#uiBox[panel.id].box.show();\n }\n\n // Render the uiBox with the renderPanelFn using the panel as the utility including the model\n if (this.#renderPanelFn) {\n this.#renderPanelFn(this.uiBoxes[panel.id].box, panel);\n }\n }\n }\n\n for (const [key, ] of Object.entries(this.uiBoxes)) {\n if (typeof touched[key] === 'undefined') {\n this.uiBoxes[key].box.hide();\n this.uiBoxes[key].boxHeader.hide();\n } else {\n this.uiBoxes[key].box.show();\n this.uiBoxes[key].boxHeader.show();\n }\n }\n\n }\n\n get gridData(): gridData {\n return this.uidata;\n }\n\n set gridData(gridData: gridData) {\n this.uidata = gridData;\n this.#SetupPanels();\n this.UpdateCursorInfo();\n this.Render();\n }\n\n get gridDataPanels(): panels {\n return this.uidata.panels;\n }\n\n set gridDataPanels(gridDataPanels: panels) {\n this.uidata.panels = gridDataPanels;\n this.#SetupPanels();\n this.UpdateCursorInfo();\n this.Render();\n }\n\n /*\n ExitEx() {\n //@@ override in sub-class\n }\n\n EscapeEx() {\n //@@ override in sub-class\n }\n */\n\n // https://www.npmjs.com/package/blessed\n\n // data:= { title: <str>,\n // grid: { rows: <int>, cols: <int> }, \n // menu: [ { top: <bool>, menuitems: [ { text: <string>, key: <string>, cb: <func> } ] } ]\n // panels: [ { id: <str>, pos: { row: <int>, col: <int>, rowSpan: <int>, colSpan: <int> }, template: <str> } ] }\n /**\n * \n * @param {*} data UI Data\n */\n SetupUI = (): void => {\n this.DestroyUI();\n\n if (this.screen === null) {\n // Create a screen object.\n this.screen = blessed.screen({\n smartCSR: true\n });\n }\n\n if (!this.screen) {\n return;\n }\n\n const data = this.uidata;\n this.screen.title = data.title;\n this.screen.on('resize', () => {\n this.#ReSize();\n this.Render();\n });\n\n if (data.menu !== null) {\n for (let i = 0; i < data.menu.length; i++) {\n new MenuBar.MenuBar(this.screen, data.menu[i]);\n }\n }\n\n // Allow the serrvice to terminate by pressing Control-C.\n this.screen.key(['C-c'], (): void => {\n this.DestroyUI();\n this.emit('exit');\n //this.ExitEx();\n // Cleanly shutdown the main process. Exit code success (> 0 is exit in error state)\n //setTimeout(() => process.kill(process.pid), 0);\n });\n\n this.screen.key(['escape'], (): void => {\n this.emit('escape');\n //this.EscapeEx();\n // Cleanly shutdown the main process. Exit code success (> 0 is exit in error state)\n //setTimeout(() => process.kill(process.pid), 0);\n });\n\n this.#SetupPanels();\n\n this.#cursorInfo = blessed.box({\n parent: this.screen,\n bottom: 0,\n right: 0,\n width: 'shrink',\n height: 1,\n style:\n {\n bg: 'gray'\n , fg: 'white'\n },\n keys: false, // Do not allow default key handling for this box\n mouse: false,\n content: '',\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n this.sortInfo = blessed.box({\n parent: this.screen,\n top: 0,\n right: 0,\n width: 'shrink',\n height: 1,\n style:\n {\n bg: 'gray'\n , fg: 'white'\n },\n keys: false, // Do not allow default key handling for this box\n mouse: false,\n content: '',\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n\n this.screenHeader = blessed.box({\n parent: this.screen,\n top: 0,\n left: 'center',\n width: 'shrink',\n height: 1,\n style:\n {\n bg: 'gray'\n , fg: 'white'\n },\n keys: false, // Do not allow default key handling for this box\n mouse: false,\n content: `[ ... ]`,\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n this.UpdateCursorInfo();\n this.UpdateSortInfo('Default');\n this.UpdateScreenHeader(this.screenHeaderText);\n\n // Render the screen.\n this.Render();\n }\n\n UpdateCursorInfo = (): void => {\n if (this.#cursorInfo) {\n this.#cursorInfo.setContent(`Cursor: ${this.#cursor} / ${this.TotalPanelNumber}`);\n }\n }\n\n UpdateSortInfo = (sortMode: string): void => {\n if (this.sortInfo) {\n this.sortInfo.setContent(`Sort: ${sortMode}`);\n }\n }\n\n UpdateScreenHeader = (screenHeaderText: string): void => {\n this.screenHeaderText = screenHeaderText;\n if (this.screenHeader) {\n this.screenHeader.setContent(`[ ${screenHeaderText} ]`);\n }\n }\n\n get rows(): number {\n return this.uidata.grid.rows;\n }\n\n get cols(): number {\n return this.uidata.grid.cols;\n }\n\n IncRows = (): void => {\n if (this.screen && (this.screen.height / (this.uidata.grid.rows+1) > this.minHeight)) {\n this.uidata.grid.rows++;\n this.CheckCursor();\n this.#UpdateUI();\n }\n }\n\n DecRows = (): void => {\n if (this.uidata.grid.rows > this.minRows) {\n this.uidata.grid.rows--;\n this.CheckCursor();\n this.#UpdateUI();\n }\n }\n\n IncCols = (): void => {\n if (this.screen && (this.screen.width / (this.uidata.grid.cols+1) > this.minWidth)) {\n this.uidata.grid.cols++;\n this.CheckCursor();\n this.#UpdateUI();\n }\n }\n\n DecCols = (): void => {\n if (this.uidata.grid.cols > this.minCols) {\n this.uidata.grid.cols--;\n this.CheckCursor();\n this.#UpdateUI();\n }\n }\n\n get ScreenCells(): number {\n return this.uidata.grid.cols * this.uidata.grid.rows;\n }\n\n get TotalPanelNumber(): number {\n return Object.keys(this.uidata.panels).length;\n }\n\n CheckCursor = (): void => {\n if (this.#cursor > (this.TotalPanelNumber - this.ScreenCells)) {\n this.#cursor = this.TotalPanelNumber - this.ScreenCells;\n if (this.#cursor < 0) {\n this.#cursor = 0;\n }\n }\n this.UpdateCursorInfo();\n }\n\n NextPage = (): void => {\n const endpos = this.TotalPanelNumber - this.ScreenCells;\n if (this.#cursor < endpos) {\n this.#cursor += this.ScreenCells;\n if (this.#cursor > endpos) {\n this.#cursor = endpos;\n }\n this.#UpdateUI();\n }\n }\n\n PrevPage = (): void => {\n if (this.#cursor > 0) {\n this.#cursor -= this.ScreenCells;\n if (this.#cursor < 0) {\n this.#cursor = 0;\n }\n this.#UpdateUI();\n }\n }\n\n #UpdateUI(): void {\n this.SetupUI();\n\n //@@ fix screen render - should not need to blow entire screen away ...\n //this.#SetupPanels();\n //this.UpdateCursorInfo();\n //this.Render();\n }\n\n Exit = (): void => {\n this.DestroyUI();\n this.emit('exit');\n //this.ExitEx();\n }\n\n /**\n * \n */\n DestroyUI = (): void => {\n // Destroy the screen and disable UI log processing\n if (this.screen !== null) {\n this.uiBoxes = { };\n this.screen.destroy();\n this.screen = null;\n }\n }\n\n /**\n * Render the screen.\n */\n Render = (): void => {\n if (this.screen) {\n this.screen.render();\n }\n }\n}\n"],"names":["MenuBar.MenuBar","uuidv4"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stsui.umd.js","sources":["../src/menubar.ts","../src/stsuiframe.ts"],"sourcesContent":["import blessed from 'blessed';\nimport * as stsBlessed from './index'\n\nexport interface menuitem {\n\ttext: string,\n\tkey: string,\n\tcb(): void\n}\n\nexport interface MenuBarOptions {\n\ttop: boolean\n\tmenuitems: menuitem[]\n}\n\nexport class MenuBar\n{\n private listb:stsBlessed.listbar | null = null;\n\n // options := { screen: <blessed screen>, top: <bool>, menuitems: [ { text: <string>, key: <string>, cb: <call back func> } ] }\n constructor(screen: stsBlessed.screen, options: MenuBarOptions) {\n const compoptions: stsBlessed.elementOptions = {\n parent: screen,\n left: 0,\n right: 0,\n height: 1,\n width: 'shrink',\n mouse: true,\n keys: true,\n autoCommandKeys: true,\n scrollable: true,\n style: {\n fg: 'yellow',\n bg: 'blue',\n\n item: {\n hover: {\n fg: 'white',\n bg: 'green',\n }\n },\n selected: {\n fg: 'black',\n bg: 'yellow',\n }\n }\n }\n if (options.top === true) {\n compoptions.top = 0;\n } else {\n compoptions.bottom = 0;\n }\n\n compoptions.commands = { };\n options.menuitems.forEach((menuItem) => {\n if (compoptions.commands) {\n compoptions.commands[menuItem.text] = {\n keys: [ menuItem.key ],\n callback: menuItem.cb\n }\n }\n })\n\n this.listb = blessed.listbar(compoptions);\n }\n\n get listbar()\n {\n return this.listb;\n }\n}\n","import EventEmitter from 'node:events'\n\n// https://github.com/yaronn/blessed-contrib\n//var contrib = require('blessed-contrib');\nimport blessed from 'blessed';\n\nimport { v4 as uuidv4 } from 'uuid';\n\nimport * as stsBlessed from './index'\nimport * as MenuBar from './menubar'\n\nexport type menuOptions = MenuBar.MenuBarOptions[]\n\nexport interface widget {\n widget: string // Name of the blessed widget\n options: stsBlessed.elementOptions // blessed widget options - used in the constructor of the blessed widget\n}\n\nexport interface widgets {\n [widgetName: string]: widget\n}\n\nexport interface panel {\n id: string,\n pos?: {\n row: number,\n col: number,\n rowSpan: number,\n colSpan: number\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: any\n panelHeader: string,\n widgets: widgets | null\n}\n\nexport interface panels {\n [panelId: string]: panel\n}\n\nexport interface gridData {\n\ttitle: string\n\tgrid: { rows: number, cols: number },\n\tmenu: menuOptions,\n\tpanels: panels\n}\n\nexport interface renderPanelCb {\n\t(box: stsBlessed.box, panel: panel): void\n}\n\nexport interface boxPos {\n\ttop: number,\n\tleft: number,\n\twidth: number,\n\theight: number\n}\n\nexport interface uiBox {\n\tbox: stsBlessed.box, // blessed box\n\tboxHeader: stsBlessed.listbar // blessed box\n}\n\nexport interface uiBoxes {\n\t[key: string]: uiBox\n}\n\nexport class STSUIFrame extends EventEmitter {\n//export class STSUIFrame {\n private uiBoxes:uiBoxes = { }; // { box: <<blessed box>>, boxHeader: <<blessed box>> }\n private screen: stsBlessed.screen | null = null;\n #cursor = 0; // panel index with the complete model data.\n #renderPanelFn: renderPanelCb | null = null;\n private screenHeaderText = '...';\n\n private minRows = 1;\n private minCols = 1;\n private minWidth = 40;\n private minHeight = 7;\n\n #cursorInfo: stsBlessed.box | null = null;\n private sortInfo: stsBlessed.box | null = null; // Current sort mode UI box control\n private screenHeader: stsBlessed.box | null = null;\n\n private uidata: gridData;\n\n /**\n * \n * @param {*} data The screen layout data. Schema: { title: <str>,\n * grid: { rows: <int>, cols: <int> }, \n * panels: [ { id: <str>, pos: { row: <int>, col: <int>, rowSpan: <int>, colSpan: <int> }, \n * template: <handlebars func>, widgets: { [ { <prop_name>: <blessed widget> } ] } } ] }\n */\n constructor(data: gridData, renderPanelFn: renderPanelCb | null = null) {\n super();\n this.uidata = data;\n this.#renderPanelFn = renderPanelFn;\n this.SetupUI();\n }\n\n /**\n * \n * @param {number} position The index (0 based) for the panel item to be calculated\n * @returns object with top, left, width and height correctly set\n */\n #CalcBoxPos = (panel: panel): boxPos | null => {\n // Calculate the position and dimensions for this UI element\n\n if (!this.screen) return null;\n if (!panel.pos) return null;\n\n let screenHeight = this.screen.height;\n if (this.uidata.menu !== null) {\n screenHeight -= this.uidata.menu.length; // Allow for any menu items\n }\n const screenWidth = this.screen.width;\n\n const rows = this.uidata.grid.rows;\n const cols = this.uidata.grid.cols;\n\n const pos = panel.pos;\n\n const colWidth = Math.floor(screenWidth / cols);\n const rowHeight = Math.floor(screenHeight / rows);\n\n // Allow for a top offset if a top menu is present\n let topoffset = 0;\n if (this.uidata.menu !== null) {\n for (const [, value] of Object.entries(this.uidata.menu)) {\n if (value.top === true) {\n topoffset = 1;\n break;\n }\n }\n }\n\n const boxPos: boxPos = {\n top: (pos.row * rowHeight) + topoffset,\n left: pos.col * colWidth,\n width: colWidth * pos.colSpan,\n height: rowHeight * pos.rowSpan\n }\n\n // Now check if this panel is on the far right and if so adjust for a perfect fit\n\n if ((pos.col + pos.colSpan) === cols) {\n //if (pos.col === (cols - 1)) {\n boxPos.width = screenWidth - (pos.col * colWidth);\n }\n\n // Now check if this panel is on the bottom and if so adjust for a perfect fit\n if ((pos.row + pos.rowSpan) === rows) {\n boxPos.height = screenHeight - (pos.row * rowHeight);\n }\n\n return boxPos;\n }\n\n #UpdateUIBoxPos = (panel: panel, uiBox: uiBox): void => {\n const pos: boxPos | null = this.#CalcBoxPos(panel);\n if (!pos) {\n return;\n }\n\n uiBox.box.top = pos.top;\n uiBox.box.left = pos.left;\n uiBox.box.width = pos.width;\n uiBox.box.height = pos.height;\n\n uiBox.boxHeader.top = pos.top;\n uiBox.boxHeader.left = pos.left + 2;\n\n if (typeof panel.widgets !== 'undefined' && panel.widgets !== null) {\n for (const [, value] of Object.entries(panel.widgets)) {\n if (value.widget === 'log') {\n const widget = uiBox.box.get(value.widget) as stsBlessed.element;\n if (widget.position.top >= (uiBox.box.height - 4)) {\n widget.position.top = uiBox.box.height - 4;\n } else {\n if (value.options.top) {\n widget.position.top = value.options.top;\n }\n }\n }\n }\n }\n };\n\n /**\n * ReSize the grid layout\n */\n #ReSize = (): void => {\n for (const [, value] of Object.entries(this.uiBoxes)) {\n this.#UpdateUIBoxPos(value.box.get('panel') as panel, value);\n }\n }\n\n #UpdatePanelPosition = (panel: panel, row: number, col: number, uiBox: uiBox): void => {\n // Update the panel position within the current screen view\n panel.pos = { row: row, col: col, rowSpan: 1, colSpan: 1 };\n this.#UpdateUIBoxPos(panel, uiBox);\n uiBox.boxHeader.setContent(panel.panelHeader);\n }\n\n /*\n ClickEx(panel: any) {\n //@@ override in sub-class\n }\n */\n\n /**\n * \n * Setup all panels\n */\n #SetupPanels(): void {\n if (!this.screen) {\n return;\n }\n\n const panelKeys = Object.keys(this.uidata.panels);\n\n // Check for deleted panels\n const uiBoxIds = Object.keys(this.uiBoxes);\n for (let i=0; i < uiBoxIds.length; i++) {\n if (typeof this.uidata.panels[uiBoxIds[i]] === 'undefined') {\n let uiBox: uiBox | null = this.uiBoxes[uiBoxIds[i]];\n if (typeof uiBox !== 'undefined') {\n this.screen.remove(uiBox.boxHeader);\n this.screen.remove(uiBox.box);\n uiBox = null;\n delete this.uiBoxes[uiBoxIds[i]];\n }\n }\n }\n\n const touched: Record<string, boolean> = { };\n\n for (let i=0; i < (this.uidata.grid.cols * this.uidata.grid.rows); i++) {\n const gridPos = this.#cursor + i;\n const col = i % this.uidata.grid.cols;\n const row = Math.floor(i / this.uidata.grid.cols);\n\n // Get the panel for this position within the grid\n const panel: panel = this.uidata.panels[panelKeys[gridPos]];\n if (typeof panel !== 'undefined') {\n if (typeof this.uiBoxes[panel.id] === 'undefined') {\n // Update the panel position within the current screen view\n panel.pos = { row: row, col: col, rowSpan: 1, colSpan: 1 };\n\n const calculatedBoxPos = this.#CalcBoxPos(panel);\n if (!calculatedBoxPos) {\n return\n }\n const { top, left, width, height } = this.#CalcBoxPos(panel) as boxPos;\n\n // Create the UI box\n const box: stsBlessed.box = blessed.box({\n parent: this.screen,\n top: top,\n left: left,\n width: width,\n height: height,\n style:\n {\n bg: '#101010' // was gray\n ,fg: 'white'\n },\n border:\n {\n type: 'line'\n },\n keys: false, // Do not allow default key handling for this box\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n const boxHeader: stsBlessed.listbar = blessed.box({\n parent: this.screen,\n top: top,\n left: left+2,\n width: 'shrink',\n height: 1,\n style:\n {\n bg: 'gray'\n , fg: 'white'\n },\n keys: false, // Do not allow default key handling for this box\n mouse: false,\n content: panel.panelHeader,\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n this.uiBoxes[panel.id] = { box: box, boxHeader: boxHeader };\n\n boxHeader.setIndex(-1);\n\n // https://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-inside-a-callback\n box.on('click', () => {\n //this.emit('click', box.data.panel);\n this.emit('click', box.get('panel') as panel);\n //this.ClickEx(box.get('panel') as panel);\n });\n\n if (typeof panel.widgets !== 'undefined' && panel.widgets !== null) {\n for (const [, value] of Object.entries(panel.widgets)) {\n // Create a fresh copy of the options for this widget instance.\n // If this is not done, all widgets will use the same options object and will not be able\n // to update screen elements individually.\n const widgetoptions = {...value.options};\n\n // Ensure that we always show at least 2 lines of log data even if this means we position over the top of\n // elements above this position.\n if (widgetoptions.top && (widgetoptions.top >= (box.height - 3))) {\n widgetoptions.top = box.height - 4;\n }\n const widget: stsBlessed.element = blessed[value.widget].call(this, widgetoptions);\n widget.set('id', uuidv4());\n box.append(widget);\n box.set(value.widget, widget); // Set the user data for this widget. This allows the handlebars template access via the name from the box object.\n }\n }\n\n // The entire panel is accessible using the _panel property.\n // This is so that the model is accessible from within the handlebars templates.\n // Access to a named widget can be done using box._panel.widgets[name] or box._panel.widgets.name\n box.set('panel', panel);\n\n this.uiBoxes[panel.id].box = box;\n\n touched[panel.id] = true;\n } else {\n //@@ need to hide previous positions\n //@@ and show ones that are visible\n this.#UpdatePanelPosition(panel, row, col, this.uiBoxes[panel.id]);\n\n touched[panel.id] = true;\n //this.#uiBox[panel.id].box.show();\n }\n\n // Render the uiBox with the renderPanelFn using the panel as the utility including the model\n if (this.#renderPanelFn) {\n this.#renderPanelFn(this.uiBoxes[panel.id].box, panel);\n }\n }\n }\n\n for (const [key, ] of Object.entries(this.uiBoxes)) {\n if (typeof touched[key] === 'undefined') {\n this.uiBoxes[key].box.hide();\n this.uiBoxes[key].boxHeader.hide();\n } else {\n this.uiBoxes[key].box.show();\n this.uiBoxes[key].boxHeader.show();\n }\n }\n\n }\n\n get gridData(): gridData {\n return this.uidata;\n }\n\n set gridData(gridData: gridData) {\n this.uidata = gridData;\n this.#SetupPanels();\n this.UpdateCursorInfo();\n this.Render();\n }\n\n get gridDataPanels(): panels {\n return this.uidata.panels;\n }\n\n set gridDataPanels(gridDataPanels: panels) {\n this.uidata.panels = gridDataPanels;\n this.#SetupPanels();\n this.UpdateCursorInfo();\n this.Render();\n }\n\n /*\n ExitEx() {\n //@@ override in sub-class\n }\n\n EscapeEx() {\n //@@ override in sub-class\n }\n */\n\n // https://www.npmjs.com/package/blessed\n\n // data:= { title: <str>,\n // grid: { rows: <int>, cols: <int> }, \n // menu: [ { top: <bool>, menuitems: [ { text: <string>, key: <string>, cb: <func> } ] } ]\n // panels: [ { id: <str>, pos: { row: <int>, col: <int>, rowSpan: <int>, colSpan: <int> }, template: <str> } ] }\n /**\n * \n * @param {*} data UI Data\n */\n SetupUI = (): void => {\n this.DestroyUI();\n\n if (this.screen === null) {\n // Create a screen object.\n this.screen = blessed.screen({\n smartCSR: true\n });\n }\n\n if (!this.screen) {\n return;\n }\n\n const data = this.uidata;\n this.screen.title = data.title;\n this.screen.on('resize', () => {\n this.#ReSize();\n this.Render();\n });\n\n if (data.menu !== null) {\n for (let i = 0; i < data.menu.length; i++) {\n new MenuBar.MenuBar(this.screen, data.menu[i]);\n }\n }\n\n // Allow the serrvice to terminate by pressing Control-C.\n this.screen.key(['C-c'], (): void => {\n this.DestroyUI();\n this.emit('exit');\n //this.ExitEx();\n // Cleanly shutdown the main process. Exit code success (> 0 is exit in error state)\n //setTimeout(() => process.kill(process.pid), 0);\n });\n\n this.screen.key(['escape'], (): void => {\n this.emit('escape');\n //this.EscapeEx();\n // Cleanly shutdown the main process. Exit code success (> 0 is exit in error state)\n //setTimeout(() => process.kill(process.pid), 0);\n });\n\n this.#SetupPanels();\n\n this.#cursorInfo = blessed.box({\n parent: this.screen,\n bottom: 0,\n right: 0,\n width: 'shrink',\n height: 1,\n style:\n {\n bg: 'gray'\n , fg: 'white'\n },\n keys: false, // Do not allow default key handling for this box\n mouse: false,\n content: '',\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n this.sortInfo = blessed.box({\n parent: this.screen,\n top: 0,\n right: 0,\n width: 'shrink',\n height: 1,\n style:\n {\n bg: 'gray'\n , fg: 'white'\n },\n keys: false, // Do not allow default key handling for this box\n mouse: false,\n content: '',\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n\n this.screenHeader = blessed.box({\n parent: this.screen,\n top: 0,\n left: 'center',\n width: 'shrink',\n height: 1,\n style:\n {\n bg: 'gray'\n , fg: 'white'\n },\n keys: false, // Do not allow default key handling for this box\n mouse: false,\n content: `[ ... ]`,\n tags: true // Allow style in-line tags such as bolt, italics, etc.\n });\n\n this.UpdateCursorInfo();\n this.UpdateSortInfo('Default');\n this.UpdateScreenHeader(this.screenHeaderText);\n\n // Render the screen.\n this.Render();\n }\n\n UpdateCursorInfo = (): void => {\n if (this.#cursorInfo) {\n this.#cursorInfo.setContent(`Cursor: ${this.#cursor} / ${this.TotalPanelNumber}`);\n }\n }\n\n UpdateSortInfo = (sortMode: string): void => {\n if (this.sortInfo) {\n this.sortInfo.setContent(`Sort: ${sortMode}`);\n }\n }\n\n UpdateScreenHeader = (screenHeaderText: string): void => {\n this.screenHeaderText = screenHeaderText;\n if (this.screenHeader) {\n this.screenHeader.setContent(`[ ${screenHeaderText} ]`);\n }\n }\n\n get rows(): number {\n return this.uidata.grid.rows;\n }\n\n get cols(): number {\n return this.uidata.grid.cols;\n }\n\n IncRows = (): void => {\n if (this.screen && (this.screen.height / (this.uidata.grid.rows+1) > this.minHeight)) {\n this.uidata.grid.rows++;\n this.CheckCursor();\n this.#UpdateUI();\n }\n }\n\n DecRows = (): void => {\n if (this.uidata.grid.rows > this.minRows) {\n this.uidata.grid.rows--;\n this.CheckCursor();\n this.#UpdateUI();\n }\n }\n\n IncCols = (): void => {\n if (this.screen && (this.screen.width / (this.uidata.grid.cols+1) > this.minWidth)) {\n this.uidata.grid.cols++;\n this.CheckCursor();\n this.#UpdateUI();\n }\n }\n\n DecCols = (): void => {\n if (this.uidata.grid.cols > this.minCols) {\n this.uidata.grid.cols--;\n this.CheckCursor();\n this.#UpdateUI();\n }\n }\n\n get ScreenCells(): number {\n return this.uidata.grid.cols * this.uidata.grid.rows;\n }\n\n get TotalPanelNumber(): number {\n return Object.keys(this.uidata.panels).length;\n }\n\n CheckCursor = (): void => {\n if (this.#cursor > (this.TotalPanelNumber - this.ScreenCells)) {\n this.#cursor = this.TotalPanelNumber - this.ScreenCells;\n if (this.#cursor < 0) {\n this.#cursor = 0;\n }\n }\n this.UpdateCursorInfo();\n }\n\n NextPage = (): void => {\n const endpos = this.TotalPanelNumber - this.ScreenCells;\n if (this.#cursor < endpos) {\n this.#cursor += this.ScreenCells;\n if (this.#cursor > endpos) {\n this.#cursor = endpos;\n }\n this.#UpdateUI();\n }\n }\n\n PrevPage = (): void => {\n if (this.#cursor > 0) {\n this.#cursor -= this.ScreenCells;\n if (this.#cursor < 0) {\n this.#cursor = 0;\n }\n this.#UpdateUI();\n }\n }\n\n #UpdateUI(): void {\n this.SetupUI();\n\n //@@ fix screen render - should not need to blow entire screen away ...\n //this.#SetupPanels();\n //this.UpdateCursorInfo();\n //this.Render();\n }\n\n Exit = (): void => {\n this.DestroyUI();\n this.emit('exit');\n //this.ExitEx();\n }\n\n /**\n * \n */\n DestroyUI = (): void => {\n // Destroy the screen and disable UI log processing\n if (this.screen !== null) {\n this.uiBoxes = { };\n this.screen.destroy();\n this.screen = null;\n }\n }\n\n /**\n * Render the screen.\n */\n Render = (): void => {\n if (this.screen) {\n this.screen.render();\n }\n }\n}\n"],"names":["MenuBar.MenuBar","uuidv4"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nsshunt/stsui",
|
|
3
|
-
"version": "1.10.
|
|
3
|
+
"version": "1.10.80",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./dist/index.umd.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -40,14 +40,14 @@
|
|
|
40
40
|
"homepage": "https://github.com/nsshunt/stsui#readme",
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@tsconfig/node20": "^20.1.4",
|
|
43
|
-
"@types/node": "^20.
|
|
43
|
+
"@types/node": "^20.14.4",
|
|
44
44
|
"@types/uuid": "^9.0.8",
|
|
45
|
-
"@typescript-eslint/eslint-plugin": "^7.
|
|
46
|
-
"@typescript-eslint/parser": "^7.
|
|
45
|
+
"@typescript-eslint/eslint-plugin": "^7.13.1",
|
|
46
|
+
"@typescript-eslint/parser": "^7.13.1",
|
|
47
47
|
"eslint": "^8.57.0",
|
|
48
48
|
"rollup-plugin-visualizer": "^5.12.0",
|
|
49
49
|
"typescript": "^5.4.5",
|
|
50
|
-
"vite": "^5.
|
|
50
|
+
"vite": "^5.3.1",
|
|
51
51
|
"vitest": "^1.6.0"
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|