@datagrok/helm 2.5.3 → 2.5.4

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,7 +1,7 @@
1
1
  {
2
2
  "name": "@datagrok/helm",
3
3
  "friendlyName": "Helm",
4
- "version": "2.5.3",
4
+ "version": "2.5.4",
5
5
  "author": {
6
6
  "name": "Aleksandr Tanas",
7
7
  "email": "atanas@datagrok.ai"
@@ -16,33 +16,35 @@
16
16
  "css/helm.css"
17
17
  ],
18
18
  "dependencies": {
19
- "@datagrok-libraries/bio": "^5.44.2",
19
+ "@datagrok-libraries/bio": "^5.45.0",
20
20
  "@datagrok-libraries/chem-meta": "^1.2.7",
21
- "@datagrok-libraries/utils": "^4.3.4",
21
+ "@datagrok-libraries/utils": "^4.3.6",
22
22
  "cash-dom": "^8.1.1",
23
23
  "datagrok-api": "^1.21.1",
24
24
  "dayjs": "^1.10.6",
25
+ "lru-cache": "^10.4.3",
25
26
  "rxjs": "^6.5.5",
26
27
  "wu": "latest"
27
28
  },
28
29
  "devDependencies": {
29
- "@datagrok-libraries/helm-web-editor": "^1.1.11",
30
- "@datagrok-libraries/js-draw-lite": "^0.0.8",
31
- "@datagrok/bio": "^2.15.6",
32
- "@datagrok/chem": "^1.12.1",
30
+ "@datagrok-libraries/helm-web-editor": "^1.1.12",
31
+ "@datagrok-libraries/js-draw-lite": "^0.0.9",
32
+ "@datagrok/bio": "^2.16.0",
33
+ "@datagrok/chem": "^1.12.3",
33
34
  "@types/node": "17.0.45",
34
35
  "@types/webpack-env": "^1.18.5",
35
36
  "@types/wu": "latest",
36
37
  "@typescript-eslint/eslint-plugin": "^7.16.0",
37
38
  "@typescript-eslint/parser": "^7.16.0",
38
39
  "datagrok-tools": "latest",
39
- "eslint": "^8.18.0",
40
- "eslint-config-google": "^0.14.0",
41
- "eslint-plugin-rxjs": "^5.0.3",
40
+ "eslint": "latest",
41
+ "eslint-config-google": "latest",
42
+ "eslint-plugin-deprecation": "latest",
43
+ "eslint-plugin-rxjs": "latest",
42
44
  "path": "^0.12.7",
43
- "source-map-loader": "^4.0.1",
44
- "ts-loader": "^9.2.6",
45
- "typescript": "^4.8.4",
45
+ "source-map-loader": "latest",
46
+ "ts-loader": "latest",
47
+ "typescript": "latest",
46
48
  "webpack": "^5.76.3",
47
49
  "webpack-cli": "^4.9.1"
48
50
  },
@@ -4,12 +4,13 @@ import * as DG from 'datagrok-api/dg';
4
4
 
5
5
  import $ from 'cash-dom';
6
6
 
7
+ /* eslint-disable max-len */
7
8
  import {
8
9
  App, Point, HelmAtom, HelmBond, HelmMol, HelmType, GetMonomerFunc, GetMonomerResType,
9
10
  MonomerExplorer, TabDescType, MonomersFuncs, MonomerSetType, ISeqMonomer, PolymerType, MonomerType,
10
- DojoType, JSDraw2ModuleType,
11
+ DojoType, JSDraw2ModuleType, IHelmEditorOptions, IHelmDrawOptions
11
12
  } from '@datagrok-libraries/bio/src/helm/types';
12
- import {HelmTypes, MonomerTypes, PolymerTypes} from '@datagrok-libraries/bio/src/helm/consts';
13
+ import {HelmTabKeys, HelmTypes, MonomerTypes, PolymerTypes} from '@datagrok-libraries/bio/src/helm/consts';
13
14
  import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
14
15
  import {ILogger} from '@datagrok-libraries/bio/src/utils/logger';
15
16
  import {
@@ -17,13 +18,13 @@ import {
17
18
  } from '@datagrok-libraries/bio/src/helm/helm-helper';
18
19
  import {IHelmWebEditor} from '@datagrok-libraries/bio/src/helm/types';
19
20
  import {IMonomerLib, IMonomerLibBase, IMonomerLinkData, IMonomerSetPlaceholder} from '@datagrok-libraries/bio/src/types/index';
20
- import {HelmTabKeys, IHelmDrawOptions} from '@datagrok-libraries/helm-web-editor/src/types/org-helm';
21
21
  import {GAP_SYMBOL, GapOriginals, NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule/consts';
22
22
 
23
23
  import {HelmWebEditor} from './helm-web-editor';
24
24
  import {OrgHelmModule, ScilModule} from './types';
25
25
  import {HelmInput} from './widgets/helm-input';
26
26
  import {getHoveredMonomerFromEditorMol} from './utils/get-hovered';
27
+ /* eslint-enable max-len */
27
28
 
28
29
  import {_package} from './package';
29
30
 
@@ -47,7 +48,7 @@ export class HelmHelper implements IHelmHelper {
47
48
 
48
49
  createHelmInput(name?: string, options?: IHelmInputInitOptions): HelmInputBase {
49
50
  try {
50
- const monomerLib: IMonomerLibBase = _package.libHelper!.getMonomerLib();
51
+ const monomerLib: IMonomerLibBase = _package._libHelper!.getMonomerLib();
51
52
  return HelmInput.create(this, monomerLib, name, options);
52
53
  } catch (err: any) {
53
54
  const [errMsg, errStack] = errInfo(err);
@@ -56,8 +57,8 @@ export class HelmHelper implements IHelmHelper {
56
57
  }
57
58
  }
58
59
 
59
- createHelmWebEditor(host?: HTMLDivElement, drawOptions?: Partial<IHelmDrawOptions>): IHelmWebEditor {
60
- return new HelmWebEditor(host, drawOptions);
60
+ createHelmWebEditor(host?: HTMLDivElement, options?: Partial<IHelmEditorOptions>): IHelmWebEditor {
61
+ return new HelmWebEditor(host, options);
61
62
  }
62
63
 
63
64
  createWebEditorApp(host: HTMLDivElement, helm: string): App {
@@ -146,7 +147,7 @@ export class HelmHelper implements IHelmHelper {
146
147
  }
147
148
 
148
149
  public onShowTabPlaceholdersSets(mex: MonomerExplorer, div: HTMLDivElement): void {
149
- const monomerSets = _package.libHelper!.getMonomerSets();
150
+ const monomerSets = _package._libHelper!.getMonomerSets();
150
151
 
151
152
  const phSet: { [polymerType: string]: { [helmType: string]: IMonomerSetPlaceholder[] } } = {};
152
153
  for (const ph of monomerSets.placeholders) {
@@ -340,7 +341,7 @@ export class HelmHelper implements IHelmHelper {
340
341
  }
341
342
 
342
343
  public parse(helm: string, origin?: Point): HelmMol {
343
- const molHandler = new JSDraw2.MolHandler<HelmType>();
344
+ const molHandler = new JSDraw2.MolHandler<HelmType, IHelmEditorOptions>();
344
345
  const plugin = new org.helm.webeditor.Plugin(molHandler);
345
346
  org.helm.webeditor.IO.parseHelm(plugin, helm, origin ?? new JSDraw2.Point(0, 0));
346
347
  return plugin.jsd.m;
@@ -6,7 +6,7 @@ import {Unsubscribable} from 'rxjs';
6
6
 
7
7
  import {ILogger} from '@datagrok-libraries/bio/src/utils/logger';
8
8
  import {
9
- App, Editor, HelmType, IHelmWebEditor, HelmEditor, IHelmDrawOptions
9
+ App, Editor, HelmType, IHelmWebEditor, HelmEditor, IHelmEditorOptions
10
10
  } from '@datagrok-libraries/bio/src/helm/types';
11
11
 
12
12
  import {JSDraw2Module, OrgHelmModule, ScilModule} from './types';
@@ -27,16 +27,17 @@ export class HelmWebEditor implements IHelmWebEditor {
27
27
 
28
28
  constructor(
29
29
  host?: HTMLDivElement,
30
- drawOptions?: Partial<IHelmDrawOptions>,
30
+ options?: Partial<IHelmEditorOptions>,
31
31
  private logger: ILogger = _package.logger
32
32
  ) {
33
33
  this.host = host ?? ui.div([], {style: {width: `${this.w}px`, height: `${this.h}px`}});
34
34
 
35
- const styleBackup = {width: this.host.style.width, height: this.host.style.height, overflow: this.host.style.overflow};
36
- this.editor = new JSDraw2.Editor(this.host, {
37
- width: this.w, height: this.h, viewonly: true,
38
- drawOptions: drawOptions
39
- });
35
+ const styleBackup = {
36
+ width: this.host.style.width, height: this.host.style.height,
37
+ overflow: this.host.style.overflow
38
+ };
39
+ this.editor = new JSDraw2.Editor(this.host,
40
+ Object.assign({width: this.w, height: this.h, viewonly: true}, options));
40
41
  this.host.style.width = styleBackup.width;
41
42
  this.host.style.height = styleBackup.height;
42
43
  this.host.style.overflow = styleBackup.overflow;
@@ -5,7 +5,7 @@ import * as grok from 'datagrok-api/grok';
5
5
  // import {JSDraw2ModuleType} from '@datagrok/js-draw-lite/src/types/jsdraw2';
6
6
  // import {HelmType, OrgHelmModuleType} from '@datagrok/helm-web-editor/src/types/org-helm';
7
7
 
8
- import {runTests, tests, TestContext, initAutoTests as initTests } from '@datagrok-libraries/utils/src/test';
8
+ import {runTests, tests, TestContext, initAutoTests as initTests} from '@datagrok-libraries/utils/src/test';
9
9
 
10
10
  import './tests/_first-tests';
11
11
  import './tests/helm-tests';
@@ -13,9 +13,10 @@ import {
13
13
  import {HelmServiceBase} from '@datagrok-libraries/bio/src/viewers/helm-service';
14
14
  import {IMonomerLib} from '@datagrok-libraries/bio/src/types';
15
15
  import {LoggerWrapper} from '@datagrok-libraries/bio/src/utils/logger';
16
+ import {IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
16
17
  import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
18
+ import {ISeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
17
19
 
18
- import {HelmHelper} from './helm-helper';
19
20
  import {HelmService} from './utils/helm-service';
20
21
  import {OrgHelmModule, ScilModule} from './types';
21
22
  import {rewriteLibraries} from './utils/get-monomer';
@@ -38,14 +39,15 @@ type DojoConfigWindowType = {
38
39
  },
39
40
  };
40
41
  type HelmWindowType = {
41
- $helmService?: HelmServiceBase,
42
+ $helmServicePromise?: Promise<HelmServiceBase>,
42
43
  require: any,
43
44
  };
44
45
  declare const window: Window & DojoConfigWindowType & DojoWindowType & HweWindow & HelmWindowType;
45
46
 
46
- export function _getHelmService(): HelmServiceBase {
47
- let res = window.$helmService;
48
- if (!res) res = window.$helmService = new HelmService();
47
+ export async function _getHelmService(): Promise<HelmServiceBase> {
48
+ let res = window.$helmServicePromise;
49
+ if (!res)
50
+ res = window.$helmServicePromise = Promise.resolve(new HelmService());
49
51
  return res;
50
52
  }
51
53
 
@@ -57,7 +59,8 @@ export async function initHelmLoadAndPatchDojo(): Promise<void> {
57
59
  try {
58
60
  const requireBackup = window.require;
59
61
 
60
- // dojo.window','dojo.io.script','dojo.io.iframe','dojo.dom','dojox.gfx','dojox.gfx.svg','dojox.gfx.shape','dojox.charting'
62
+ // 'dojo.window','dojo.io.script','dojo.io.iframe','dojo.dom',
63
+ // 'dojox.gfx','dojox.gfx.svg','dojox.gfx.shape','dojox.charting'
61
64
  const dojoTargetList: { name: string, checker: () => boolean }[] = [
62
65
  {name: 'dojo.window', checker: () => !!(window.dojo?.window)},
63
66
  {name: 'dojo.ready', checker: () => !!(window.dojo?.ready)},
@@ -120,14 +123,16 @@ export async function initHelmLoadAndPatchDojo(): Promise<void> {
120
123
  const cmp = dojoRequire == requireBackup;
121
124
  try {
122
125
  await new Promise<void>((resolve, reject) => {
123
- dojoRequire(['dojo/window', 'dojo/dom', 'dojo/io/script', 'dojo/io/iframe',
126
+ /* eslint-disable indent */
127
+ dojoRequire([
128
+ 'dojo/window', 'dojo/dom', 'dojo/io/script', 'dojo/io/iframe',
124
129
  'dojox/gfx', 'dojox/gfx/svg', 'dojox/gfx/shape',
125
130
  'dojox/storage/Provider', 'dojox/storage/LocalStorageProvider',
126
131
  'dijit/_base', 'dijit/Tooltip', 'dijit/form/_FormValueWidget',
127
132
  'dijit/form/DropDownButton', 'dijit/layout/AccordionContainer', 'dijit/form/ComboButton',
128
- 'dijit/layout/StackController', 'dijit/layout/StackContainer',
129
- ],
133
+ 'dijit/layout/StackController', 'dijit/layout/StackContainer',],
130
134
  (...args: any[]) => { resolve(); });
135
+ /* eslint-enable indent */
131
136
  });
132
137
  } finally {
133
138
  // TODO: Check interference with NGL
@@ -142,7 +147,8 @@ export async function initHelmLoadAndPatchDojo(): Promise<void> {
142
147
  const dojoProgress = dojoTargetList.length - dojoNotReadyList.length;
143
148
  pi.update(Math.round(100 * dojoProgress / dojoTargetList.length),
144
149
  `Loading Helm Web Editor ${dojoProgress}/${dojoTargetList.length}`);
145
- _package.logger.debug(`${logPrefix}, dojo loading ... ${dojoNotReadyList.map((m) => `'${m}'`).join(',')} ...`);
150
+ _package.logger.debug(`${logPrefix}, dojo loading ... ` +
151
+ `${dojoNotReadyList.map((m) => `'${m}'`).join(',')} ...`);
146
152
  await delay(100);
147
153
  }
148
154
  _package.logger.debug(`${logPrefix}, dojo ready all modules`);
@@ -199,15 +205,27 @@ export const helmJsonReplacer = (key: string, value: any): any => {
199
205
 
200
206
  export class HelmPackage extends DG.Package {
201
207
  public alertOriginal: ((s: string) => void) | null = null;
202
- public readonly helmHelper: HelmHelper;
203
- public libHelper!: IMonomerLibHelper;
208
+
209
+ private _seqHelper: ISeqHelper;
210
+ public get seqHelper(): ISeqHelper {
211
+ if (!this._seqHelper)
212
+ throw new Error('Package Helm .seqHelper is not initialized');
213
+ return this._seqHelper;
214
+ }
215
+
216
+ private _helmHelper: IHelmHelper;
217
+ public get helmHelper(): IHelmHelper {
218
+ if (!this._helmHelper)
219
+ throw new Error('Package Helm .helmHelper is not initialized');
220
+ return this._helmHelper;
221
+ };
222
+
223
+ public _libHelper!: IMonomerLibHelper;
204
224
 
205
225
  constructor(opts: { debug: boolean } = {debug: false}) {
206
226
  super();
207
227
  // @ts-ignore
208
228
  super._logger = new LoggerWrapper(super.logger, opts.debug);
209
-
210
- this.helmHelper = new HelmHelper(this.logger);
211
229
  }
212
230
 
213
231
  // -- Init --
@@ -299,16 +317,20 @@ export class HelmPackage extends DG.Package {
299
317
  // -- MonomerLib --
300
318
 
301
319
  public get monomerLib(): IMonomerLib {
302
- if (!this.libHelper)
320
+ if (!this._libHelper)
303
321
  throw new Error(`Helm: _package.libHelper is not initialized yet`);
304
- return this.libHelper.getMonomerLib();
322
+ return this._libHelper.getMonomerLib();
305
323
  }
306
324
 
307
325
  private _monomerLibSub?: Unsubscribable;
308
326
 
327
+ private _initialized: boolean = false;
328
+
309
329
  /** Requires both Bio & HELMWebEditor initialized */
310
- initMonomerLib(libHelper: IMonomerLibHelper): void {
311
- this.libHelper = libHelper;
330
+ completeInit(seqHelper: ISeqHelper, helmHelper: IHelmHelper, libHelper: IMonomerLibHelper): void {
331
+ this._seqHelper = seqHelper;
332
+ this._helmHelper = helmHelper;
333
+ this._libHelper = libHelper;
312
334
 
313
335
  const lib = this.monomerLib;
314
336
  rewriteLibraries(lib); // initHelm()
@@ -316,6 +338,7 @@ export class HelmPackage extends DG.Package {
316
338
  .subscribe(this.monomerLibOnChangedHandler.bind(this));
317
339
 
318
340
  this.initHelmPatchPistoia();
341
+ this._initialized = true;
319
342
  }
320
343
 
321
344
  monomerLibOnChangedHandler(): void {
package/src/package.ts CHANGED
@@ -8,15 +8,16 @@ import $ from 'cash-dom';
8
8
  import {testEvent} from '@datagrok-libraries/utils/src/test';
9
9
  import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
10
10
  import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
11
- import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
12
- import {App, Editor, HelmMol, HelmType, HweWindow} from '@datagrok-libraries/bio/src/helm/types';
11
+ import {getSeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
12
+ import {App, HweWindow} from '@datagrok-libraries/bio/src/helm/types';
13
13
  import {HelmInputBase, IHelmHelper, IHelmInputInitOptions} from '@datagrok-libraries/bio/src/helm/helm-helper';
14
14
  import {HelmServiceBase} from '@datagrok-libraries/bio/src/viewers/helm-service';
15
15
  import {getMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
16
16
 
17
17
  import {getPropertiesWidget} from './widgets/properties-widget';
18
18
  import {HelmGridCellRenderer, HelmGridCellRendererBack} from './utils/helm-grid-cell-renderer';
19
- import {_getHelmService, HelmPackage, initHelmLoadAndPatchDojo} from './package-utils';
19
+ import {_getHelmService, HelmPackage} from './package-utils';
20
+ import {HelmHelper} from './helm-helper';
20
21
 
21
22
  // Do not import anything than types from @datagrok/helm-web-editor/src/types
22
23
  import type {JSDraw2Module, OrgHelmModule, ScilModule} from './types';
@@ -40,10 +41,9 @@ let initHelmPromise: Promise<void> | null = null;
40
41
 
41
42
  //tags: init
42
43
  export async function initHelm(): Promise<void> {
43
- if (initHelmPromise === null) {
44
+ if (initHelmPromise === null)
44
45
  initHelmPromise = initHelmInt();
45
- }
46
- await initHelmPromise;
46
+ return initHelmPromise;
47
47
  }
48
48
 
49
49
  async function initHelmInt(): Promise<void> {
@@ -51,13 +51,15 @@ async function initHelmInt(): Promise<void> {
51
51
  _package.logger.debug(`${logPrefix}, start`);
52
52
 
53
53
  try {
54
- const [_, libHelper] = await Promise.all([
54
+ const helmHelper: IHelmHelper = new HelmHelper(_package.logger);
55
+ const [_, seqHelper, libHelper] = await Promise.all([
55
56
  _package.initHELMWebEditor(),
57
+ getSeqHelper(),
56
58
  getMonomerLibHelper(),
57
59
  ]);
58
60
 
59
61
  _package.logger.debug(`${logPrefix}, lib loaded`);
60
- _package.initMonomerLib(libHelper);
62
+ _package.completeInit(seqHelper, helmHelper, libHelper);
61
63
  } catch (err: any) {
62
64
  const [errMsg, errStack] = errInfo(err);
63
65
  // const errMsg: string = err instanceof Error ? err.message : !!err ? err.toString() : 'Exception \'undefined\'';
@@ -72,8 +74,9 @@ async function initHelmInt(): Promise<void> {
72
74
  }
73
75
 
74
76
  //name: getHelmService
77
+ //description: Helm renderer service
75
78
  //output: object result
76
- export function getHelmService(): HelmServiceBase {
79
+ export async function getHelmService(): Promise<HelmServiceBase> {
77
80
  return _getHelmService();
78
81
  }
79
82
 
@@ -108,7 +111,7 @@ export function editMoleculeCell(cell: DG.GridCell): void {
108
111
  export function openEditor(mol: string): void {
109
112
  const df = grok.shell.tv.grid.dataFrame;
110
113
  const col = df.columns.bySemType('Macromolecule')! as DG.Column<string>;
111
- const colSh = SeqHandler.forColumn(col);
114
+ const colSh = _package.seqHelper.getSeqHandler(col);
112
115
  const colUnits = col.meta.units;
113
116
  if (df.currentRowIdx === -1)
114
117
  return;
@@ -133,7 +136,7 @@ function openWebEditor(cell: DG.GridCell, value?: string, units?: string) {
133
136
  // const df = grok.shell.tv.grid.dataFrame;
134
137
  // const col = df.columns.bySemType('Macromolecule')!
135
138
  const col = cell.cell.column as DG.Column<string>;
136
- const sh = SeqHandler.forColumn(col);
139
+ const sh = _package.seqHelper.getSeqHandler(col);
137
140
  const app: App =
138
141
  _package.helmHelper.createWebEditorApp(view, !!cell && units === undefined ? cell.cell.value : value!);
139
142
  const dlg = ui.dialog({showHeader: false, showFooter: true});
@@ -184,7 +187,7 @@ export function helmInput(name: string, options: IHelmInputInitOptions): HelmInp
184
187
 
185
188
  //name: getHelmHelper
186
189
  //output: object result
187
- export async function getHelmHelper(): Promise<IHelmHelper> {
190
+ export function getHelmHelper(): IHelmHelper {
188
191
  return _package.helmHelper;
189
192
  }
190
193
 
@@ -224,7 +227,6 @@ export async function measureCellRenderer(): Promise<void> {
224
227
  // -- Test apps --
225
228
 
226
229
  //name: Highlight Monomers
227
- //tags: app
228
230
  //output: view result
229
231
  export async function highlightMonomers(): Promise<void> {
230
232
  const pi = DG.TaskBarProgressIndicator.create('Test app highlight monomers');
@@ -92,16 +92,11 @@ category('getMonomer', ()=>{
92
92
  const monomerLib = monomerLibHelper.getMonomerLib();
93
93
  rewriteLibraries(monomerLib);
94
94
 
95
- // const overriddenMonomersFuncs = helmHelper.revertOriginalMonomersFuncs();
96
- // try {
97
- const helmHelper: IHelmHelper = await getHelmHelper();
98
- expect(helmHelper != null, true);
99
- const getMonomerFunc: GetMonomerFunc = helmHelper.originalMonomersFuncs!.getMonomer!;
100
-
101
- return _testAll('original', getMonomerFunc);
102
- // } finally {
103
- // helmHelper.overrideMonomersFuncs(overriddenMonomersFuncs);
104
- // }
95
+ const helmHelper: IHelmHelper = await getHelmHelper();
96
+ expect(helmHelper != null, true);
97
+ const getMonomerFunc: GetMonomerFunc = helmHelper.originalMonomersFuncs!.getMonomer!;
98
+
99
+ return _testAll('original', getMonomerFunc);
105
100
  }, {isAggregated: true});
106
101
 
107
102
  test('monomerLib', async () =>{
@@ -2,14 +2,16 @@ import * as grok from 'datagrok-api/grok';
2
2
  import * as ui from 'datagrok-api/ui';
3
3
  import * as DG from 'datagrok-api/dg';
4
4
 
5
+ /* eslint-disable max-len */
5
6
  import {after, before, category, delay, expect, expectArray, test, testEvent} from '@datagrok-libraries/utils/src/test';
6
7
  import {HelmNotSupportedError, HelmNotSupportedErrorType, IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
7
8
  import {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
9
+ /* eslint-enable max-len */
8
10
 
9
11
  import {_package} from '../package-test';
10
12
 
11
13
  type TestSrcType = { helm: string };
12
- type TestTgtType = { helm: string | null, map: [number, number][] };
14
+ type TestTgtType = { helm: string | null, map: [number, number][], errType?: string };
13
15
 
14
16
  category('HelmHelper: removeGaps', () => {
15
17
  let helmHelper: IHelmHelper;
@@ -63,7 +65,7 @@ category('HelmHelper: removeGaps', () => {
63
65
  },
64
66
  'single-cycle-gap-at-connection': {
65
67
  src: {helm: 'PEPTIDE1{[meY].*.C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-7:R3$$$V2.0'},
66
- tgt: {helm: null, map: []}
68
+ tgt: {helm: null, map: [], errType: HelmNotSupportedErrorType}
67
69
  }
68
70
  };
69
71
 
@@ -78,8 +80,8 @@ category('HelmHelper: removeGaps', () => {
78
80
  resErr = err;
79
81
  }
80
82
 
81
- expect(resErr?.type == HelmNotSupportedErrorType, testData.tgt.helm === null,
82
- 'HelmNotSupportedError thrown expected');
83
+ if (testData.tgt.errType)
84
+ expect(resErr?.type, testData.tgt.errType, 'HelmNotSupportedError thrown expected');
83
85
  });
84
86
  }
85
87
  });
@@ -64,6 +64,7 @@ category('HelmService', () => {
64
64
  const logPrefix: string = `Helm: tests: HelmService: helm`;
65
65
  _package.logger.debug(`${logPrefix}, start`);
66
66
  const helmStr: string = 'PEPTIDE1{I.H.A.N.T.Thr_PO3H2.Aca.D-Tyr_Et}$$$$';
67
+ const monomerLib = monomerLibHelper.getMonomerLib();
67
68
  let consumerId: number | null = null;
68
69
  let taskAux: HelmAux | null = null;
69
70
  const event = new Subject<void>();
@@ -74,7 +75,7 @@ category('HelmService', () => {
74
75
  const task: RenderTask<HelmProps, HelmAux> = {
75
76
  name: 'test1',
76
77
  props: {
77
- helm: helmStr,
78
+ helm: helmStr, monomerLib: monomerLib,
78
79
  backColor: DG.Color.fromHtml('#FFFFFF'),
79
80
  width: 300, height: 100,
80
81
  },
@@ -4,7 +4,7 @@ import * as DG from 'datagrok-api/dg';
4
4
 
5
5
 
6
6
  import {after, before, category, delay, expect, test, expectArray, timeout} from '@datagrok-libraries/utils/src/test';
7
- import {HelmType, IHelmDrawOptions, Mol, OrgType} from '@datagrok-libraries/bio/src/helm/types';
7
+ import {HelmType, IHelmEditorOptions, Mol, OrgType} from '@datagrok-libraries/bio/src/helm/types';
8
8
  import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
9
9
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
10
10
  import {
@@ -79,7 +79,7 @@ function _testParseHelmWithEditor(src: string, tgt: TestTgtType): void {
79
79
  const io = org.helm.webeditor.IO;
80
80
 
81
81
  const editorHost = ui.div();
82
- const editor = new JSDraw2.Editor<HelmType, IHelmDrawOptions>(editorHost, {viewonly: true});
82
+ const editor = new JSDraw2.Editor<HelmType, IHelmEditorOptions>(editorHost, {viewonly: true});
83
83
 
84
84
  const plugin = new org.helm.webeditor.Plugin(editor);
85
85
  const origin = new JSDraw2.Point(0, 0);
@@ -93,7 +93,7 @@ function _testParseHelmWithEditor(src: string, tgt: TestTgtType): void {
93
93
  function _testParseHelmWithoutDOM(src: string, tgt: TestTgtType): void {
94
94
  const io = org.helm.webeditor.IO;
95
95
 
96
- const molHandler = new JSDraw2.MolHandler<HelmType>();
96
+ const molHandler = new JSDraw2.MolHandler<HelmType, IHelmEditorOptions>();
97
97
 
98
98
  const plugin = new org.helm.webeditor.Plugin(molHandler);
99
99
  const origin = new JSDraw2.Point(0, 0);
@@ -4,12 +4,12 @@ import * as grok from 'datagrok-api/grok';
4
4
 
5
5
  import {after, before, category, expect, expectObject, test, timeout} from '@datagrok-libraries/utils/src/test';
6
6
  import {ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';
7
- import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
8
7
  import {
9
8
  getUserLibSettings, setUserLibSettings
10
9
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
11
10
  import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
12
11
  import {generateLongSequence} from '@datagrok-libraries/bio/src/utils/generator';
12
+ import {getSeqHelper, ISeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
13
13
 
14
14
  import {initHelmMainPackage} from './utils';
15
15
  import {getPropertiesDict, SeqPropertiesError} from '../widgets/properties-widget';
@@ -72,12 +72,14 @@ const TestsData: {
72
72
  };
73
73
 
74
74
  category('properties-widget', () => {
75
+ let seqHelper: ISeqHelper;
75
76
  let monomerLibHelper: IMonomerLibHelper;
76
77
  /** Backup actual user's monomer libraries settings */
77
78
  let userLibSettings: any = null;
78
79
 
79
80
  before(async () => {
80
81
  await initHelmMainPackage();
82
+ seqHelper = await getSeqHelper();
81
83
 
82
84
  monomerLibHelper = await getMonomerLibHelper();
83
85
  userLibSettings = getUserLibSettings();
@@ -101,7 +103,7 @@ category('properties-widget', () => {
101
103
  const df = DG.DataFrame.fromColumns(colList);
102
104
  const col = df.getCol('MSA');
103
105
 
104
- const sh = SeqHandler.forColumn(col);
106
+ const sh = seqHelper.getSeqHandler(col);
105
107
  let errCatched = true;
106
108
  try {
107
109
  const _actPropDict = getPropertiesDict(col.get(0), sh);
@@ -111,17 +113,17 @@ category('properties-widget', () => {
111
113
  }
112
114
  expect(errCatched, true);
113
115
  });
114
- });
115
116
 
116
- function testPropertiesDict(
117
- seq: string, units: NOTATION, separator: string | undefined, alphabet: ALPHABET | undefined, expPropDict: {}
118
- ) {
119
- const col = DG.Column.fromStrings('seq', [seq]) as DG.Column<string>;
120
- col.semType = DG.SEMTYPE.MACROMOLECULE;
121
- col.meta.units = units;
122
- if (separator) col.setTag(bioTAGS.separator, separator);
123
- if (alphabet) col.setTag(bioTAGS.alphabet, alphabet);
124
- const sh = SeqHandler.forColumn(col);
125
- const actPropDict = getPropertiesDict(seq, sh);
126
- expectObject(actPropDict, expPropDict);
127
- }
117
+ function testPropertiesDict(
118
+ seq: string, units: NOTATION, separator: string | undefined, alphabet: ALPHABET | undefined, expPropDict: {}
119
+ ) {
120
+ const col = DG.Column.fromStrings('seq', [seq]) as DG.Column<string>;
121
+ col.semType = DG.SEMTYPE.MACROMOLECULE;
122
+ col.meta.units = units;
123
+ if (separator) col.setTag(bioTAGS.separator, separator);
124
+ if (alphabet) col.setTag(bioTAGS.alphabet, alphabet);
125
+ const sh = seqHelper.getSeqHandler(col);
126
+ const actPropDict = getPropertiesDict(seq, sh);
127
+ expectObject(actPropDict, expPropDict);
128
+ }
129
+ });
@@ -85,9 +85,8 @@ export function getHoveredMonomerFallback(
85
85
  }
86
86
 
87
87
  export function getSeqMonomerFromHelmAtom(atom: HelmAtom): ISeqMonomer {
88
- const polymerType = helmTypeToPolymerType(atom.bio!.type);
89
88
  const canonicalSymbol = atom.elem === GapOriginals[NOTATION.HELM] ? GAP_SYMBOL : atom.elem;
90
- return {position: parseInt(atom.bio!.continuousId as string) - 1, symbol: atom.elem, biotype: atom.bio!.type};
89
+ return {position: parseInt(atom.bio!.continuousId as string) - 1, symbol: canonicalSymbol, biotype: atom.bio!.type};
91
90
  }
92
91
 
93
92
  /** Linear