@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 CHANGED
@@ -1,32 +1,15 @@
1
1
  var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => {
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 __privateSet = (obj, member, value, setter) => {
21
- __accessCheck(obj, member, "write to private field");
22
- setter ? setter.call(obj, value) : member.set(obj, value);
23
- return value;
24
- };
25
- var __privateMethod = (obj, member, method) => {
26
- __accessCheck(obj, member, "access private method");
27
- return method;
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
- return null;
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, _SetupPanels, SetupPanels_fn).call(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, _UpdateUI, UpdateUI_fn).call(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, _UpdateUI, UpdateUI_fn).call(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, _UpdateUI, UpdateUI_fn).call(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, _UpdateUI, UpdateUI_fn).call(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, _UpdateUI, UpdateUI_fn).call(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, _UpdateUI, UpdateUI_fn).call(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, _SetupPanels, SetupPanels_fn).call(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, _SetupPanels, SetupPanels_fn).call(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
- _SetupPanels = new WeakSet();
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
  };
@@ -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 __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) => {
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, _SetupPanels, SetupPanels_fn, _UpdateUI, UpdateUI_fn;
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
- return null;
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, _SetupPanels, SetupPanels_fn).call(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, _UpdateUI, UpdateUI_fn).call(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, _UpdateUI, UpdateUI_fn).call(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, _UpdateUI, UpdateUI_fn).call(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, _UpdateUI, UpdateUI_fn).call(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, _UpdateUI, UpdateUI_fn).call(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, _UpdateUI, UpdateUI_fn).call(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, _SetupPanels, SetupPanels_fn).call(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, _SetupPanels, SetupPanels_fn).call(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
- _SetupPanels = new WeakSet();
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
  };
@@ -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.78",
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.12.12",
43
+ "@types/node": "^20.14.4",
44
44
  "@types/uuid": "^9.0.8",
45
- "@typescript-eslint/eslint-plugin": "^7.9.0",
46
- "@typescript-eslint/parser": "^7.9.0",
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.2.11",
50
+ "vite": "^5.3.1",
51
51
  "vitest": "^1.6.0"
52
52
  },
53
53
  "dependencies": {