@datagrok/helm 2.5.3 → 2.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +27 -6
- package/CHANGELOG.md +15 -1
- package/dist/455.js.map +1 -1
- package/dist/package-test.js +1 -1
- package/dist/package-test.js.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/package.json +16 -14
- package/src/helm-helper.ts +11 -9
- package/src/helm-web-editor.ts +8 -7
- package/src/package-test.ts +1 -1
- package/src/package-utils.ts +41 -18
- package/src/package.ts +15 -13
- package/src/tests/get-monomer-tests.ts +5 -10
- package/src/tests/helm-helper-tests.ts +6 -4
- package/src/tests/helm-service-tests.ts +2 -1
- package/src/tests/parse-helm-tests.ts +6 -6
- package/src/tests/properties-widget-tests.ts +17 -15
- package/src/utils/get-hovered.ts +1 -2
- package/src/utils/helm-grid-cell-renderer.ts +46 -26
- package/src/utils/helm-service.ts +32 -13
- package/src/widgets/helm-input.ts +2 -2
- package/src/widgets/properties-widget.ts +5 -3
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@datagrok/helm",
|
|
3
3
|
"friendlyName": "Helm",
|
|
4
|
-
"version": "2.5.
|
|
4
|
+
"version": "2.5.5",
|
|
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.
|
|
19
|
+
"@datagrok-libraries/bio": "^5.45.0",
|
|
20
20
|
"@datagrok-libraries/chem-meta": "^1.2.7",
|
|
21
|
-
"@datagrok-libraries/utils": "^4.3.
|
|
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
|
-
"wu": "
|
|
27
|
+
"wu": "^2.1.0"
|
|
27
28
|
},
|
|
28
29
|
"devDependencies": {
|
|
29
|
-
"@datagrok-libraries/helm-web-editor": "^1.1.
|
|
30
|
-
"@datagrok-libraries/js-draw-lite": "^0.0.
|
|
31
|
-
"@datagrok/bio": "^2.
|
|
32
|
-
"@datagrok/chem": "^1.12.
|
|
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
|
-
"@types/wu": "
|
|
36
|
+
"@types/wu": "^2.1.44",
|
|
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.
|
|
40
|
+
"eslint": "^8.57.1",
|
|
40
41
|
"eslint-config-google": "^0.14.0",
|
|
42
|
+
"eslint-plugin-deprecation": "^3.0.0",
|
|
41
43
|
"eslint-plugin-rxjs": "^5.0.3",
|
|
42
44
|
"path": "^0.12.7",
|
|
43
|
-
"source-map-loader": "^
|
|
44
|
-
"ts-loader": "^9.
|
|
45
|
-
"typescript": "^
|
|
45
|
+
"source-map-loader": "^5.0.0",
|
|
46
|
+
"ts-loader": "^9.5.1",
|
|
47
|
+
"typescript": "^5.6.3",
|
|
46
48
|
"webpack": "^5.76.3",
|
|
47
49
|
"webpack-cli": "^4.9.1"
|
|
48
50
|
},
|
|
@@ -77,4 +79,4 @@
|
|
|
77
79
|
"directory": "packages/Helm"
|
|
78
80
|
},
|
|
79
81
|
"category": "Bioinformatics"
|
|
80
|
-
}
|
|
82
|
+
}
|
package/src/helm-helper.ts
CHANGED
|
@@ -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.
|
|
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,
|
|
60
|
-
return new HelmWebEditor(host,
|
|
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.
|
|
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) {
|
|
@@ -260,7 +261,8 @@ export class HelmHelper implements IHelmHelper {
|
|
|
260
261
|
const logPrefixInt = `${logPrefix}, org.helm.webeditor.Monomers.getMonomer()`;
|
|
261
262
|
try {
|
|
262
263
|
// logger.debug(`${logPrefixInt}, a: ${JSON.stringify(a, helmJsonReplacer)}, name: '${name}'`);
|
|
263
|
-
|
|
264
|
+
if (name?.startsWith('[') && name.endsWith(']'))
|
|
265
|
+
name = name.substring(1, name.length - 1);
|
|
264
266
|
// Creates monomers in lib
|
|
265
267
|
const dgWem = monomerLib.getWebEditorMonomer(a, name);
|
|
266
268
|
|
|
@@ -340,7 +342,7 @@ export class HelmHelper implements IHelmHelper {
|
|
|
340
342
|
}
|
|
341
343
|
|
|
342
344
|
public parse(helm: string, origin?: Point): HelmMol {
|
|
343
|
-
const molHandler = new JSDraw2.MolHandler<HelmType>();
|
|
345
|
+
const molHandler = new JSDraw2.MolHandler<HelmType, IHelmEditorOptions>();
|
|
344
346
|
const plugin = new org.helm.webeditor.Plugin(molHandler);
|
|
345
347
|
org.helm.webeditor.IO.parseHelm(plugin, helm, origin ?? new JSDraw2.Point(0, 0));
|
|
346
348
|
return plugin.jsd.m;
|
package/src/helm-web-editor.ts
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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 = {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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;
|
package/src/package-test.ts
CHANGED
|
@@ -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
|
|
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';
|
package/src/package-utils.ts
CHANGED
|
@@ -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
|
-
$
|
|
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.$
|
|
48
|
-
if (!res)
|
|
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',
|
|
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
|
-
|
|
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 ...
|
|
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
|
-
|
|
203
|
-
|
|
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.
|
|
320
|
+
if (!this._libHelper)
|
|
303
321
|
throw new Error(`Helm: _package.libHelper is not initialized yet`);
|
|
304
|
-
return this.
|
|
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
|
-
|
|
311
|
-
this.
|
|
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 {
|
|
12
|
-
import {App,
|
|
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
|
|
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
|
|
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.
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
|
|
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,
|
|
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 {
|
|
@@ -50,8 +50,7 @@ category('parseHelm', () => {
|
|
|
50
50
|
|
|
51
51
|
libHelper = await getMonomerLibHelper();
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
'get user lib settings for backup');
|
|
53
|
+
userLibSettings = await getUserLibSettings();
|
|
55
54
|
|
|
56
55
|
// parseHelm is dependent on monomers RGroups available, test requires default monomer library
|
|
57
56
|
await libHelper.loadMonomerLibForTests();
|
|
@@ -71,7 +70,7 @@ category('parseHelm', () => {
|
|
|
71
70
|
for (const [testName, {src, tgt}] of Object.entries(testData)) {
|
|
72
71
|
test(`woDOM-${testName}`, async () => {
|
|
73
72
|
_testParseHelmWithoutDOM(src, tgt);
|
|
74
|
-
}
|
|
73
|
+
});
|
|
75
74
|
}
|
|
76
75
|
});
|
|
77
76
|
|
|
@@ -79,7 +78,7 @@ function _testParseHelmWithEditor(src: string, tgt: TestTgtType): void {
|
|
|
79
78
|
const io = org.helm.webeditor.IO;
|
|
80
79
|
|
|
81
80
|
const editorHost = ui.div();
|
|
82
|
-
const editor = new JSDraw2.Editor<HelmType,
|
|
81
|
+
const editor = new JSDraw2.Editor<HelmType, IHelmEditorOptions>(editorHost, {viewonly: true});
|
|
83
82
|
|
|
84
83
|
const plugin = new org.helm.webeditor.Plugin(editor);
|
|
85
84
|
const origin = new JSDraw2.Point(0, 0);
|
|
@@ -93,7 +92,7 @@ function _testParseHelmWithEditor(src: string, tgt: TestTgtType): void {
|
|
|
93
92
|
function _testParseHelmWithoutDOM(src: string, tgt: TestTgtType): void {
|
|
94
93
|
const io = org.helm.webeditor.IO;
|
|
95
94
|
|
|
96
|
-
const molHandler = new JSDraw2.MolHandler<HelmType>();
|
|
95
|
+
const molHandler = new JSDraw2.MolHandler<HelmType, IHelmEditorOptions>();
|
|
97
96
|
|
|
98
97
|
const plugin = new org.helm.webeditor.Plugin(molHandler);
|
|
99
98
|
const origin = new JSDraw2.Point(0, 0);
|
|
@@ -104,4 +103,5 @@ function _testParseHelmWithoutDOM(src: string, tgt: TestTgtType): void {
|
|
|
104
103
|
expect(m.atoms.length, tgt.atomCount);
|
|
105
104
|
expect(m.bonds.length, tgt.bondCount);
|
|
106
105
|
expect(resHelm, tgt.helm);
|
|
106
|
+
expect(m.atoms.every((a) => !a.elem.startsWith('[') && !a.elem.endsWith(']')), true, 'Atoms should not contain square braces.');
|
|
107
107
|
}
|
|
@@ -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 =
|
|
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
|
-
|
|
118
|
-
) {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
+
});
|
package/src/utils/get-hovered.ts
CHANGED
|
@@ -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:
|
|
89
|
+
return {position: parseInt(atom.bio!.continuousId as string) - 1, symbol: canonicalSymbol, biotype: atom.bio!.type};
|
|
91
90
|
}
|
|
92
91
|
|
|
93
92
|
/** Linear
|