@datagrok/helm 2.1.3 → 2.1.5

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/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@datagrok/helm",
3
3
  "friendlyName": "Helm",
4
- "version": "2.1.3",
4
+ "version": "2.1.5",
5
5
  "author": {
6
6
  "name": "Oleksandra Serhiienko",
7
7
  "email": "oserhiienko@datagrok.ai"
8
8
  },
9
9
  "description": "",
10
10
  "dependencies": {
11
- "@datagrok-libraries/bio": "^5.21.0",
11
+ "@datagrok-libraries/bio": "^5.22.0",
12
12
  "@datagrok-libraries/utils": "^1.19.1",
13
13
  "cash-dom": "^8.1.1",
14
- "datagrok-api": "^1.11.1",
14
+ "datagrok-api": "^1.10.2",
15
15
  "dayjs": "^1.10.6",
16
16
  "rxjs": "^6.5.5"
17
17
  },
@@ -4,6 +4,7 @@ import * as DG from 'datagrok-api/dg';
4
4
 
5
5
  import {findMonomers, parseHelm, getParts} from './utils';
6
6
  import {printLeftOrCentered} from '@datagrok-libraries/bio/src/utils/cell-renderer';
7
+ import {errorToConsole} from '@datagrok-libraries/utils/src/to-console';
7
8
 
8
9
 
9
10
  export class HelmCellRenderer extends DG.GridCellRenderer {
@@ -16,46 +17,51 @@ export class HelmCellRenderer extends DG.GridCellRenderer {
16
17
  get defaultHeight(): number | null { return 100; }
17
18
 
18
19
  onMouseMove(gridCell: DG.GridCell, e: MouseEvent): void {
19
- const maxLengthWordsSum = gridCell.cell.column.temp['helm-sum-maxLengthWords'];
20
- const maxIndex = Object.values(gridCell.cell.column.temp['helm-maxLengthWords']).length - 1;
21
- const argsX = e.offsetX - gridCell.gridColumn.left + (gridCell.gridColumn.left - gridCell.bounds.x);
22
- let left = 0;
23
- let right = maxIndex;
24
- let found = false;
25
- maxLengthWordsSum[maxIndex + 1] = argsX + 1;
26
- let mid = 0;
27
- if (argsX > maxLengthWordsSum[0]) {
28
- while (!found) {
29
- mid = Math.floor((right + left) / 2);
30
- if (argsX >= maxLengthWordsSum[mid] && argsX <= maxLengthWordsSum[mid + 1]) {
31
- left = mid;
32
- found = true;
33
- } else if (argsX < maxLengthWordsSum[mid]) {
34
- right = mid - 1;
35
- } else if (argsX > maxLengthWordsSum[mid + 1]) {
36
- left = mid + 1;
37
- }
38
- if (left == right) {
39
- found = true;
20
+ try {
21
+ const maxLengthWordsSum = gridCell.cell.column.temp['helm-sum-maxLengthWords'];
22
+ const maxIndex = Object.values(gridCell.cell.column.temp['helm-maxLengthWords']).length - 1;
23
+ const argsX = e.offsetX - gridCell.gridColumn.left + (gridCell.gridColumn.left - gridCell.bounds.x);
24
+ let left = 0;
25
+ let right = maxIndex;
26
+ let found = false;
27
+ maxLengthWordsSum[maxIndex + 1] = argsX + 1;
28
+ let mid = 0;
29
+ if (argsX > maxLengthWordsSum[0]) {
30
+ while (!found) {
31
+ mid = Math.floor((right + left) / 2);
32
+ if (argsX >= maxLengthWordsSum[mid] && argsX <= maxLengthWordsSum[mid + 1]) {
33
+ left = mid;
34
+ found = true;
35
+ } else if (argsX < maxLengthWordsSum[mid]) {
36
+ right = mid - 1;
37
+ } else if (argsX > maxLengthWordsSum[mid + 1]) {
38
+ left = mid + 1;
39
+ }
40
+ if (left == right) {
41
+ found = true;
42
+ }
40
43
  }
41
44
  }
45
+ left = (argsX >= maxLengthWordsSum[left]) ? left + 1 : left;
46
+ const monomers = findMonomers(gridCell.cell.value);
47
+ let s: string = gridCell.cell.value ?? '';
48
+ let subParts: string[] = parseHelm(s);
49
+ let allParts: string[] = getParts(subParts, s);
50
+ let tooltipMessage: HTMLElement[] = [];
51
+ for (let i = 0; i < allParts.length; ++i) {
52
+ if (monomers.has(allParts[i]))
53
+ tooltipMessage[i] = ui.divV([
54
+ ui.divText(`Monomer ${allParts[i]} not found.`),
55
+ ui.divText('Open the Context Panel, then expand Manage Libraries')
56
+ ]);
57
+ }
58
+ (((tooltipMessage[left]?.childNodes.length ?? 0) > 0))
59
+ ? ui.tooltip.show(ui.div(tooltipMessage[left]), e.x + 16, e.y + 16)
60
+ : ui.tooltip.hide();
61
+ } catch (err: any) {
62
+ const errMsg: string = errorToConsole(err);
63
+ console.error('Helm: HelmCellRenderer.onMouseMove() error:\n' + errMsg);
42
64
  }
43
- left = (argsX >= maxLengthWordsSum[left]) ? left + 1 : left;
44
- const monomers = findMonomers(gridCell.cell.value);
45
- let s: string = gridCell.cell.value ?? '';
46
- let subParts: string[] = parseHelm(s);
47
- let allParts: string[] = getParts(subParts, s);
48
- let tooltipMessage: HTMLElement[] = [];
49
- for (let i = 0; i < allParts.length; ++i) {
50
- if (monomers.has(allParts[i]))
51
- tooltipMessage[i] = ui.divV([
52
- ui.divText(`Monomer ${allParts[i]} not found.`),
53
- ui.divText('Open the Context Panel, then expand Manage Libraries')
54
- ]);
55
- }
56
- (((tooltipMessage[left]?.childNodes.length ?? 0) > 0))
57
- ? ui.tooltip.show(ui.div(tooltipMessage[left]), e.x + 16, e.y + 16)
58
- : ui.tooltip.hide();
59
65
  }
60
66
 
61
67
  render(g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number,
package/src/package.ts CHANGED
@@ -8,7 +8,8 @@ import {HelmWebEditor} from './helm-web-editor';
8
8
  import {HelmCellRenderer} from './cell-renderer';
9
9
  import {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types';
10
10
  import {NotationConverter} from '@datagrok-libraries/bio/src/utils/notation-converter';
11
- import { findMonomers } from './utils';
11
+ import {findMonomers} from './utils';
12
+ import {errorToConsole} from '@datagrok-libraries/utils/src/to-console';
12
13
 
13
14
  export const _package = new DG.Package();
14
15
  let monomerLib: IMonomerLib | null = null;
@@ -20,18 +21,32 @@ export async function initHelm(): Promise<void> {
20
21
  dojo.ready(function() { resolve(null); });
21
22
  }), await grok.functions.call('Bio:getBioLib')]).then(([_, lib]: [void, IMonomerLib]) => {
22
23
  monomerLib = lib;
23
- rewriteLibraries();
24
+ rewriteLibraries(); // initHelm()
24
25
  monomerLib.onChanged.subscribe((_) => {
25
- rewriteLibraries();
26
- })
26
+ try {
27
+ rewriteLibraries(); // initHelm()
28
+
29
+ const monTypeList: string[] = monomerLib.getTypes();
30
+ const msgStr: string = 'Monomer lib updated:<br />' + (
31
+ monTypeList.length == 0 ? 'empty' : monTypeList.map((monType) => {
32
+ return `${monType} ${monomerLib.getMonomerNamesByType(monType).length}`;
33
+ }).join('<br />'));
34
+
35
+ grok.shell.info(msgStr);
36
+ } catch (err: any) {
37
+ const errMsg = errorToConsole(err);
38
+ console.error('Helm: initHelm monomerLib.onChanged() error:\n' + errMsg);
39
+ // throw err; // Prevent disabling event handler
40
+ }
41
+ });
27
42
  });
28
43
  }
29
44
 
30
45
  function rewriteLibraries() {
31
46
  org.helm.webeditor.Monomers.clear();
32
- monomerLib.getTypes().forEach(type => {
47
+ monomerLib.getTypes().forEach((type) => {
33
48
  const mms = monomerLib.getMonomerNamesByType(type);
34
- mms.forEach(symbol => {
49
+ mms.forEach((symbol) => {
35
50
  let isBroken = false;
36
51
  const monomer: Monomer = monomerLib.getMonomer(type, symbol);
37
52
  const webEditorMonomer: WebEditorMonomer = {
@@ -43,29 +58,30 @@ function rewriteLibraries() {
43
58
  type: monomer.polymerType,
44
59
  mt: monomer.monomerType,
45
60
  at: {}
46
- };
61
+ };
47
62
 
48
- if(monomer.rgroups.length > 0) {
63
+ if (monomer.rgroups.length > 0) {
49
64
  webEditorMonomer.rs = monomer.rgroups.length;
50
65
  const at = {};
51
66
  monomer.rgroups.forEach(it => {
52
67
  at[it[RGROUP_LABEL]] = it[RGROUP_CAP_GROUP_NAME];
53
68
  });
54
69
  webEditorMonomer.at = at;
55
- } else if (monomer.data[SMILES] != null){
70
+ } else if (monomer.data[SMILES] != null) {
56
71
  webEditorMonomer.rs = Object.keys(getRS(monomer.data[SMILES].toString())).length;
57
72
  webEditorMonomer.at = getRS(monomer.data[SMILES].toString());
58
- } else
73
+ } else {
59
74
  isBroken = true;
75
+ }
60
76
 
61
- if(!isBroken)
77
+ if (!isBroken)
62
78
  org.helm.webeditor.Monomers.addOneMonomer(webEditorMonomer);
63
79
  });
64
80
  });
65
81
 
66
82
  // Obsolete
67
83
  let grid: DG.Grid = grok.shell.tv.grid;
68
- grid.invalidate();
84
+ if (grid) grid.invalidate();
69
85
  }
70
86
 
71
87
  //name: helmCellRenderer
@@ -78,14 +94,15 @@ export function helmCellRenderer(): HelmCellRenderer {
78
94
  }
79
95
 
80
96
  //tags: cellEditor
81
- //description: Macromolecule
97
+ //description: Macromolecule
82
98
  //input: grid_cell cell
83
99
  export function editMoleculeCell(cell: DG.GridCell): void {
84
100
  const monomers = findMonomers(cell.cell.value);
85
- if (cell.gridColumn.column.tags[DG.TAGS.UNITS] === 'helm' && monomers.size === 0)
86
- webEditor(cell);
87
- else
88
- grok.shell.warning(`Monomers ${Array.from(monomers).join(', ')} are absent!`);
101
+ if (cell.gridColumn.column.tags[DG.TAGS.UNITS] === 'helm')
102
+ if (monomers.size == 0)
103
+ webEditor(cell);
104
+ else
105
+ grok.shell.warning(`Monomers ${Array.from(monomers).join(', ')} are absent!`);
89
106
  }
90
107
 
91
108
  //name: Open Helm Web Editor
@@ -96,7 +113,11 @@ export function openEditor(mol: string): void {
96
113
  let df = grok.shell.tv.grid.dataFrame;
97
114
  let converter = new NotationConverter(df.columns.bySemType('Macromolecule'));
98
115
  const resStr = converter.convertStringToHelm(mol, '/');
99
- webEditor(undefined, resStr);
116
+ const monomers = findMonomers(resStr);
117
+ if (monomers.size == 0)
118
+ webEditor(undefined, resStr);
119
+ else
120
+ grok.shell.warning(`Monomers ${Array.from(monomers).join(', ')} are absent!`);
100
121
  }
101
122
 
102
123
  //name: Properties