@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.
- package/CHANGELOG.md +28 -0
- 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 +8 -7
- package/src/cell-renderer.ts +9 -8
- package/src/helm-helper.ts +232 -40
- package/src/helm-monomer-placer.ts +1 -1
- package/src/helm-web-editor.ts +24 -34
- package/src/package-utils.ts +92 -117
- package/src/package.ts +13 -22
- package/src/tests/findMonomers-tests.ts +3 -3
- package/src/tests/get-molfiles-tests.ts +2 -2
- package/src/tests/get-monomer-tests.ts +19 -16
- package/src/tests/helm-input-tests.ts +34 -23
- package/src/tests/helm-service-tests.ts +3 -3
- package/src/tests/helm-tests.ts +1 -2
- package/src/tests/helm-web-editor-tests.ts +2 -2
- package/src/tests/parse-helm-tests.ts +9 -8
- package/src/tests/properties-widget-tests.ts +2 -2
- package/src/tests/renderers-tests.ts +2 -2
- package/src/types/index.ts +1 -1
- package/src/utils/get-hovered.ts +8 -10
- package/src/utils/get-monomer.ts +3 -4
- package/src/utils/helm-grid-cell-renderer.ts +16 -29
- package/src/utils/helm-service.ts +4 -6
- package/src/widgets/helm-input.ts +135 -72
- package/src/widgets/properties-widget.ts +4 -4
- package/tsconfig.json +3 -3
- package/webpack.config.js +4 -4
package/src/package-utils.ts
CHANGED
|
@@ -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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
_package.logger.
|
|
147
|
-
}
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
306
|
-
throw new Error(`Helm: _package.
|
|
307
|
-
return this.
|
|
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
|
|
284
|
+
private _monomerLibSub?: Unsubscribable;
|
|
285
|
+
|
|
286
|
+
/** Requires both Bio & HELMWebEditor initialized */
|
|
287
|
+
initMonomerLib(libHelper: IMonomerLibHelper): void {
|
|
288
|
+
this.libHelper = libHelper;
|
|
311
289
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
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.
|
|
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,
|
|
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 {
|
|
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:
|
|
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 [_,
|
|
55
|
-
_package.
|
|
56
|
-
|
|
52
|
+
const [_, libHelper] = await Promise.all([
|
|
53
|
+
_package.initHELMWebEditor(),
|
|
54
|
+
getMonomerLibHelper(),
|
|
57
55
|
]);
|
|
58
56
|
|
|
59
|
-
_package.logger.debug(`${logPrefix},
|
|
60
|
-
_package.initMonomerLib(
|
|
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
|
-
|
|
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:
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
28
|
+
await monomerLibHelper.loadMonomerLib(true);
|
|
29
29
|
});
|
|
30
30
|
|
|
31
31
|
after(async () => {
|
|
32
32
|
await setUserLibSettings(userLibSettings);
|
|
33
|
-
await monomerLibHelper.
|
|
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 {
|
|
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:
|
|
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.
|
|
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.
|
|
102
|
+
await monomerLibHelper.loadMonomerLib(true);
|
|
99
103
|
});
|
|
100
104
|
|
|
101
105
|
test('original', async () =>{
|
|
102
|
-
const monomerLib = libHelper.
|
|
106
|
+
const monomerLib = libHelper.getMonomerLib();
|
|
103
107
|
rewriteLibraries(monomerLib);
|
|
104
108
|
|
|
105
|
-
// const
|
|
109
|
+
// const overriddenMonomersFuncs = helmHelper.revertOriginalMonomersFuncs();
|
|
106
110
|
// try {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
115
|
+
return _testAll('original', getMonomerFunc);
|
|
113
116
|
// } finally {
|
|
114
|
-
// helmHelper.
|
|
117
|
+
// helmHelper.overrideMonomersFuncs(overriddenMonomersFuncs);
|
|
115
118
|
// }
|
|
116
119
|
}, {isAggregated: true});
|
|
117
120
|
|
|
118
121
|
test('monomerLib', async () =>{
|
|
119
|
-
const monomerLib = monomerLibHelper.
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
|
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.
|
|
33
|
+
await monomerLibHelper.loadMonomerLib(true); // load default libraries
|
|
34
34
|
});
|
|
35
35
|
|
|
36
36
|
after(async () => {
|
|
37
37
|
await setUserLibSettings(userLibSettings);
|
|
38
|
-
await monomerLibHelper.
|
|
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.
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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.
|
|
45
|
-
const libSummary = monomerLibHelper.
|
|
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.
|
|
63
|
+
await monomerLibHelper.loadMonomerLib(true); // load user settings libraries
|
|
64
64
|
_package.logger.debug(`${logPrefix}, end`);
|
|
65
65
|
});
|
|
66
66
|
|
package/src/tests/helm-tests.ts
CHANGED
|
@@ -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
|
-
'
|
|
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
|
|