@datagrok/helm 2.2.1 → 2.3.0

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.
Files changed (46) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/package-test.js +1 -1
  3. package/dist/package-test.js.map +1 -1
  4. package/dist/package.js +1 -1
  5. package/dist/package.js.map +1 -1
  6. package/package.json +9 -10
  7. package/src/cell-renderer.ts +8 -33
  8. package/src/helm-helper.ts +67 -17
  9. package/src/helm-monomer-placer.ts +7 -9
  10. package/src/helm-web-editor.ts +33 -3
  11. package/src/package-test.ts +8 -3
  12. package/src/package-utils.ts +69 -42
  13. package/src/package.ts +121 -141
  14. package/src/tests/findMonomers-tests.ts +2 -0
  15. package/src/tests/get-all-parts-tests.ts +5 -0
  16. package/src/tests/get-molfiles-tests.ts +3 -1
  17. package/src/tests/get-monomer-tests.ts +88 -19
  18. package/src/tests/helm-service-tests.ts +4 -0
  19. package/src/tests/helm-tests.ts +7 -1
  20. package/src/tests/helm-web-editor-tests.ts +55 -0
  21. package/src/tests/parse-helm-tests.ts +98 -0
  22. package/src/tests/properties-widget-tests.ts +33 -4
  23. package/src/tests/renderers-tests.ts +3 -1
  24. package/src/tests/utils.ts +6 -0
  25. package/src/types/index.ts +5 -0
  26. package/src/utils/get-hovered.ts +3 -4
  27. package/src/utils/{dummy-monomer.ts → get-monomer-dummy.ts} +10 -45
  28. package/src/utils/get-monomer-of-library.ts +90 -0
  29. package/src/utils/get-monomer.ts +23 -21
  30. package/src/utils/helm-grid-cell-renderer.ts +9 -2
  31. package/src/utils/helm-service.ts +6 -5
  32. package/src/utils/index.ts +11 -17
  33. package/src/widgets/properties-widget.ts +29 -9
  34. package/tsconfig.json +1 -1
  35. package/vendor/helm-web-editor.development.js +39640 -0
  36. package/vendor/helm-web-editor.production.js +2 -0
  37. package/vendor/helm-web-editor.production.js.map +1 -0
  38. package/webpack.config.js +14 -11
  39. package/helm/JSDraw/Pistoia.HELM-uncompressed.js +0 -9694
  40. package/helm/JSDraw/Pistoia.HELM.js +0 -27
  41. package/helm/JSDraw/ReadMe.txt +0 -8
  42. package/helm/JSDraw/Scilligence.JSDraw2.Lite-uncompressed.js +0 -31126
  43. package/helm/JSDraw/Scilligence.JSDraw2.Lite.js +0 -12
  44. package/helm/JSDraw/Scilligence.JSDraw2.Resources.js +0 -762
  45. package/helm/JSDraw/dojo.js +0 -250
  46. package/helm/JSDraw/test.html +0 -24
package/src/package.ts CHANGED
@@ -3,90 +3,133 @@ import * as grok from 'datagrok-api/grok';
3
3
  import * as ui from 'datagrok-api/ui';
4
4
  import * as DG from 'datagrok-api/dg';
5
5
 
6
- // import '@datagrok-libraries/bio/src/types/dojo';
7
- // import * as dojo from 'DOJO';
8
- import '@datagrok-libraries/bio/src/types/helm';
9
- import '@datagrok-libraries/bio/src/types/jsdraw2';
10
- import * as scil from 'scil';
11
- import * as org from 'org';
12
- import * as JSDraw2 from 'JSDraw2';
13
-
14
6
  import $ from 'cash-dom';
15
7
 
8
+ import {testEvent} from '@datagrok-libraries/utils/src/test';
16
9
  import {errorToConsole} from '@datagrok-libraries/utils/src/to-console';
10
+ import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
17
11
  import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
18
- import {GapOriginals, SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
19
- import {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types';
12
+ import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
13
+ import {IMonomerLib} from '@datagrok-libraries/bio/src/types';
14
+ import {App, HweWindow} from '@datagrok-libraries/bio/src/helm/types';
20
15
  import {IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
21
16
  import {HelmServiceBase} from '@datagrok-libraries/bio/src/viewers/helm-service';
17
+ import {getMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
22
18
 
23
19
  import {HelmCellRenderer} from './cell-renderer';
24
20
  import {HelmHelper} from './helm-helper';
25
21
  import {getPropertiesWidget} from './widgets/properties-widget';
26
22
  import {HelmGridCellRenderer, HelmGridCellRendererBack} from './utils/helm-grid-cell-renderer';
27
- import {_getHelmService, HelmPackage, initHelmPatchDojo} from './package-utils';
23
+ import {_getHelmService, HelmPackage, initHelmLoadAndPatchDojo} from './package-utils';
24
+ import {RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from './constants';
25
+ import {getRS} from './utils/get-monomer-dummy';
28
26
 
29
- let monomerLib: IMonomerLib | null = null;
27
+ // 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';
30
30
 
31
31
  export const _package = new HelmPackage();
32
32
 
33
+ let monomerLib: IMonomerLib | null = null;
34
+
35
+ /*
36
+ Loading modules:
37
+ Through Helm/package.json/sources section
38
+ dojo from ajax.googleapis.com
39
+ HELMWebEditor
40
+ JSDraw.Lite is embedded into HELMWebEditor bundle (dist/package.js)
41
+ */
42
+
43
+ declare const window: Window & HweWindow;
44
+ declare const scil: ScilModule;
45
+ declare const JSDraw2: JSDraw2HelmModule;
46
+ declare const org: OrgHelmModule;
47
+
33
48
  //tags: init
34
49
  export async function initHelm(): Promise<void> {
35
- const logPrefix: string = 'Helm: initHelm()';
50
+ const logPrefix: string = 'Helm: _package.initHelm()';
36
51
  _package.logger.debug(`${logPrefix}, start`);
37
- org.helm.webeditor.kCaseSensitive = true; // GROK-13880
38
-
39
- await Promise.all([
40
- new Promise((resolve, reject) => {
41
- // @ts-ignore
42
- dojo.ready(function() { resolve(null); });
43
- }).then(() => {
44
- initHelmPatchDojo();
45
- }),
46
- (async () => {
47
- const libHelper = await getMonomerLibHelper();
48
- return libHelper.getBioLib();
49
- })()
50
- ])
51
- .then(([_, lib]: [unknown, IMonomerLib]) => {
52
- _package.logger.debug(`${logPrefix}, then(), lib loaded`);
53
- monomerLib = lib;
54
- rewriteLibraries(); // initHelm()
55
- _package.initHelmPatchPistoia(monomerLib, _package.logger);
56
-
57
- monomerLib.onChanged.subscribe((_) => {
58
- try {
59
- const libSummary = monomerLib!.getSummary();
60
- const isLibEmpty = Object.keys(libSummary).length == 0;
61
- const libSummaryLog = isLibEmpty ? 'empty' : Object.entries(libSummary)
62
- .map(([pt, count]) => `${pt}: ${count}`)
63
- .join(', ');
64
- const logPrefixInt = `${logPrefix} monomerLib.onChanged()`;
65
- _package.logger.debug(`${logPrefixInt}, start, lib: { ${libSummaryLog} }`);
66
-
67
- const libSummaryHtml = isLibEmpty ? 'empty' : Object.entries(libSummary)
68
- .map(([pt, count]) => `${pt} ${count}`)
69
- .join('<br />');
70
- const libMsg: string = `Monomer lib updated:<br /> ${libSummaryHtml}`;
71
- grok.shell.info(libMsg);
72
-
73
- _package.logger.debug(`${logPrefixInt}, org,helm.webeditor.Monomers updating ...`);
74
- rewriteLibraries(); // initHelm()
75
- _package.logger.debug(`${logPrefixInt}, end, org.helm.webeditor.Monomers completed`);
76
- } catch (err: any) {
77
- const errMsg = errorToConsole(err);
78
- console.error('Helm: initHelm monomerLib.onChanged() error:\n' + errMsg);
79
- // throw err; // Prevent disabling event handler
80
- }
81
- });
82
- })
83
- .catch((err: any) => {
84
- const errMsg: string = err instanceof Error ? err.message : !!err ? err.toString() : 'Exception \'undefined\'';
85
- grok.shell.error(`Package \'Helm\' init initHelm() error: ${errMsg}`);
86
- const errRes = new Error(errMsg);
87
- errRes.stack = err.stack;
88
- throw errRes;
52
+
53
+ try {
54
+ const [_, lib]: [void, IMonomerLib] = await Promise.all([
55
+ Promise.all([
56
+ new Promise<void>((resolve, reject) => {
57
+ // @ts-ignore
58
+ // try { dojo.ready(function() { resolve(null); }); } catch (err: any) { reject(err); }
59
+ resolve();
60
+ }),
61
+ (async () => {
62
+ _package.logger.debug(`${logPrefix}, dependence loading …`);
63
+ const t1: number = performance.now();
64
+
65
+ _package.logger.debug(`${logPrefix}, dojox loading and patching …`);
66
+ await initHelmLoadAndPatchDojo();
67
+ _package.logger.debug(`${logPrefix}, dojox loaded and patched`);
68
+
69
+ // through webpack.config.ts/alias
70
+ require('vendor/helm-web-editor');
71
+
72
+ _package.logger.debug(`${logPrefix}, HelmWebEditor awaiting …`);
73
+ await window.helmWebEditor$.initPromise;
74
+ _package.logger.debug(`${logPrefix}, HelmWebEditor loaded`);
75
+ org.helm.webeditor.kCaseSensitive = true; // GROK-13880
76
+
77
+ _package.logger.debug(`${logPrefix}, scil.Utils.alert patch`);
78
+ _package.initHelmPatchScilAlert(); // patch immediately
79
+
80
+ const t2: number = performance.now();
81
+ _package.logger.debug(`${logPrefix}, dependence loaded, ET: ${(t2 - t1)} ms`);
82
+ })()
83
+ ]).then(() => {
84
+
85
+ // settings
86
+ }),
87
+ (async () => {
88
+ const libHelper = await getMonomerLibHelper();
89
+ return libHelper.getBioLib();
90
+ })()
91
+ ]);
92
+
93
+ _package.logger.debug(`${logPrefix}, then(), lib loaded`);
94
+ monomerLib = lib;
95
+ // rewriteLibraries(); // initHelm()
96
+ await _package.initHelmPatchPistoia(monomerLib);
97
+
98
+ monomerLib.onChanged.subscribe((_) => {
99
+ const logPrefixInt = `${logPrefix} monomerLib.onChanged()`;
100
+ try {
101
+ const libSummary = monomerLib!.getSummaryObj();
102
+ const isLibEmpty = Object.keys(libSummary).length == 0;
103
+ const libSummaryLog = isLibEmpty ? 'empty' : Object.entries(libSummary)
104
+ .map(([pt, count]) => `${pt}: ${count}`)
105
+ .join(', ');
106
+ _package.logger.debug(`${logPrefixInt}, start, lib: { ${libSummaryLog} }`);
107
+
108
+ const libSummaryHtml = isLibEmpty ? 'empty' : Object.entries(libSummary)
109
+ .map(([pt, count]) => `${pt} ${count}`)
110
+ .join('<br />');
111
+ const libMsg: string = `Monomer lib updated:<br /> ${libSummaryHtml}`;
112
+ grok.shell.info(libMsg);
113
+
114
+ // _package.logger.debug(`${logPrefixInt}, org,helm.webeditor.Monomers updating ...`);
115
+ // rewriteLibraries(); // initHelm() monomerLib.onChanged()
116
+ // _package.logger.debug(`${logPrefixInt}, end, org.helm.webeditor.Monomers completed`);
117
+ } catch (err: any) {
118
+ const errMsg = errorToConsole(err);
119
+ console.error(`${logPrefixInt} error:\n` + errMsg);
120
+ // throw err; // Prevent disabling event handler
121
+ }
89
122
  });
123
+ } catch (err: any) {
124
+ const [errMsg, errStack] = errInfo(err);
125
+ // const errMsg: string = err instanceof Error ? err.message : !!err ? err.toString() : 'Exception \'undefined\'';
126
+ grok.shell.error(`Package \'Helm\' init error:\n${errMsg}`);
127
+ const errRes = new Error(`${logPrefix} error:\n ${errMsg}\n${errStack}`);
128
+ errRes.stack = errStack;
129
+ throw errRes;
130
+ } finally {
131
+ _package.logger.debug(`${logPrefix}, finally`);
132
+ }
90
133
  _package.logger.debug(`${logPrefix}, end`);
91
134
  }
92
135
 
@@ -94,51 +137,6 @@ export function getMonomerLib(): IMonomerLib | null {
94
137
  return monomerLib;
95
138
  }
96
139
 
97
- /** Fills org.helm.webeditor.Monomers dictionary for WebEditor */
98
- function rewriteLibraries() {
99
- org.helm.webeditor.Monomers.clear();
100
- monomerLib!.getPolymerTypes().forEach((polymerType) => {
101
- const monomerSymbols = monomerLib!.getMonomerSymbolsByType(polymerType);
102
- monomerSymbols.forEach((monomerSymbol) => {
103
- let isBroken = false;
104
- const monomer: Monomer = monomerLib!.getMonomer(polymerType, monomerSymbol)!;
105
- const webEditorMonomer: org.helm.WebEditorMonomer = {
106
- id: monomerSymbol,
107
- m: monomer.molfile,
108
- n: monomer.name,
109
- na: monomer.naturalAnalog,
110
- rs: monomer.rgroups.length,
111
- type: monomer.polymerType,
112
- mt: monomer.monomerType,
113
- at: {}
114
- };
115
-
116
- if (monomer.rgroups.length > 0) {
117
- // @ts-ignore
118
- webEditorMonomer.rs = monomer.rgroups.length;
119
- const at: { [prop: string]: any } = {};
120
- monomer.rgroups.forEach((it) => {
121
- at[it[RGROUP_LABEL]] = it[RGROUP_CAP_GROUP_NAME];
122
- });
123
- webEditorMonomer.at = at;
124
- } else if (monomer[SMILES] != null) {
125
- // @ts-ignore
126
- webEditorMonomer.rs = Object.keys(getRS(monomer[SMILES].toString())).length;
127
- webEditorMonomer.at = getRS(monomer[SMILES].toString());
128
- } else
129
- isBroken = true;
130
-
131
- if (!isBroken) {
132
- org.helm.webeditor.Monomers.addOneMonomer(webEditorMonomer);
133
- }
134
- });
135
- });
136
-
137
- // Obsolete
138
- const grid: DG.Grid = grok.shell.tv?.grid;
139
- if (grid) grid.invalidate();
140
- }
141
-
142
140
  //name: getHelmService
143
141
  //output: object result
144
142
  export function getHelmService(): HelmServiceBase {
@@ -151,6 +149,8 @@ export function getHelmService(): HelmServiceBase {
151
149
  //meta.columnTags: quality=Macromolecule, units=helm
152
150
  //output: grid_cell_renderer result
153
151
  export function helmCellRenderer(): HelmCellRenderer {
152
+ const logPrefix = `Helm: _package.getHelmCellRenderer()`;
153
+ _package.logger.debug(`${logPrefix}, start`);
154
154
  // return new HelmCellRenderer(); // old
155
155
  return new HelmGridCellRenderer(); // new
156
156
  }
@@ -198,34 +198,16 @@ function openWebEditor(cell: DG.Cell, value?: string, units?: string) {
198
198
  const col = cell.column as DG.Column<string>;
199
199
  const sh = SeqHandler.forColumn(col);
200
200
  const rowIdx = cell.rowIndex;
201
- org.helm.webeditor.MolViewer.molscale = 0.8;
202
- const app = new org.helm.webeditor.App(view, {
203
- showabout: false,
204
- mexfontsize: '90%',
205
- mexrnapinontab: true,
206
- topmargin: 20,
207
- mexmonomerstab: true,
208
- sequenceviewonly: false,
209
- mexfavoritefirst: true,
210
- mexfilter: true
211
- });
212
- const sizes = app.calculateSizes();
213
- app.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);
214
- let s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};
215
- scil.apply(app.sequence.style, s);
216
- scil.apply(app.notation.style, s);
217
- s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + app.toolbarheight) + 'px'};
218
- scil.apply(app.properties.parent.style, s);
219
- app.structureview.resize(sizes.rightwidth, sizes.bottomheight + app.toolbarheight);
220
- app.mex.resize(sizes.topheight - 80);
221
- setTimeout(() => {
201
+ let app: App;
202
+ setTimeout(async () => {
203
+ app = await buildWebEditorApp(view);
222
204
  if (!!cell && units === undefined)
223
205
  app.canvas.helm.setSequence(cell.value, 'HELM');
224
206
  else
225
207
  app.canvas.helm.setSequence(value!, 'HELM');
226
- }, 200);
227
- ui.dialog({showHeader: false, showFooter: true})
228
- .add(view)
208
+ }, 20);
209
+ const dlg = ui.dialog({showHeader: false, showFooter: true});
210
+ dlg.add(view)
229
211
  .onOK(() => {
230
212
  const helmValue: string = app.canvas.getHelm(true).replace(/<\/span>/g, '')
231
213
  .replace(/<span style='background:#bbf;'>/g, '');
@@ -238,6 +220,10 @@ function openWebEditor(cell: DG.Cell, value?: string, units?: string) {
238
220
  }
239
221
  }
240
222
  }).show({modal: true, fullScreen: true});
223
+
224
+ // Quick fix for full screen dialog
225
+ const dlgCntDiv = $(dlg.root).find('div').get()[0] as HTMLDivElement;
226
+ dlgCntDiv.className = dlgCntDiv.className.replace('dlg- ui-form', 'dlg-ui-form');
241
227
  }
242
228
 
243
229
  //name: getMolfiles
@@ -267,15 +253,9 @@ export function getMolfiles(col: DG.Column): DG.Column {
267
253
  //name: getHelmHelper
268
254
  //output: object result
269
255
  export async function getHelmHelper(): Promise<IHelmHelper> {
270
- return HelmHelper.getInstance();
256
+ return _package.hh;
271
257
  }
272
258
 
273
- import {testEvent} from '@datagrok-libraries/utils/src/test';
274
- import {CellRendererBackAsyncBase} from '@datagrok-libraries/bio/src/utils/cell-renderer-async-base';
275
- import {RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from './constants';
276
- import {getRS} from './utils/dummy-monomer';
277
- import {getMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
278
-
279
259
  //name: measureCellRenderer
280
260
  export async function measureCellRenderer(): Promise<void> {
281
261
  const grid = grok.shell.tv.grid;
@@ -10,6 +10,7 @@ import {
10
10
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
11
11
 
12
12
  import {findMonomers, parseHelm} from '../utils';
13
+ import {initHelmMainPackage} from './utils';
13
14
 
14
15
 
15
16
  /** Tests with default monomer library */
@@ -19,6 +20,7 @@ category('findMonomers', () => {
19
20
  let userLibSettings: UserLibSettings;
20
21
 
21
22
  before(async () => {
23
+ await initHelmMainPackage();
22
24
  monomerLibHelper = await getMonomerLibHelper();
23
25
  userLibSettings = await getUserLibSettings();
24
26
 
@@ -5,6 +5,7 @@ import * as DG from 'datagrok-api/dg';
5
5
  import {after, before, category, delay, expect, test, expectArray} from '@datagrok-libraries/utils/src/test';
6
6
 
7
7
  import {getAllParts} from '../helm-monomer-placer';
8
+ import {initHelmMainPackage} from './utils';
8
9
 
9
10
  category('getAllParts', () => {
10
11
  /** All parts of Helm string are required for fallback rendering. */
@@ -21,6 +22,10 @@ category('getAllParts', () => {
21
22
  }
22
23
  };
23
24
 
25
+ before(async () => {
26
+ await initHelmMainPackage();
27
+ });
28
+
24
29
  for (const [testName, testData] of Object.entries(tests)) {
25
30
  test(`${testName}`, async () => {
26
31
  await _testAllParts(testData.seq, testData.tgt);
@@ -3,6 +3,7 @@ import * as ui from 'datagrok-api/ui';
3
3
  import * as DG from 'datagrok-api/dg';
4
4
 
5
5
  import {after, before, category, delay, expect, test, expectArray, testEvent} from '@datagrok-libraries/utils/src/test';
6
+ import {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
6
7
  import {
7
8
  getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
8
9
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
@@ -11,7 +12,7 @@ import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/sr
11
12
  import {MolfileHandler} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler';
12
13
  import {MolfileHandlerBase} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler-base';
13
14
 
14
- import {awaitGrid} from './utils';
15
+ import {awaitGrid, initHelmMainPackage} from './utils';
15
16
 
16
17
  import {_package} from '../package-test';
17
18
 
@@ -20,6 +21,7 @@ category('getMolfiles', () => {
20
21
  let userLibSettings: UserLibSettings;
21
22
 
22
23
  before(async () => {
24
+ await initHelmMainPackage();
23
25
  monomerLibHelper = await getMonomerLibHelper();
24
26
  userLibSettings = await getUserLibSettings();
25
27
  await setUserLibSettingsForTests();
@@ -3,17 +3,15 @@ import * as ui from 'datagrok-api/ui';
3
3
  import * as DG from 'datagrok-api/dg';
4
4
 
5
5
  import wu from 'wu';
6
- import * as org from 'org';
7
- import * as JSDraw2 from 'JSDraw2';
8
- import Atom = JSDraw2.Atom;
9
- import JsAtom = JSDraw2.JsAtom;
10
6
 
11
7
  import {
12
- after, before, category, delay, expect, test, expectArray, testEvent, expectFloat
8
+ after, before, category, delay, expect, test, expectArray, testEvent, expectFloat, timeout
13
9
  } from '@datagrok-libraries/utils/src/test';
10
+ import {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
14
11
  import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
15
- import {HelmType, MonomerLibSummaryType} from '@datagrok-libraries/bio/src/types';
16
- import {IHelmHelper, getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
12
+ import {Atom, HelmType, IJsAtom, IWebEditorMonomer, GetMonomerFunc} from '@datagrok-libraries/bio/src/helm/types';
13
+ import {IMonomerLib, Monomer, MonomerLibSummaryType} from '@datagrok-libraries/bio/src/types';
14
+ import {IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
17
15
  import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
18
16
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
19
17
  import {
@@ -21,10 +19,19 @@ import {
21
19
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
22
20
  import {defaultMonomerLibSummary, expectMonomerLib} from '@datagrok-libraries/bio/src/tests/monomer-lib-tests';
23
21
 
24
- import {GetMonomerFunc, getMonomerHandleArgs} from '../utils/get-monomer';
22
+ import {getMonomerHandleArgs} from '../utils/get-monomer';
23
+ import {JSDraw2HelmModule, 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';
28
+ import {initHelmMainPackage} from './utils';
25
29
 
26
30
  import {_package} from '../package-test';
27
31
 
32
+ declare const org: OrgHelmModule;
33
+ declare const JSDraw2: JSDraw2HelmModule;
34
+
28
35
  type TestDataType = { args: { a: any, name?: string }, tgt: any };
29
36
 
30
37
  const tests: { [testName: string]: TestDataType } = {
@@ -64,18 +71,30 @@ const tests: { [testName: string]: TestDataType } = {
64
71
  };
65
72
 
66
73
  category('getMonomer', ()=>{
74
+ let libHelper: IMonomerLibHelper;
75
+ let helmHelper: IHelmHelper;
76
+
67
77
  let monomerLibHelper: IMonomerLibHelper;
68
78
  /** Backup actual user's monomer libraries settings */
69
79
  let userLibSettings: UserLibSettings;
70
80
 
71
81
  before(async ()=>{
72
- monomerLibHelper = await getMonomerLibHelper();
73
- userLibSettings = await getUserLibSettings();
82
+ await initHelmMainPackage();
83
+
84
+ [libHelper, helmHelper] = await Promise.all([getMonomerLibHelper(), getHelmHelper()]);
85
+
86
+ await timeout(async () => { monomerLibHelper = await getMonomerLibHelper(); }, 5000,
87
+ 'get monomerLibHelper');
88
+ await timeout(async () => { userLibSettings = await getUserLibSettings(); }, 5000,
89
+ 'get user lib settings for backup');
74
90
 
75
91
  // Tests 'findMonomers' requires default monomer library loaded
76
- await setUserLibSettingsForTests();
77
- await monomerLibHelper.awaitLoaded();
78
- await monomerLibHelper.loadLibraries(true); // load default libraries for tests
92
+ await timeout(async () => { await setUserLibSettingsForTests(); }, 5000,
93
+ 'set user lib settings for tests');
94
+ await timeout(async ()=> { await monomerLibHelper.awaitLoaded(); }, 5000,
95
+ 'await monomerLib to be loaded');
96
+ await timeout(async () => { await monomerLibHelper.loadLibraries(true); }, 5000,
97
+ 'reload monomerLib with settings for tests'); // load default libraries for tests
79
98
  });
80
99
 
81
100
  after(async ()=>{
@@ -84,13 +103,20 @@ category('getMonomer', ()=>{
84
103
  });
85
104
 
86
105
  test('original', async () =>{
106
+ const monomerLib = libHelper.getBioLib();
107
+ rewriteLibraries(monomerLib);
108
+
109
+ // const overriddenGetMonomer = helmHelper.revertOriginalGetMonomer();
110
+ // try {
87
111
  const helmHelper: IHelmHelper = await getHelmHelper();
88
112
  expect(helmHelper != null, true);
89
113
  // @ts-ignore
90
- const mainPkg: HelmPackage = helm._package;
91
- const getMonomerFunc = mainPkg.getMonomerOriginal;
114
+ const getMonomerFunc = helmHelper.originalGetMonomer!;
92
115
 
93
116
  return _testAll('original', getMonomerFunc);
117
+ // } finally {
118
+ // helmHelper.overrideGetMonomer(overriddenGetMonomer);
119
+ // }
94
120
  }, {isAggregated: true});
95
121
 
96
122
  test('monomerLib', async () =>{
@@ -163,7 +189,6 @@ category('getMonomer', ()=>{
163
189
  /* Tests getMonomer function adding missing monomers. */
164
190
  const helmStr = 'PEPTIDE1{[mis1].R.[mis2].T.C.F}$$$$;';
165
191
 
166
-
167
192
  expectMonomerLib(monomerLibHelper.getBioLib());
168
193
  const editor = new JSDraw2.Editor(ui.div(), {viewonly: true});
169
194
  editor.setHelm(helmStr);
@@ -174,11 +199,11 @@ category('getMonomer', ()=>{
174
199
  });
175
200
  });
176
201
 
177
- function getAtomFromJson(argA: JsAtom<HelmType> | HelmType): Atom<HelmType> | HelmType {
202
+ function getAtomFromJson(argA: IJsAtom<HelmType> | HelmType): Atom<HelmType> | HelmType {
178
203
  let res: Atom<HelmType> | HelmType;
179
- const a = argA as JsAtom<HelmType>;
204
+ const a = argA as IJsAtom<HelmType>;
180
205
  if (a.T === 'ATOM')
181
- res = new JSDraw2.Atom<HelmType>(a.p, a.elem, a.bio);
206
+ res = new JSDraw2.Atom(a.p, a.elem, a.bio);
182
207
  else
183
208
  res = argA as HelmType;
184
209
  return res;
@@ -208,3 +233,47 @@ export function expectObjectWithNull(actual: { [key: string]: any }, expected: {
208
233
  }
209
234
  }
210
235
  }
236
+
237
+ /** Fills org.helm.webeditor.Monomers dictionary for WebEditor */
238
+ function rewriteLibraries(monomerLib: IMonomerLib): void {
239
+ org.helm.webeditor.Monomers.clear();
240
+ monomerLib!.getPolymerTypes().forEach((polymerType) => {
241
+ const monomerSymbols = monomerLib!.getMonomerSymbolsByType(polymerType);
242
+ monomerSymbols.forEach((monomerSymbol) => {
243
+ let isBroken = false;
244
+ const monomer: Monomer = monomerLib!.getMonomer(polymerType, monomerSymbol)!;
245
+ const webEditorMonomer: IWebEditorMonomer = {
246
+ id: monomerSymbol,
247
+ m: monomer.molfile,
248
+ n: monomer.name,
249
+ na: monomer.naturalAnalog,
250
+ rs: monomer.rgroups.length,
251
+ type: monomer.polymerType,
252
+ mt: monomer.monomerType,
253
+ at: {},
254
+ };
255
+
256
+ if (monomer.rgroups.length > 0) {
257
+ // @ts-ignore
258
+ webEditorMonomer.rs = monomer.rgroups.length;
259
+ const at: { [prop: string]: any } = {};
260
+ monomer.rgroups.forEach((it) => {
261
+ at[it[RGROUP_LABEL]] = it[RGROUP_CAP_GROUP_NAME];
262
+ });
263
+ webEditorMonomer.at = at;
264
+ } else if (monomer[SMILES] != null) {
265
+ // @ts-ignore
266
+ webEditorMonomer.rs = Object.keys(getRS(monomer[SMILES].toString())).length;
267
+ webEditorMonomer.at = getRS(monomer[SMILES].toString());
268
+ } else
269
+ isBroken = true;
270
+
271
+ if (!isBroken)
272
+ org.helm.webeditor.Monomers.addOneMonomer(webEditorMonomer);
273
+ });
274
+ });
275
+
276
+ // Obsolete
277
+ const grid: DG.Grid = grok.shell.tv?.grid;
278
+ if (grid) grid.invalidate();
279
+ }
@@ -7,6 +7,7 @@ import {Subject} from 'rxjs';
7
7
  import {
8
8
  category, expect, test, awaitCheck, delay, testEvent, before, after
9
9
  } from '@datagrok-libraries/utils/src/test';
10
+ import {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
10
11
  import {
11
12
  getHelmService, HelmServiceBase, HelmAux, HelmProps
12
13
  } from '@datagrok-libraries/bio/src/viewers/helm-service';
@@ -18,6 +19,8 @@ import {
18
19
  getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
19
20
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
20
21
 
22
+ import {initHelmMainPackage} from './utils';
23
+
21
24
  import {_package} from '../package-test';
22
25
 
23
26
  category('HelmService', () => {
@@ -30,6 +33,7 @@ category('HelmService', () => {
30
33
  before(async () => {
31
34
  const logPrefix = `Helm: tests: HelmService: before`;
32
35
  _package.logger.debug(`${logPrefix}, start`);
36
+ await initHelmMainPackage();
33
37
  try {
34
38
  monomerLibHelper = await getMonomerLibHelper();
35
39
  userLibSettings = await getUserLibSettings();
@@ -3,8 +3,10 @@ import * as ui from 'datagrok-api/ui';
3
3
  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';
7
8
  import {parseHelm} from '../utils';
9
+ import {initHelmMainPackage} from './utils';
8
10
 
9
11
  import {_package} from '../package-test';
10
12
 
@@ -51,7 +53,7 @@ category('Helm', () => {
51
53
  // });
52
54
 
53
55
  const complexMonomers = [
54
- // tests parsing of complex monomemer in square brackets like [L-hArg(Et,Et)]
56
+ // tests parsing of complex monomer in square brackets like [L-hArg(Et,Et)]
55
57
  'PEPTIDE1{[L-hArg(Et,Et)].E.F.G}|PEPTIDE2{C.E}$PEPTIDE1,PEPTIDE2,2:R3-1:R1$$$V2.0',
56
58
  // tests parsing of complex monomer and one as a side chain as well
57
59
  'PEPTIDE1{[L-hArg(Et,Et)]([L-hArg(Et,Et)]).E.F.G}$$$$',
@@ -76,6 +78,10 @@ category('Helm', () => {
76
78
  'complex-side-chain', 'complex+side-chain+linker'
77
79
  ];
78
80
 
81
+ before(async () => {
82
+ await initHelmMainPackage();
83
+ });
84
+
79
85
  test('parseHelm', async () => {
80
86
  const expectedResults = [
81
87
  ['meI', 'hHis', 'Aca', 'N', 'T', 'dK', 'Thr_PO3H2', 'D-Tyr_Et', 'Aze', 'dV', 'E', 'Phe_4Me'],