@datagrok/helm 2.3.4 → 2.4.1

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/src/package.ts CHANGED
@@ -4,6 +4,7 @@ import * as ui from 'datagrok-api/ui';
4
4
  import * as DG from 'datagrok-api/dg';
5
5
 
6
6
  import $ from 'cash-dom';
7
+ import {Unsubscribable} from 'rxjs';
7
8
 
8
9
  import {testEvent} from '@datagrok-libraries/utils/src/test';
9
10
  import {errorToConsole} from '@datagrok-libraries/utils/src/to-console';
@@ -11,8 +12,8 @@ import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
11
12
  import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
12
13
  import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
13
14
  import {IMonomerLib} from '@datagrok-libraries/bio/src/types';
14
- import {App, HelmMol, HweWindow} from '@datagrok-libraries/bio/src/helm/types';
15
- import {IHelmHelper, IInputInitOptions} from '@datagrok-libraries/bio/src/helm/helm-helper';
15
+ import {App, Editor, HelmMol, HelmType, HweWindow} from '@datagrok-libraries/bio/src/helm/types';
16
+ import {HelmInputBase, IHelmHelper, IHelmInputInitOptions} from '@datagrok-libraries/bio/src/helm/helm-helper';
16
17
  import {HelmServiceBase} from '@datagrok-libraries/bio/src/viewers/helm-service';
17
18
  import {getMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
18
19
 
@@ -25,12 +26,9 @@ import {RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from './constants';
25
26
  import {getRS} from './utils/get-monomer-dummy';
26
27
 
27
28
  // Do not import anything than types from @datagrok/helm-web-editor/src/types
28
- import {buildWebEditorApp} from './helm-web-editor';
29
- import {JSDraw2HelmModule, OrgHelmModule, ScilModule} from './types';
29
+ import type {JSDraw2Module, OrgHelmModule, ScilModule} from './types';
30
30
 
31
- export const _package = new HelmPackage(/*{debug: true}/**/);
32
-
33
- let monomerLib: IMonomerLib | null = null;
31
+ export const _package = new HelmPackage({debug: true});
34
32
 
35
33
  /*
36
34
  Loading modules:
@@ -42,7 +40,7 @@ let monomerLib: IMonomerLib | null = null;
42
40
 
43
41
  declare const window: Window & HweWindow;
44
42
  declare const scil: ScilModule;
45
- declare const JSDraw2: JSDraw2HelmModule;
43
+ declare const JSDraw2: JSDraw2Module;
46
44
  declare const org: OrgHelmModule;
47
45
 
48
46
  //tags: init
@@ -51,14 +49,13 @@ export async function initHelm(): Promise<void> {
51
49
  _package.logger.debug(`${logPrefix}, start`);
52
50
 
53
51
  try {
54
- await Promise.all([
52
+ const [_, libHelper] = await Promise.all([
55
53
  _package.initHELMWebEditor(),
56
- _package.initMonomerLibHelper(),
57
- ]).then(() => {
58
- _package.initMonomerLib();
59
- });
54
+ getMonomerLibHelper(),
55
+ ]);
60
56
 
61
- _package.logger.debug(`${logPrefix}, then(), lib loaded`);
57
+ _package.logger.debug(`${logPrefix}, lib loaded`);
58
+ _package.initMonomerLib(libHelper);
62
59
  } catch (err: any) {
63
60
  const [errMsg, errStack] = errInfo(err);
64
61
  // const errMsg: string = err instanceof Error ? err.message : !!err ? err.toString() : 'Exception \'undefined\'';
@@ -133,14 +130,7 @@ function openWebEditor(cell: DG.Cell, value?: string, units?: string) {
133
130
  const col = cell.column as DG.Column<string>;
134
131
  const sh = SeqHandler.forColumn(col);
135
132
  const rowIdx = cell.rowIndex;
136
- let app: App;
137
- setTimeout(async () => {
138
- app = await buildWebEditorApp(view);
139
- if (!!cell && units === undefined)
140
- app.canvas!.helm!.setSequence(cell.value, 'HELM');
141
- else
142
- app.canvas!.helm!.setSequence(value!, 'HELM');
143
- }, 20);
133
+ const app: App = _package.helmHelper.createWebEditorApp(view, !!cell && units === undefined ? cell.value : value!);
144
134
  const dlg = ui.dialog({showHeader: false, showFooter: true});
145
135
  dlg.add(view)
146
136
  .onOK(() => {
@@ -192,7 +182,7 @@ export function getMolfiles(col: DG.Column): DG.Column {
192
182
  //input: string name =undefined {optional: true}
193
183
  //input: object options =undefined {optional: true}
194
184
  //output: object result
195
- export function helmInput(name: string, options: IInputInitOptions<HelmMol>): DG.InputBase<HelmMol> {
185
+ export function helmInput(name: string, options: IHelmInputInitOptions): HelmInputBase {
196
186
  // TODO: Annotate for semType = 'Macromolecule' AND units = 'helm'
197
187
  return _package.helmHelper.createHelmInput(name, options);
198
188
  }
@@ -26,12 +26,12 @@ category('findMonomers', () => {
26
26
 
27
27
  // Tests 'findMonomers' requires default monomer library loaded
28
28
  await setUserLibSettingsForTests();
29
- await monomerLibHelper.loadLibraries(true); // load default libraries for tests
29
+ await monomerLibHelper.loadMonomerLib(true); // load default libraries for tests
30
30
  });
31
31
 
32
32
  after(async () => {
33
33
  await setUserLibSettings(userLibSettings);
34
- await monomerLibHelper.loadLibraries(true);
34
+ await monomerLibHelper.loadMonomerLib(true);
35
35
  });
36
36
 
37
37
  const tests: { [testName: string]: { test: string, tgt: Set<string> } } = {
@@ -53,7 +53,7 @@ category('findMonomers', () => {
53
53
  }
54
54
 
55
55
  function _testFindMonomers(testHelmValue: string, tgtMissedSet: Set<string>): void {
56
- const monomerLib = monomerLibHelper.getBioLib();
56
+ const monomerLib = monomerLibHelper.getMonomerLib();
57
57
  const monomerSymbolList: string[] = parseHelm(testHelmValue);
58
58
  const resMissedSet: Set<string> = findMonomers(monomerSymbolList, monomerLib);
59
59
  expectObject(resMissedSet, tgtMissedSet);
@@ -25,12 +25,12 @@ category('getMolfiles', () => {
25
25
  monomerLibHelper = await getMonomerLibHelper();
26
26
  userLibSettings = await getUserLibSettings();
27
27
  await setUserLibSettingsForTests();
28
- await monomerLibHelper.loadLibraries(true);
28
+ await monomerLibHelper.loadMonomerLib(true);
29
29
  });
30
30
 
31
31
  after(async () => {
32
32
  await setUserLibSettings(userLibSettings);
33
- await monomerLibHelper.loadLibraries(true);
33
+ await monomerLibHelper.loadMonomerLib(true);
34
34
  });
35
35
 
36
36
  const csv = `Helm, atoms, bonds
@@ -20,13 +20,17 @@ import {
20
20
  import {defaultMonomerLibSummary, expectMonomerLib} from '@datagrok-libraries/bio/src/tests/monomer-lib-tests';
21
21
 
22
22
  import {getMonomerHandleArgs, rewriteLibraries} from '../utils/get-monomer';
23
- import {JSDraw2HelmModule, OrgHelmModule} from '../types';
23
+ import {JSDraw2Module, OrgHelmModule} from '../types';
24
+
25
+ import {HelmHelper} from '../helm-helper';
26
+ import {RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from '../constants';
27
+ import {getRS} from '../utils/get-monomer-dummy';
24
28
  import {initHelmMainPackage} from './utils';
25
29
 
26
30
  import {_package} from '../package-test';
27
31
 
28
32
  declare const org: OrgHelmModule;
29
- declare const JSDraw2: JSDraw2HelmModule;
33
+ declare const JSDraw2: JSDraw2Module;
30
34
 
31
35
  type TestDataType = { args: { a: any, name?: string }, tgt: any };
32
36
 
@@ -89,34 +93,33 @@ category('getMonomer', ()=>{
89
93
  'set user lib settings for tests');
90
94
  await timeout(async ()=> { await monomerLibHelper.awaitLoaded(); }, 5000,
91
95
  'await monomerLib to be loaded');
92
- await timeout(async () => { await monomerLibHelper.loadLibraries(true); }, 5000,
96
+ await timeout(async () => { await monomerLibHelper.loadMonomerLib(true); }, 5000,
93
97
  'reload monomerLib with settings for tests'); // load default libraries for tests
94
98
  });
95
99
 
96
100
  after(async ()=>{
97
101
  await setUserLibSettings(userLibSettings);
98
- await monomerLibHelper.loadLibraries(true);
102
+ await monomerLibHelper.loadMonomerLib(true);
99
103
  });
100
104
 
101
105
  test('original', async () =>{
102
- const monomerLib = libHelper.getBioLib();
106
+ const monomerLib = libHelper.getMonomerLib();
103
107
  rewriteLibraries(monomerLib);
104
108
 
105
- // const overriddenGetMonomer = helmHelper.revertOriginalGetMonomer();
109
+ // const overriddenMonomersFuncs = helmHelper.revertOriginalMonomersFuncs();
106
110
  // try {
107
- const helmHelper: IHelmHelper = await getHelmHelper();
108
- expect(helmHelper != null, true);
109
- // @ts-ignore
110
- const getMonomerFunc = helmHelper.originalGetMonomer!;
111
+ const helmHelper: IHelmHelper = await getHelmHelper();
112
+ expect(helmHelper != null, true);
113
+ const getMonomerFunc: GetMonomerFunc = helmHelper.originalMonomersFuncs!.getMonomer!;
111
114
 
112
- return _testAll('original', getMonomerFunc);
115
+ return _testAll('original', getMonomerFunc);
113
116
  // } finally {
114
- // helmHelper.overrideGetMonomer(overriddenGetMonomer);
117
+ // helmHelper.overrideMonomersFuncs(overriddenMonomersFuncs);
115
118
  // }
116
119
  }, {isAggregated: true});
117
120
 
118
121
  test('monomerLib', async () =>{
119
- const monomerLib = monomerLibHelper.getBioLib();
122
+ const monomerLib = monomerLibHelper.getMonomerLib();
120
123
  expectMonomerLib(monomerLib);
121
124
 
122
125
  const getMonomerFunc = org.helm.webeditor.Monomers.getMonomer;
@@ -148,7 +151,7 @@ category('getMonomer', ()=>{
148
151
  resDf.set('res', resI, '');
149
152
  resDf.set('tgt', resI, '');
150
153
  try {
151
- const monomerLib = monomerLibHelper.getBioLib();
154
+ const monomerLib = monomerLibHelper.getMonomerLib();
152
155
  expectMonomerLib(monomerLib);
153
156
  resDf.set('success', resI, true);
154
157
  } catch (err) {
@@ -185,13 +188,13 @@ category('getMonomer', ()=>{
185
188
  /* Tests getMonomer function adding missing monomers. */
186
189
  const helmStr = 'PEPTIDE1{[mis1].R.[mis2].T.C.F}$$$$;';
187
190
 
188
- expectMonomerLib(monomerLibHelper.getBioLib());
191
+ expectMonomerLib(monomerLibHelper.getMonomerLib());
189
192
  const editor = new JSDraw2.Editor(ui.div(), {viewonly: true});
190
193
  editor.setHelm(helmStr);
191
194
  const withMissing = JSON.parse(JSON.stringify(
192
195
  defaultMonomerLibSummary)) as MonomerLibSummaryType;
193
196
  withMissing['PEPTIDE'] += 2;
194
- expectMonomerLib(monomerLibHelper.getBioLib(), withMissing);
197
+ expectMonomerLib(monomerLibHelper.getMonomerLib(), withMissing);
195
198
  });
196
199
  });
197
200
 
@@ -30,12 +30,12 @@ category('HelmInput', () => {
30
30
  // Test 'helm' requires default monomer library loaded
31
31
  await setUserLibSettingsForTests();
32
32
  await monomerLibHelper.awaitLoaded();
33
- await monomerLibHelper.loadLibraries(true); // load default libraries
33
+ await monomerLibHelper.loadMonomerLib(true); // load default libraries
34
34
  });
35
35
 
36
36
  after(async () => {
37
37
  await setUserLibSettings(userLibSettings);
38
- await monomerLibHelper.loadLibraries(true); // load user settings libraries
38
+ await monomerLibHelper.loadMonomerLib(true); // load user settings libraries
39
39
  });
40
40
 
41
41
  test('inDialog', async () => {
@@ -47,7 +47,7 @@ category('HelmInput', () => {
47
47
  .show();
48
48
  await delay(500);
49
49
 
50
- const mol = helmInput.value;
50
+ const mol = helmInput.molValue;
51
51
  expect(mol.atoms.length, 4);
52
52
  expect(mol.bonds.length, 3);
53
53
  });
@@ -73,7 +73,7 @@ async function _testTooltipOnHelmInput(): Promise<void> {
73
73
  expect(helmInput.getInput(), dialogInputEl);
74
74
 
75
75
  const mon = {i: 0, elem: 'meY'};
76
- const a = helmInput.value.atoms[mon.i];
76
+ const a = helmInput.molValue.atoms[mon.i];
77
77
  const iEl = helmInput.getInput();
78
78
  const iBcr = iEl.getBoundingClientRect();
79
79
  const ev = new MouseEvent('mousemove', {
@@ -41,8 +41,8 @@ category('HelmService', () => {
41
41
  await delay(1000); // for loading monomer libraries files
42
42
  // Test 'helm' requires default monomer library loaded
43
43
  await setUserLibSettingsForTests();
44
- await monomerLibHelper.loadLibraries(true); // load default libraries
45
- const libSummary = monomerLibHelper.getBioLib().getSummary();
44
+ await monomerLibHelper.loadMonomerLib(true); // load default libraries
45
+ const libSummary = monomerLibHelper.getMonomerLib().getSummaryObj();
46
46
 
47
47
  helmSvc = await getHelmService();
48
48
  await helmSvc.reset();
@@ -60,7 +60,7 @@ category('HelmService', () => {
60
60
  await helmSvc.reset();
61
61
 
62
62
  await setUserLibSettings(userLibSettings);
63
- await monomerLibHelper.loadLibraries(true); // load user settings libraries
63
+ await monomerLibHelper.loadMonomerLib(true); // load user settings libraries
64
64
  _package.logger.debug(`${logPrefix}, end`);
65
65
  });
66
66
 
@@ -4,7 +4,6 @@ import * as DG from 'datagrok-api/dg';
4
4
 
5
5
  import {after, before, category, delay, expect, test, expectArray} from '@datagrok-libraries/utils/src/test';
6
6
 
7
- //import {findMonomers, helmToFasta, helmToPeptide, helmToRNA, initHelm} from '../package';
8
7
  import {parseHelm} from '../utils';
9
8
  import {initHelmMainPackage} from './utils';
10
9
 
@@ -74,7 +73,7 @@ category('Helm', () => {
74
73
  ];
75
74
 
76
75
  const complexTestNames = [
77
- 'comples-monomer', 'complex-monomer+side-chain', 'complex-monomer+side-chain-RNA',
76
+ 'complex-monomer', 'complex-monomer+side-chain', 'complex-monomer+side-chain-RNA',
78
77
  'complex-side-chain', 'complex+side-chain+linker'
79
78
  ];
80
79
 
@@ -24,14 +24,14 @@ category('helm-web-editor', async () => {
24
24
  userLibSettings = await getUserLibSettings();
25
25
  await setUserLibSettingsForTests();
26
26
  await monomerLibHelper.awaitLoaded();
27
- await monomerLibHelper.loadLibraries(true);
27
+ await monomerLibHelper.loadMonomerLib(true);
28
28
 
29
29
  hh = await getHelmHelper();
30
30
  });
31
31
 
32
32
  after(async () => {
33
33
  await setUserLibSettings(userLibSettings);
34
- await monomerLibHelper.loadLibraries(true);
34
+ await monomerLibHelper.loadMonomerLib(true);
35
35
  });
36
36
 
37
37
  test('helm-web-editor', async () => {
@@ -11,11 +11,12 @@ import {
11
11
  getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
12
12
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
13
13
 
14
- import {JSDraw2HelmModule} from '../types';
14
+ import {JSDraw2Module} from '../types';
15
15
  import {initHelmMainPackage} from './utils';
16
+ import {IHelmDrawOptions} from '@datagrok-libraries/helm-web-editor/src/types/org-helm';
16
17
 
17
18
  declare const org: OrgType;
18
- declare const JSDraw2: JSDraw2HelmModule;
19
+ declare const JSDraw2: JSDraw2Module;
19
20
 
20
21
  type TestTgtType = { atomCount: number, bondCount: number };
21
22
 
@@ -47,12 +48,12 @@ category('parseHelm', () => {
47
48
  await setUserLibSettingsForTests();
48
49
  await timeout(async () => { await libHelper.awaitLoaded(); }, 5000,
49
50
  'await monomerLib to be loaded');
50
- await libHelper.loadLibraries(true);
51
+ await libHelper.loadMonomerLib(true);
51
52
  });
52
53
 
53
54
  after(async () => {
54
55
  await setUserLibSettings(userLibSettings);
55
- await libHelper.loadLibraries(true);
56
+ await libHelper.loadMonomerLib(true);
56
57
  });
57
58
 
58
59
  for (const [testName, {src, tgt}] of Object.entries(testData)) {
@@ -72,11 +73,11 @@ function _testParseHelmWithEditor(src: string, tgt: TestTgtType): void {
72
73
  const io = org.helm.webeditor.IO;
73
74
 
74
75
  const editorHost = ui.div();
75
- const editor = new JSDraw2.Editor(editorHost, {viewonly: true});
76
+ const editor = new JSDraw2.Editor<HelmType, IHelmDrawOptions>(editorHost, {viewonly: true});
76
77
 
77
78
  const plugin = new org.helm.webeditor.Plugin(editor);
78
79
  const origin = new JSDraw2.Point(0, 0);
79
- io.parseHelm(plugin, src, origin, null);
80
+ io.parseHelm(plugin, src, origin, undefined);
80
81
 
81
82
  const m: Mol<HelmType> = plugin.jsd.m;
82
83
  expect(m.atoms.length, tgt.atomCount);
@@ -86,11 +87,11 @@ function _testParseHelmWithEditor(src: string, tgt: TestTgtType): void {
86
87
  function _testParseHelmWithoutDOM(src: string, tgt: TestTgtType): void {
87
88
  const io = org.helm.webeditor.IO;
88
89
 
89
- const molHandler = new JSDraw2.MolHandler();
90
+ const molHandler = new JSDraw2.MolHandler<HelmType>();
90
91
 
91
92
  const plugin = new org.helm.webeditor.Plugin(molHandler);
92
93
  const origin = new JSDraw2.Point(0, 0);
93
- io.parseHelm(plugin, src, origin, null);
94
+ io.parseHelm(plugin, src, origin, undefined);
94
95
 
95
96
  const m: Mol<HelmType> = plugin.jsd.m;
96
97
  expect(m.atoms.length, tgt.atomCount);
@@ -85,12 +85,12 @@ category('properties-widget', () => {
85
85
  await setUserLibSettingsForTests();
86
86
  await timeout(async () => { await monomerLibHelper.awaitLoaded(); },
87
87
  5000, 'MonomerLibHelper.awaitLoaded() timeout');
88
- await monomerLibHelper.loadLibraries(true); // load default libraries
88
+ await monomerLibHelper.loadMonomerLib(true); // load default libraries
89
89
  });
90
90
 
91
91
  after(async () => {
92
92
  await setUserLibSettings(userLibSettings);
93
- await monomerLibHelper.loadLibraries(true); // load user settings libraries
93
+ await monomerLibHelper.loadMonomerLib(true); // load user settings libraries
94
94
  });
95
95
 
96
96
  for (const [testName, testData] of Object.entries(TestsData)) {
@@ -33,13 +33,13 @@ category('renderers', () => {
33
33
 
34
34
  // Test 'helm' requires default monomer library loaded
35
35
  await setUserLibSettingsForTests();
36
- await monomerLibHelper.loadLibraries(true); // load default libraries
36
+ await monomerLibHelper.loadMonomerLib(true); // load default libraries
37
37
  });
38
38
 
39
39
  after(async () => {
40
40
  // UserDataStorage.put() replaces existing data
41
41
  await setUserLibSettings(userLibSettings);
42
- await monomerLibHelper.loadLibraries(true); // load user settings libraries
42
+ await monomerLibHelper.loadMonomerLib(true); // load user settings libraries
43
43
  });
44
44
 
45
45
 
@@ -1,5 +1,5 @@
1
1
  import {HelmType, JSDraw2ModuleType, OrgType, ScilModuleType} from '@datagrok-libraries/bio/src/helm/types';
2
2
 
3
3
  export type ScilModule = ScilModuleType;
4
- export type JSDraw2HelmModule = JSDraw2ModuleType<HelmType>;
4
+ export type JSDraw2Module = JSDraw2ModuleType;
5
5
  export type OrgHelmModule = OrgType;
@@ -2,17 +2,15 @@ import * as grok from 'datagrok-api/grok';
2
2
  import * as DG from 'datagrok-api/dg';
3
3
  import * as ui from 'datagrok-api/ui';
4
4
 
5
- import {HelmType, PolymerType, Atom, Mol, ISeqMonomer} from '@datagrok-libraries/bio/src/helm/types';
5
+ import {HelmType, PolymerType, Atom, Mol, ISeqMonomer, HelmMol, HelmAtom} from '@datagrok-libraries/bio/src/helm/types';
6
6
 
7
7
  import {helmTypeToPolymerType} from '@datagrok-libraries/bio/src/monomer-works/monomer-works';
8
8
 
9
9
  import {HelmMonomerPlacer} from '../helm-monomer-placer';
10
10
 
11
11
  export function getHoveredMonomerFromEditorMol(
12
- argsX: number, argsY: number, mol: Mol<HelmType>, cellHeight? : number
13
- ): ISeqMonomer | null {
14
- let hoveredSeqMonomer: ISeqMonomer | null = null;
15
-
12
+ argsX: number, argsY: number, mol: HelmMol, cellHeight?: number
13
+ ): HelmAtom | null {
16
14
  /** @return {[number, number]} [atom, distance] */
17
15
  function getNearest(excluded: (number | undefined)[]): [number | undefined, number | undefined] {
18
16
  let atom: number | undefined = undefined;
@@ -34,18 +32,18 @@ export function getHoveredMonomerFromEditorMol(
34
32
  const [firstAtomI, firstDistance] = getNearest([]);
35
33
  const [secondAtomI, secondDistance] = getNearest([firstAtomI]);
36
34
 
35
+ let resAtom: HelmAtom | null = null;
37
36
  if (firstAtomI !== undefined && firstDistance !== undefined) {
38
37
  const firstAtom = mol.atoms[firstAtomI];
39
- const firstSeqMonomer = getSeqMonomerFromHelmAtom(firstAtom);
40
38
  if (secondAtomI !== undefined && secondDistance !== undefined) {
41
39
  if (firstDistance < secondDistance * 0.45)
42
- hoveredSeqMonomer = firstSeqMonomer;
40
+ resAtom = firstAtom;
43
41
  } else {
44
42
  if (cellHeight && firstDistance < 0.35 * cellHeight)
45
- hoveredSeqMonomer = firstSeqMonomer;
43
+ resAtom = firstAtom;
46
44
  }
47
45
  }
48
- return hoveredSeqMonomer;
46
+ return resAtom;
49
47
  }
50
48
 
51
49
  export function getHoveredMonomerFallback(
@@ -83,7 +81,7 @@ export function getHoveredMonomerFallback(
83
81
  return hoveredSeqMonomer;
84
82
  }
85
83
 
86
- function getSeqMonomerFromHelmAtom(atom: Atom<HelmType>): ISeqMonomer {
84
+ export function getSeqMonomerFromHelmAtom(atom: HelmAtom): ISeqMonomer {
87
85
  const polymerType = helmTypeToPolymerType(atom.bio!.type);
88
86
  return {symbol: atom.elem, polymerType: polymerType};
89
87
  }
@@ -11,10 +11,7 @@ import {
11
11
  } from '@datagrok-libraries/bio/src/utils/const';
12
12
  import {HelmTypes} from '@datagrok-libraries/bio/src/helm/consts';
13
13
 
14
-
15
- import {
16
- AmbiguousWebEditorMonomer, GapWebEditorMonomer, getRS, MissingWebEditorMonomer
17
- } from './get-monomer-dummy';
14
+ import {AmbiguousWebEditorMonomer, GapWebEditorMonomer, getRS, MissingWebEditorMonomer} from './get-monomer-dummy';
18
15
  import {LibraryWebEditorMonomer} from './get-monomer-of-library';
19
16
  import {OrgHelmModule, ScilModule} from '../types';
20
17
  import {RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from '../constants';
@@ -59,6 +56,8 @@ export function getMonomerOverrideAndLogAlert(
59
56
  export function getMonomerHandleArgs(
60
57
  a: Atom<HelmType> | HelmType, name?: string
61
58
  ): [/** biotype */ HelmType, /** elem */ string] {
59
+ if (!a)
60
+ throw new Error(`Argument 'a' of type Atom or HelmType is mandatory.`);
62
61
  let biotype: HelmType;
63
62
  let elem: string;
64
63
  if ((a as Atom<HelmType>).T === 'ATOM') {
@@ -9,54 +9,38 @@ import {
9
9
  CellRendererBackAsyncBase, RenderServiceBase
10
10
  } from '@datagrok-libraries/bio/src/utils/cell-renderer-async-base';
11
11
  import {HelmAux, HelmProps} from '@datagrok-libraries/bio/src/viewers/helm-service';
12
+ import {_getHelmService} from '../package-utils';
12
13
  import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
13
14
  import {ILogger} from '@datagrok-libraries/bio/src/utils/logger';
14
15
  import {getGridCellRendererBack} from '@datagrok-libraries/bio/src/utils/cell-renderer-back-base';
15
16
  import {IMonomerLib} from '@datagrok-libraries/bio/src/types/index';
16
17
 
17
- import {getHoveredMonomerFromEditorMol} from './get-hovered';
18
- import {_getHelmService} from '../package-utils';
18
+ import {getHoveredMonomerFromEditorMol, getSeqMonomerFromHelmAtom} from './get-hovered';
19
19
 
20
20
  import {_package} from '../package';
21
21
 
22
- class WrapLogger implements ILogger {
23
- constructor(
24
- private readonly base: ILogger
25
- ) {}
26
-
27
- error(message: any, params?: object | undefined, stackTrace?: string | undefined): void {
28
- this.base.error(message, params, stackTrace);
29
- }
30
-
31
- warning(message: string, params?: object | undefined): void {
32
- this.base.warning(message, params);
33
- }
34
-
35
- info(message: string, params?: object | undefined): void {
36
- // this.base.info(message, params);
37
- }
38
-
39
- debug(message: string, params?: object | undefined): void {
40
- // this.base.debug(message, params);
41
- }
42
- }
43
-
44
22
  export class HelmGridCellRendererBack extends CellRendererBackAsyncBase<HelmProps, HelmAux> {
45
23
  private _auxList: (HelmAux | null)[];
46
24
 
47
25
  private monomerLib: IMonomerLib | null = null;
48
26
 
27
+ // eslint-disable-next-line max-len
28
+ private readonly uuid: string = wu.repeat(1).map(() => Math.floor((Math.random() * 36)).toString(36)).take(4).toArray().join('');
29
+
49
30
  constructor(
50
31
  gridCol: DG.GridColumn | null,
51
32
  tableCol: DG.Column<string>,
52
33
  ) {
53
- super(gridCol, tableCol, new WrapLogger(_package.logger) /* _package.logger */, true);
34
+ super(gridCol, tableCol, _package.logger, true);
54
35
  }
55
36
 
56
37
  protected override reset(): void {
38
+ const logPrefix = `${this.toLog()}.reset()`;
39
+ this.logger.debug(`${logPrefix}, start`);
57
40
  super.reset();
58
41
  this._auxList = new Array<HelmAux | null>(this.tableCol.length).fill(null);
59
42
  if (this.gridCol && this.gridCol.dart) this.gridCol.grid?.invalidate();
43
+ this.logger.debug(`${logPrefix}, end`);
60
44
  }
61
45
 
62
46
  protected override getRenderService(): RenderServiceBase<HelmProps, HelmAux> {
@@ -70,6 +54,8 @@ export class HelmGridCellRendererBack extends CellRendererBackAsyncBase<HelmProp
70
54
  }
71
55
 
72
56
  protected override storeAux(gridCell: DG.GridCell, aux: HelmAux): void {
57
+ const logPrefix = `${this.toLog()}.storeAux()`;
58
+ this.logger.debug(`${logPrefix}, start`);
73
59
  if (gridCell.tableRowIndex !== null)
74
60
  this._auxList[gridCell.tableRowIndex] = aux;
75
61
  }
@@ -141,10 +127,10 @@ export class HelmGridCellRendererBack extends CellRendererBackAsyncBase<HelmProp
141
127
  this.logger.warning(`${logPrefix}, editorMol of the cell not found.`);
142
128
  return; // The gridCell is not rendered yet
143
129
  }
144
- const seqMonomer: ISeqMonomer | null =
145
- getHoveredMonomerFromEditorMol(argsX, argsY, editorMol, gridCell.bounds.height);
130
+ const hoveredAtom = getHoveredMonomerFromEditorMol(argsX, argsY, editorMol, gridCell.bounds.height);
146
131
 
147
- if (seqMonomer) {
132
+ if (hoveredAtom) {
133
+ const seqMonomer = getSeqMonomerFromHelmAtom(hoveredAtom);
148
134
  const monomerLib = _package.monomerLib;
149
135
  const tooltipEl = monomerLib ? monomerLib.getTooltip(seqMonomer.polymerType, seqMonomer.symbol) :
150
136
  ui.divText('Monomer library is not available');
@@ -170,7 +156,8 @@ export class HelmGridCellRendererBack extends CellRendererBackAsyncBase<HelmProp
170
156
  // -- Handle events --
171
157
 
172
158
  private monomerLibOnChanged(_value: any): void {
173
- this.reset();
159
+ this.dirty = true;
160
+ this.invalidateGrid();
174
161
  }
175
162
 
176
163
  static getOrCreate(gridCell: DG.GridCell): HelmGridCellRendererBack {
@@ -5,23 +5,21 @@ import * as DG from 'datagrok-api/dg';
5
5
  import $ from 'cash-dom';
6
6
  import {Subject, Unsubscribable} from 'rxjs';
7
7
 
8
- import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
9
- import {IMonomerLib} from '@datagrok-libraries/bio/src/types/index';
10
- import {Editor, HelmType} from '@datagrok-libraries/bio/src/helm/types';
8
+ import {HelmEditor} from '@datagrok-libraries/bio/src/helm/types';
11
9
  import {RenderTask} from '@datagrok-libraries/bio/src/utils/cell-renderer-async-base';
12
10
  import {HelmAux, HelmProps, HelmServiceBase} from '@datagrok-libraries/bio/src/viewers/helm-service';
13
11
  import {svgToImage} from '@datagrok-libraries/utils/src/svg';
14
12
 
15
- import {JSDraw2HelmModule} from '../types';
13
+ import {JSDraw2Module} from '../types';
16
14
 
17
15
  import {_package} from '../package';
18
16
 
19
- declare const JSDraw2: JSDraw2HelmModule;
17
+ declare const JSDraw2: JSDraw2Module;
20
18
 
21
19
  export class HelmService extends HelmServiceBase {
22
20
  private readonly hostDiv: HTMLDivElement;
23
21
 
24
- private editor!: Editor<HelmType>;
22
+ private editor!: HelmEditor;
25
23
  private image: HTMLImageElement | null = null;
26
24
 
27
25
  constructor() {