@datagrok/helm 2.3.3 → 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.
@@ -5,6 +5,7 @@ import * as DG from 'datagrok-api/dg';
5
5
  import {Unsubscribable} from 'rxjs';
6
6
 
7
7
  import {delay, timeout} from '@datagrok-libraries/utils/src/test';
8
+ import {errorToConsole} from '@datagrok-libraries/utils/src/to-console';
8
9
  import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
9
10
  import {
10
11
  DojoType, DojoxType, HweWindow, IOrgHelmWebEditor, Monomers
@@ -13,7 +14,6 @@ import {HelmServiceBase} from '@datagrok-libraries/bio/src/viewers/helm-service'
13
14
  import {IMonomerLib} from '@datagrok-libraries/bio/src/types';
14
15
  import {LoggerWrapper} from '@datagrok-libraries/bio/src/utils/logger';
15
16
  import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
16
- import {errorToConsole} from '@datagrok-libraries/utils/src/to-console';
17
17
 
18
18
  import {HelmHelper} from './helm-helper';
19
19
  import {HelmService} from './utils/helm-service';
@@ -30,8 +30,8 @@ declare const org: OrgHelmModule;
30
30
  type DojoConfigWindowType = {
31
31
  dojoConfig: {
32
32
  packages?: (string | { name: string, location: string })[],
33
- deps?: string[], callback: Function, has?: any, parseOnLoad?: boolean, async?: boolean | string
34
- };
33
+ deps?: string[], callback: Function, has?: any, parseOnLoad?: boolean, async?: boolean | string, locale?: string,
34
+ },
35
35
  };
36
36
  type HelmWindowType = {
37
37
  $helmService?: HelmServiceBase,
@@ -51,100 +51,85 @@ export async function initHelmLoadAndPatchDojo(): Promise<void> {
51
51
  /** get the text width in pixels */
52
52
  const pi = DG.TaskBarProgressIndicator.create('Loading Helm Web Editor ...');
53
53
  try {
54
- await delay(2000);
55
54
  const requireBackup = window.require;
56
55
 
57
- await timeout(async () => {
58
-
59
- await new Promise<void>((resolve, reject) => {
60
- window.dojoConfig = {
61
- deps: [
62
- // 'dojo/dom', 'dojo/window', 'dojo/io/script', 'dojo/io/iframe',
63
- // 'dojox/storage/LocalStorageProvider',
64
- // 'dijit/layout/ContentPane',
65
- ],
66
- // packages: [
67
- // 'dojo.ready', 'dojo.window', 'dojo.io.script', 'dojo.io.iframe', 'dojo.dom',
68
- // 'dojox.gfx', 'dojox.gfx.shape',
69
- // ],
70
- callback: () => { resolve(); },
71
- // has: {
72
- // "dojo-firebug": true,
73
- // "dojo-debug-messages": true,
74
- // },
75
- parseOnLoad: true,
76
- async: false
77
- };
78
- // Load dojo without package/sources section for the settings dojoConfig to take effect+
79
- DG.Utils.loadJsCss([
80
- // 'https://ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js.uncompressed.js',
81
- `${_package.webRoot}/vendor/dojo-1.10.10/dojo/dojo.js.uncompressed.js`,
82
- ]).then(() => {});
83
- });
84
-
85
- const dojoRequire = window.require;
86
- const cmp = dojoRequire == requireBackup;
87
- try {
56
+ // dojo.window','dojo.io.script','dojo.io.iframe','dojo.dom','dojox.gfx','dojox.gfx.svg','dojox.gfx.shape','dojox.charting'
57
+ const dojoTargetList: { name: string, checker: () => boolean }[] = [
58
+ {name: 'dojo.window', checker: () => !!dojo?.window},
59
+ {name: 'dojo.ready', checker: () => !!dojo?.ready},
60
+ {name: 'dojo.io.script', checker: () => !!dojo?.io?.script},
61
+ {name: 'dojo.io.iframe', checker: () => !!dojo?.io?.iframe},
62
+ // {name: 'dojo.dom', checker: () => !!dojo?.dom},
63
+ {name: 'dojox.gfx', checker: () => !!dojox?.gfx},
64
+ {name: 'dojox.gfx.svg', checker: () => !!dojox?.gfx?.svg},
65
+ {name: 'dojox.gfx.createSurface', checker: () => !!dojox?.gfx?.createSurface},
66
+ {name: 'dojox.gfx.shape', checker: () => !!dojox?.gfx?.shape},
67
+ {name: 'dojox.storage.Provider', checker: () => !!dojox?.storage?.Provider},
68
+ {name: 'dojox.storage.LocalStorageProvider', checker: () => !!dojox?.storage?.LocalStorageProvider},
69
+ // {name: 'dojox.charting', checker: () => !!dojox.charting},
70
+ // {name: 'dojox.charting.themes.Claro', checker: () => !!dojox.charting?.themes?.Claro},
71
+ // {name: 'dojox.charting.themes.Wetland', checker: () => !!dojox.charting?.themes?.Wetland},
72
+ // {name: 'dojox.charting.plot2d.Base', checker: () => !!dojox.charting?.plot2d?.Base},
73
+ // {name: 'dojox.charting.Series', checker: () => !!dojox?.charting?.Series},
74
+ // {name: 'dojox.charting.Chart2D', checker: () => !!dojox?.charting?.Chart2D},
75
+ ];
76
+ /** Gets list ofd modules not ready yet */
77
+ const getDojoNotReadyList = (): string[] => {
78
+ return dojoTargetList.filter((dt) => !dt.checker()).map((dt) => dt.name);
79
+ };
80
+
81
+ try {
82
+ await timeout(async () => {
83
+
88
84
  await new Promise<void>((resolve, reject) => {
89
- dojoRequire(['dojo/window', 'dojo/dom', 'dojo/io/script', 'dojo/io/iframe',
90
- 'dojox/gfx', 'dojox/gfx/svg', 'dojox/gfx/shape',
91
- 'dijit/_base', 'dijit/Tooltip', 'dijit/form/_FormValueWidget',
92
- 'dijit/form/DropDownButton', 'dijit/layout/AccordionContainer', 'dijit/form/ComboButton',
93
- 'dijit/layout/StackController', 'dijit/layout/StackContainer',
94
- ],
95
- (...args: any[]) => {
96
- resolve();
97
- });
85
+ window.dojoConfig = {
86
+ callback: () => { resolve(); },
87
+ parseOnLoad: true,
88
+ async: false,
89
+ locale: 'en-us', // to limit dijit/nls file set
90
+ };
91
+ // Load dojo without package/sources section for the settings dojoConfig to take effect
92
+ DG.Utils.loadJsCss([
93
+ // 'https://ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js.uncompressed.js',
94
+ `${_package.webRoot}/vendor/dojo-1.10.10/dojo/dojo.js.uncompressed.js`,
95
+ ]).then(() => {});
98
96
  });
99
- } finally {
100
- window.require = function(...args: any[]) {
101
- _package.logger.debug(`${logPrefix}, window.require( ${JSON.stringify(args)} )`);
102
- dojoRequire(...args);
103
- };
104
- }
105
97
 
106
- //await delay(50);
107
-
108
- // dojo.window','dojo.io.script','dojo.io.iframe','dojo.dom','dojox.gfx','dojox.gfx.svg','dojox.gfx.shape','dojox.charting'
109
- const dojoTargetList: { name: string, module: string | null, checker: () => boolean }[] = [
110
- {name: 'dojo.window', module: null, checker: () => !!dojo?.window},
111
- {name: 'dojo.ready', module: null, checker: () => !!dojo?.ready},
112
- {name: 'dojo.io.script', module: null, checker: () => !!dojo?.io?.script},
113
- {name: 'dojo.io.iframe', module: null, checker: () => !!dojo?.io?.iframe},
114
- // //{name: 'dojo.request.script', module: 'dojo.request.script', checker: () => !!dojo?.request?.iframe},
115
- // {name: 'dojo.dom', module: 'dojo.dom', checker: () => !!dojo?.dom},
116
- // {name: 'dojox.gfx', module: 'dojox.gfx', checker: () => !!dojox?.gfx},
117
- // {name: 'dojox.gfx.svg', module: 'dojox.gfx.svg', checker: () => !!dojox?.gfx?.svg},
118
- {name: 'dojox.gfx.createSurface', module: null, checker: () => !!dojox?.gfx?.createSurface},
119
- // {name: 'dojox.gfx.shape', module: 'dojox.gfx.shape', checker: () => !!dojox?.gfx?.shape},
120
- // {name: 'dojox.charting.themes.Claro', module: 'dojox.charting.themes.Claro', checker: () => !!dojox.charting?.themes?.Claro},
121
- // {name: 'dojox.charting.themes.Wetland', module: 'dojox.charting.themes.Wetland', checker: () => !!dojox.charting?.themes?.Wetland},
122
- // {name: 'dojox.charting.plot2d.Base', module: 'dojox.charting.plot2d.Base', checker: () => !!dojox.charting?.plot2d?.Base},
123
- // {name: 'dojox.charting.Series', module: 'dojox.charting.Series', checker: () => !!dojox?.charting?.Series},
124
- // {name: 'dojox.charting.Chart2D', module: 'dojox.charting.Chart2D', checker: () => !!dojox?.charting?.Chart2D},
125
- // //{module: 'dojox.charting', checker: () => !!dojox.charting},
126
- // // {module: 'dojox.storage.Provider', checker: () => !!dojox?.storage?.Provider},
127
- // // {module: 'dojox.storage.LocalStorageProvider', checker: () => !!dojox?.storage?.LocalStorageProvider},
128
- ];
129
- for (const dojoTarget of dojoTargetList) {
130
- try { if (dojoTarget.module) dojo.require(dojoTarget.module); } catch (err: any) {
131
- _package.logger.error(err.message);
98
+ const dojoRequire = window.require;
99
+ const cmp = dojoRequire == requireBackup;
100
+ try {
101
+ await new Promise<void>((resolve, reject) => {
102
+ dojoRequire(['dojo/window', 'dojo/dom', 'dojo/io/script', 'dojo/io/iframe',
103
+ 'dojox/gfx', 'dojox/gfx/svg', 'dojox/gfx/shape',
104
+ 'dojox/storage/Provider', 'dojox/storage/LocalStorageProvider',
105
+ 'dijit/_base', 'dijit/Tooltip', 'dijit/form/_FormValueWidget',
106
+ 'dijit/form/DropDownButton', 'dijit/layout/AccordionContainer', 'dijit/form/ComboButton',
107
+ 'dijit/layout/StackController', 'dijit/layout/StackContainer',
108
+ ],
109
+ (...args: any[]) => { resolve(); });
110
+ });
111
+ } finally {
112
+ // TODO: Check interference with NGL
113
+ window.require = function(...args: any[]) {
114
+ _package.logger.debug(`${logPrefix}, window.require( ${JSON.stringify(args)} )`);
115
+ dojoRequire(...args);
116
+ };
132
117
  }
133
- }
134
- /** Gets list ofd modules not ready yet */
135
- const getDojoNotReadyList = (): string[] => {
136
- return dojoTargetList.filter((dt) => !dt.checker()).map((dt) => dt.name);
137
- };
138
- /** List of dojo modules not ready yet */ let dojoNotReadyList: string[];
139
- while ((dojoNotReadyList = getDojoNotReadyList()).length > 0) {
140
- const dojoProgress = dojoTargetList.length - dojoNotReadyList.length;
141
- pi.update(Math.round(100 * dojoProgress / dojoTargetList.length),
142
- `Loading Helm Web Editor ${dojoProgress}/${dojoTargetList.length}`);
143
- _package.logger.debug(`${logPrefix}, dojo loading ... ${dojoNotReadyList.map((m) => `'${m}'`).join(',')} ...`);
144
- await delay(100);
145
- }
146
- _package.logger.debug(`${logPrefix}, dojo ready all modules`);
147
- }, 60000, 'timeout dojox.gfx.svg');
118
+
119
+ /** List of dojo modules not ready yet */ let dojoNotReadyList: string[];
120
+ while ((dojoNotReadyList = getDojoNotReadyList()).length > 0) {
121
+ const dojoProgress = dojoTargetList.length - dojoNotReadyList.length;
122
+ pi.update(Math.round(100 * dojoProgress / dojoTargetList.length),
123
+ `Loading Helm Web Editor ${dojoProgress}/${dojoTargetList.length}`);
124
+ _package.logger.debug(`${logPrefix}, dojo loading ... ${dojoNotReadyList.map((m) => `'${m}'`).join(',')} ...`);
125
+ await delay(100);
126
+ }
127
+ _package.logger.debug(`${logPrefix}, dojo ready all modules`);
128
+ }, 60000, 'timeout dojox.gfx.svg');
129
+ } catch (err: any) {
130
+ const dojoNotReadyList = getDojoNotReadyList();
131
+ _package.logger.error(`${logPrefix}, dojo not ready ${dojoNotReadyList.map((m) => `'${m}'`).join(',')} ...`);
132
+ }
148
133
 
149
134
  _package.logger.debug(`${logPrefix}, patch window.dojox.gfx.svg.Text.prototype.getTextWidth`);
150
135
  // @ts-ignore
@@ -192,9 +177,9 @@ export const helmJsonReplacer = (key: string, value: any): any => {
192
177
  };
193
178
 
194
179
  export class HelmPackage extends DG.Package {
195
- public alertOriginal: (s: string) => void;
180
+ public alertOriginal: ((s: string) => void) | null = null;
196
181
  public readonly helmHelper: HelmHelper;
197
- public libHelper: IMonomerLibHelper;
182
+ public libHelper!: IMonomerLibHelper;
198
183
 
199
184
  constructor(opts: { debug: boolean } = {debug: false}) {
200
185
  super();
@@ -204,13 +189,9 @@ export class HelmPackage extends DG.Package {
204
189
  this.helmHelper = new HelmHelper(this.logger);
205
190
  }
206
191
 
207
- setLibHelper(libHelper: IMonomerLibHelper) {
208
- this.libHelper = libHelper;
209
- }
210
-
211
192
  // -- Init --
212
193
  /** Loads Dojo and HelmWebEditor, waits for init, patches */
213
- async initHelm(): Promise<void> {
194
+ async initHELMWebEditor(): Promise<void> {
214
195
  const logPrefix: string = 'Helm: Package.initDojo()';
215
196
 
216
197
  _package.logger.debug(`${logPrefix}, dependence loading …`);
@@ -235,12 +216,6 @@ export class HelmPackage extends DG.Package {
235
216
  _package.logger.debug(`${logPrefix}, dependence loaded, ET: ${(t2 - t1)} ms`);
236
217
  }
237
218
 
238
- async getMonomerLib(): Promise<IMonomerLib> {
239
- const libHelper = await getMonomerLibHelper();
240
- _package.setLibHelper(libHelper);
241
- return libHelper.getBioLib();
242
- }
243
-
244
219
  public initHelmPatchScilAlert(): void {
245
220
  const logPrefix: string = 'Helm: initHelmPatchScilAlert()';
246
221
  this.alertOriginal = scil.Utils.alert;
@@ -256,7 +231,7 @@ export class HelmPackage extends DG.Package {
256
231
 
257
232
  this.logger.debug(`${logPrefix}, this.getMonomerOriginal stored`);
258
233
 
259
- this.helmHelper.overrideGetMonomer(this.helmHelper.buildGetMonomerFromLib(this.monomerLib));
234
+ this.helmHelper.overrideMonomersFuncs(this.helmHelper.buildMonomersFuncsFromLib(this.monomerLib));
260
235
 
261
236
  // @ts-ignore, intercept with proxy to observe access and usage
262
237
  org.helm.webeditor.Monomers = new class {
@@ -300,21 +275,21 @@ export class HelmPackage extends DG.Package {
300
275
 
301
276
  // -- MonomerLib --
302
277
 
303
- private _monomerLib: IMonomerLib;
304
278
  public get monomerLib(): IMonomerLib {
305
- if (!this._monomerLib)
306
- throw new Error(`Helm: _package._monomerLib is not initialized yet`);
307
- return this._monomerLib;
279
+ if (!this.libHelper)
280
+ throw new Error(`Helm: _package.libHelper is not initialized yet`);
281
+ return this.libHelper.getMonomerLib();
308
282
  }
309
283
 
310
- private _monomerLibSub: Unsubscribable;
284
+ private _monomerLibSub?: Unsubscribable;
285
+
286
+ /** Requires both Bio & HELMWebEditor initialized */
287
+ initMonomerLib(libHelper: IMonomerLibHelper): void {
288
+ this.libHelper = libHelper;
311
289
 
312
- initMonomerLib(lib: IMonomerLib) {
313
- if (!!this._monomerLib)
314
- throw new Error(`Helm: _package._monomerLib is initialized already`);
315
- this._monomerLib = lib;
316
- rewriteLibraries(this._monomerLib); // initHelm()
317
- this._monomerLibSub = this._monomerLib.onChanged
290
+ const lib = this.monomerLib;
291
+ rewriteLibraries(lib); // initHelm()
292
+ this._monomerLibSub = lib.onChanged
318
293
  .subscribe(this.monomerLibOnChangedHandler.bind(this));
319
294
 
320
295
  this.initHelmPatchPistoia();
@@ -337,7 +312,7 @@ export class HelmPackage extends DG.Package {
337
312
  grok.shell.info(libMsg);
338
313
 
339
314
  _package.logger.debug(`${logPrefix}, org,helm.webeditor.Monomers updating ...`);
340
- rewriteLibraries(this._monomerLib); // initHelm() monomerLib.onChanged()
315
+ rewriteLibraries(this.monomerLib); // initHelm() monomerLib.onChanged()
341
316
  _package.logger.debug(`${logPrefix}, end, org.helm.webeditor.Monomers completed`);
342
317
  } catch (err: any) {
343
318
  const errMsg = errorToConsole(err);
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,13 +49,13 @@ export async function initHelm(): Promise<void> {
51
49
  _package.logger.debug(`${logPrefix}, start`);
52
50
 
53
51
  try {
54
- const [_, lib]: [void, IMonomerLib] = await Promise.all([
55
- _package.initHelm(),
56
- _package.getMonomerLib(),
52
+ const [_, libHelper] = await Promise.all([
53
+ _package.initHELMWebEditor(),
54
+ getMonomerLibHelper(),
57
55
  ]);
58
56
 
59
- _package.logger.debug(`${logPrefix}, then(), lib loaded`);
60
- _package.initMonomerLib(lib);
57
+ _package.logger.debug(`${logPrefix}, lib loaded`);
58
+ _package.initMonomerLib(libHelper);
61
59
  } catch (err: any) {
62
60
  const [errMsg, errStack] = errInfo(err);
63
61
  // const errMsg: string = err instanceof Error ? err.message : !!err ? err.toString() : 'Exception \'undefined\'';
@@ -132,14 +130,7 @@ function openWebEditor(cell: DG.Cell, value?: string, units?: string) {
132
130
  const col = cell.column as DG.Column<string>;
133
131
  const sh = SeqHandler.forColumn(col);
134
132
  const rowIdx = cell.rowIndex;
135
- let app: App;
136
- setTimeout(async () => {
137
- app = await buildWebEditorApp(view);
138
- if (!!cell && units === undefined)
139
- app.canvas!.helm!.setSequence(cell.value, 'HELM');
140
- else
141
- app.canvas!.helm!.setSequence(value!, 'HELM');
142
- }, 20);
133
+ const app: App = _package.helmHelper.createWebEditorApp(view, !!cell && units === undefined ? cell.value : value!);
143
134
  const dlg = ui.dialog({showHeader: false, showFooter: true});
144
135
  dlg.add(view)
145
136
  .onOK(() => {
@@ -191,7 +182,7 @@ export function getMolfiles(col: DG.Column): DG.Column {
191
182
  //input: string name =undefined {optional: true}
192
183
  //input: object options =undefined {optional: true}
193
184
  //output: object result
194
- export function helmInput(name: string, options: IInputInitOptions<HelmMol>): DG.InputBase<HelmMol> {
185
+ export function helmInput(name: string, options: IHelmInputInitOptions): HelmInputBase {
195
186
  // TODO: Annotate for semType = 'Macromolecule' AND units = 'helm'
196
187
  return _package.helmHelper.createHelmInput(name, options);
197
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
 
@@ -4,7 +4,7 @@ import * as DG from 'datagrok-api/dg';
4
4
 
5
5
  import $ from 'cash-dom';
6
6
 
7
- import {after, before, category, delay, expect, test, timeout} from '@datagrok-libraries/utils/src/test';
7
+ import {after, before, category, delay, expect, test, testEvent} from '@datagrok-libraries/utils/src/test';
8
8
  import {IHelmHelper, getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
9
9
  import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
10
10
  import {
@@ -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
  });
@@ -61,26 +61,37 @@ async function _testTooltipOnHelmInput(): Promise<void> {
61
61
  const helmValue = 'PEPTIDE1{[meY].A.G.T}$$$$';
62
62
  const helmInput = (await ui.input.helmAsync('Macromolecule')) as HelmInput;
63
63
  helmInput.stringValue = helmValue;
64
+ // Show dialog to the right of the TestManager test tree
65
+ // to prevent interfering mousemove position for tooltip.
66
+ const tmBcr = grok.shell.v ? grok.shell.v.root.getBoundingClientRect() : null;
64
67
  const dlg = ui.dialog('Helm Input Test')
65
68
  .add(helmInput)
66
- .show();
67
- const dialogInputEl = $(dlg.root)
68
- .find('div.d4-dialog-contents > div.ui-input-helm > div.ui-input-editor').get(0);
69
- expect(helmInput.getInput(), dialogInputEl);
69
+ .show({...(tmBcr ? {x: tmBcr.right + 20, y: tmBcr.top + 20} : {})});
70
+ try {
71
+ const dialogInputEl = $(dlg.root)
72
+ .find('div.d4-dialog-contents > div.ui-input-helm > div.ui-input-editor').get(0);
73
+ expect(helmInput.getInput(), dialogInputEl);
70
74
 
71
- const mon = {i: 0, elem: 'meY'};
72
- const a = helmInput.value.atoms[mon.i];
73
- const iEl = helmInput.getInput();
74
- const iBcr = iEl.getBoundingClientRect();
75
- const ev = new MouseEvent('mousemove', {
76
- cancelable: true, bubbles: true, view: window, button: 0,
77
- clientX: iBcr.left + a.p.x, clientY: iBcr.top + a.p.y
78
- });
79
- iEl.dispatchEvent(ev);
80
- await delay(200);
81
-
82
- const tooltipEl = $(document).find('body > div.d4-tooltip').get(0) as HTMLElement;
83
- const elemDiv = $(tooltipEl).find('div > div.d4-flex-row.ui-div > div:nth-child(1)').get(0);
84
- expect(tooltipEl.style.display != 'none', true);
85
- expect(elemDiv?.innerText, mon.elem);
75
+ const mon = {i: 0, elem: 'meY'};
76
+ const a = helmInput.molValue.atoms[mon.i];
77
+ const iEl = helmInput.getInput();
78
+ const iBcr = iEl.getBoundingClientRect();
79
+ const ev = new MouseEvent('mousemove', {
80
+ cancelable: true, bubbles: true, view: window, button: 0,
81
+ clientX: iBcr.left + a.p.x, clientY: iBcr.top + a.p.y
82
+ });
83
+ await testEvent(ui.tooltip.onTooltipShown, () => { /* tooltip shown*/ },
84
+ () => {
85
+ iEl.dispatchEvent(ev);
86
+ // do not await after event dispatch before test tooltip content
87
+ // await leads to tooltip changed (with TestManager tree node tooltip)
88
+ }, 100, 'timeout await ui.tooltip.onTooltipShown');
89
+ const tooltipEl = $(document).find('body > div.d4-tooltip').get(0) as HTMLElement;
90
+ const elemDiv = $(tooltipEl).find('div > div.d4-flex-row.ui-div > div:nth-child(1)').get(0);
91
+ expect(tooltipEl.style.display != 'none', true);
92
+ expect(elemDiv?.innerText, mon.elem);
93
+ } finally {
94
+ await delay(50);
95
+ ui.tooltip.hide();
96
+ }
86
97
  }
@@ -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