@datagrok/helm 2.3.4 → 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 +20 -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 +12 -20
- package/src/package.ts +13 -23
- 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 +4 -4
- 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.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(
|
|
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,14 +49,13 @@ export async function initHelm(): Promise<void> {
|
|
|
51
49
|
_package.logger.debug(`${logPrefix}, start`);
|
|
52
50
|
|
|
53
51
|
try {
|
|
54
|
-
await Promise.all([
|
|
52
|
+
const [_, libHelper] = await Promise.all([
|
|
55
53
|
_package.initHELMWebEditor(),
|
|
56
|
-
|
|
57
|
-
])
|
|
58
|
-
_package.initMonomerLib();
|
|
59
|
-
});
|
|
54
|
+
getMonomerLibHelper(),
|
|
55
|
+
]);
|
|
60
56
|
|
|
61
|
-
_package.logger.debug(`${logPrefix},
|
|
57
|
+
_package.logger.debug(`${logPrefix}, lib loaded`);
|
|
58
|
+
_package.initMonomerLib(libHelper);
|
|
62
59
|
} catch (err: any) {
|
|
63
60
|
const [errMsg, errStack] = errInfo(err);
|
|
64
61
|
// const errMsg: string = err instanceof Error ? err.message : !!err ? err.toString() : 'Exception \'undefined\'';
|
|
@@ -133,14 +130,7 @@ function openWebEditor(cell: DG.Cell, value?: string, units?: string) {
|
|
|
133
130
|
const col = cell.column as DG.Column<string>;
|
|
134
131
|
const sh = SeqHandler.forColumn(col);
|
|
135
132
|
const rowIdx = cell.rowIndex;
|
|
136
|
-
|
|
137
|
-
setTimeout(async () => {
|
|
138
|
-
app = await buildWebEditorApp(view);
|
|
139
|
-
if (!!cell && units === undefined)
|
|
140
|
-
app.canvas!.helm!.setSequence(cell.value, 'HELM');
|
|
141
|
-
else
|
|
142
|
-
app.canvas!.helm!.setSequence(value!, 'HELM');
|
|
143
|
-
}, 20);
|
|
133
|
+
const app: App = _package.helmHelper.createWebEditorApp(view, !!cell && units === undefined ? cell.value : value!);
|
|
144
134
|
const dlg = ui.dialog({showHeader: false, showFooter: true});
|
|
145
135
|
dlg.add(view)
|
|
146
136
|
.onOK(() => {
|
|
@@ -192,7 +182,7 @@ export function getMolfiles(col: DG.Column): DG.Column {
|
|
|
192
182
|
//input: string name =undefined {optional: true}
|
|
193
183
|
//input: object options =undefined {optional: true}
|
|
194
184
|
//output: object result
|
|
195
|
-
export function helmInput(name: string, options:
|
|
185
|
+
export function helmInput(name: string, options: IHelmInputInitOptions): HelmInputBase {
|
|
196
186
|
// TODO: Annotate for semType = 'Macromolecule' AND units = 'helm'
|
|
197
187
|
return _package.helmHelper.createHelmInput(name, options);
|
|
198
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
|
|
|
@@ -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
|
});
|
|
@@ -73,7 +73,7 @@ async function _testTooltipOnHelmInput(): Promise<void> {
|
|
|
73
73
|
expect(helmInput.getInput(), dialogInputEl);
|
|
74
74
|
|
|
75
75
|
const mon = {i: 0, elem: 'meY'};
|
|
76
|
-
const a = helmInput.
|
|
76
|
+
const a = helmInput.molValue.atoms[mon.i];
|
|
77
77
|
const iEl = helmInput.getInput();
|
|
78
78
|
const iBcr = iEl.getBoundingClientRect();
|
|
79
79
|
const ev = new MouseEvent('mousemove', {
|
|
@@ -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
|
|
|
@@ -24,14 +24,14 @@ category('helm-web-editor', async () => {
|
|
|
24
24
|
userLibSettings = await getUserLibSettings();
|
|
25
25
|
await setUserLibSettingsForTests();
|
|
26
26
|
await monomerLibHelper.awaitLoaded();
|
|
27
|
-
await monomerLibHelper.
|
|
27
|
+
await monomerLibHelper.loadMonomerLib(true);
|
|
28
28
|
|
|
29
29
|
hh = await getHelmHelper();
|
|
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
|
test('helm-web-editor', async () => {
|
|
@@ -11,11 +11,12 @@ import {
|
|
|
11
11
|
getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
|
|
12
12
|
} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
|
|
13
13
|
|
|
14
|
-
import {
|
|
14
|
+
import {JSDraw2Module} from '../types';
|
|
15
15
|
import {initHelmMainPackage} from './utils';
|
|
16
|
+
import {IHelmDrawOptions} from '@datagrok-libraries/helm-web-editor/src/types/org-helm';
|
|
16
17
|
|
|
17
18
|
declare const org: OrgType;
|
|
18
|
-
declare const JSDraw2:
|
|
19
|
+
declare const JSDraw2: JSDraw2Module;
|
|
19
20
|
|
|
20
21
|
type TestTgtType = { atomCount: number, bondCount: number };
|
|
21
22
|
|
|
@@ -47,12 +48,12 @@ category('parseHelm', () => {
|
|
|
47
48
|
await setUserLibSettingsForTests();
|
|
48
49
|
await timeout(async () => { await libHelper.awaitLoaded(); }, 5000,
|
|
49
50
|
'await monomerLib to be loaded');
|
|
50
|
-
await libHelper.
|
|
51
|
+
await libHelper.loadMonomerLib(true);
|
|
51
52
|
});
|
|
52
53
|
|
|
53
54
|
after(async () => {
|
|
54
55
|
await setUserLibSettings(userLibSettings);
|
|
55
|
-
await libHelper.
|
|
56
|
+
await libHelper.loadMonomerLib(true);
|
|
56
57
|
});
|
|
57
58
|
|
|
58
59
|
for (const [testName, {src, tgt}] of Object.entries(testData)) {
|
|
@@ -72,11 +73,11 @@ function _testParseHelmWithEditor(src: string, tgt: TestTgtType): void {
|
|
|
72
73
|
const io = org.helm.webeditor.IO;
|
|
73
74
|
|
|
74
75
|
const editorHost = ui.div();
|
|
75
|
-
const editor = new JSDraw2.Editor(editorHost, {viewonly: true});
|
|
76
|
+
const editor = new JSDraw2.Editor<HelmType, IHelmDrawOptions>(editorHost, {viewonly: true});
|
|
76
77
|
|
|
77
78
|
const plugin = new org.helm.webeditor.Plugin(editor);
|
|
78
79
|
const origin = new JSDraw2.Point(0, 0);
|
|
79
|
-
io.parseHelm(plugin, src, origin,
|
|
80
|
+
io.parseHelm(plugin, src, origin, undefined);
|
|
80
81
|
|
|
81
82
|
const m: Mol<HelmType> = plugin.jsd.m;
|
|
82
83
|
expect(m.atoms.length, tgt.atomCount);
|
|
@@ -86,11 +87,11 @@ function _testParseHelmWithEditor(src: string, tgt: TestTgtType): void {
|
|
|
86
87
|
function _testParseHelmWithoutDOM(src: string, tgt: TestTgtType): void {
|
|
87
88
|
const io = org.helm.webeditor.IO;
|
|
88
89
|
|
|
89
|
-
const molHandler = new JSDraw2.MolHandler();
|
|
90
|
+
const molHandler = new JSDraw2.MolHandler<HelmType>();
|
|
90
91
|
|
|
91
92
|
const plugin = new org.helm.webeditor.Plugin(molHandler);
|
|
92
93
|
const origin = new JSDraw2.Point(0, 0);
|
|
93
|
-
io.parseHelm(plugin, src, origin,
|
|
94
|
+
io.parseHelm(plugin, src, origin, undefined);
|
|
94
95
|
|
|
95
96
|
const m: Mol<HelmType> = plugin.jsd.m;
|
|
96
97
|
expect(m.atoms.length, tgt.atomCount);
|
|
@@ -85,12 +85,12 @@ category('properties-widget', () => {
|
|
|
85
85
|
await setUserLibSettingsForTests();
|
|
86
86
|
await timeout(async () => { await monomerLibHelper.awaitLoaded(); },
|
|
87
87
|
5000, 'MonomerLibHelper.awaitLoaded() timeout');
|
|
88
|
-
await monomerLibHelper.
|
|
88
|
+
await monomerLibHelper.loadMonomerLib(true); // load default libraries
|
|
89
89
|
});
|
|
90
90
|
|
|
91
91
|
after(async () => {
|
|
92
92
|
await setUserLibSettings(userLibSettings);
|
|
93
|
-
await monomerLibHelper.
|
|
93
|
+
await monomerLibHelper.loadMonomerLib(true); // load user settings libraries
|
|
94
94
|
});
|
|
95
95
|
|
|
96
96
|
for (const [testName, testData] of Object.entries(TestsData)) {
|
|
@@ -33,13 +33,13 @@ category('renderers', () => {
|
|
|
33
33
|
|
|
34
34
|
// Test 'helm' requires default monomer library loaded
|
|
35
35
|
await setUserLibSettingsForTests();
|
|
36
|
-
await monomerLibHelper.
|
|
36
|
+
await monomerLibHelper.loadMonomerLib(true); // load default libraries
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
after(async () => {
|
|
40
40
|
// UserDataStorage.put() replaces existing data
|
|
41
41
|
await setUserLibSettings(userLibSettings);
|
|
42
|
-
await monomerLibHelper.
|
|
42
|
+
await monomerLibHelper.loadMonomerLib(true); // load user settings libraries
|
|
43
43
|
});
|
|
44
44
|
|
|
45
45
|
|
package/src/types/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {HelmType, JSDraw2ModuleType, OrgType, ScilModuleType} from '@datagrok-libraries/bio/src/helm/types';
|
|
2
2
|
|
|
3
3
|
export type ScilModule = ScilModuleType;
|
|
4
|
-
export type
|
|
4
|
+
export type JSDraw2Module = JSDraw2ModuleType;
|
|
5
5
|
export type OrgHelmModule = OrgType;
|
package/src/utils/get-hovered.ts
CHANGED
|
@@ -2,17 +2,15 @@ import * as grok from 'datagrok-api/grok';
|
|
|
2
2
|
import * as DG from 'datagrok-api/dg';
|
|
3
3
|
import * as ui from 'datagrok-api/ui';
|
|
4
4
|
|
|
5
|
-
import {HelmType, PolymerType, Atom, Mol, ISeqMonomer} from '@datagrok-libraries/bio/src/helm/types';
|
|
5
|
+
import {HelmType, PolymerType, Atom, Mol, ISeqMonomer, HelmMol, HelmAtom} from '@datagrok-libraries/bio/src/helm/types';
|
|
6
6
|
|
|
7
7
|
import {helmTypeToPolymerType} from '@datagrok-libraries/bio/src/monomer-works/monomer-works';
|
|
8
8
|
|
|
9
9
|
import {HelmMonomerPlacer} from '../helm-monomer-placer';
|
|
10
10
|
|
|
11
11
|
export function getHoveredMonomerFromEditorMol(
|
|
12
|
-
argsX: number, argsY: number, mol:
|
|
13
|
-
):
|
|
14
|
-
let hoveredSeqMonomer: ISeqMonomer | null = null;
|
|
15
|
-
|
|
12
|
+
argsX: number, argsY: number, mol: HelmMol, cellHeight?: number
|
|
13
|
+
): HelmAtom | null {
|
|
16
14
|
/** @return {[number, number]} [atom, distance] */
|
|
17
15
|
function getNearest(excluded: (number | undefined)[]): [number | undefined, number | undefined] {
|
|
18
16
|
let atom: number | undefined = undefined;
|
|
@@ -34,18 +32,18 @@ export function getHoveredMonomerFromEditorMol(
|
|
|
34
32
|
const [firstAtomI, firstDistance] = getNearest([]);
|
|
35
33
|
const [secondAtomI, secondDistance] = getNearest([firstAtomI]);
|
|
36
34
|
|
|
35
|
+
let resAtom: HelmAtom | null = null;
|
|
37
36
|
if (firstAtomI !== undefined && firstDistance !== undefined) {
|
|
38
37
|
const firstAtom = mol.atoms[firstAtomI];
|
|
39
|
-
const firstSeqMonomer = getSeqMonomerFromHelmAtom(firstAtom);
|
|
40
38
|
if (secondAtomI !== undefined && secondDistance !== undefined) {
|
|
41
39
|
if (firstDistance < secondDistance * 0.45)
|
|
42
|
-
|
|
40
|
+
resAtom = firstAtom;
|
|
43
41
|
} else {
|
|
44
42
|
if (cellHeight && firstDistance < 0.35 * cellHeight)
|
|
45
|
-
|
|
43
|
+
resAtom = firstAtom;
|
|
46
44
|
}
|
|
47
45
|
}
|
|
48
|
-
return
|
|
46
|
+
return resAtom;
|
|
49
47
|
}
|
|
50
48
|
|
|
51
49
|
export function getHoveredMonomerFallback(
|
|
@@ -83,7 +81,7 @@ export function getHoveredMonomerFallback(
|
|
|
83
81
|
return hoveredSeqMonomer;
|
|
84
82
|
}
|
|
85
83
|
|
|
86
|
-
function getSeqMonomerFromHelmAtom(atom:
|
|
84
|
+
export function getSeqMonomerFromHelmAtom(atom: HelmAtom): ISeqMonomer {
|
|
87
85
|
const polymerType = helmTypeToPolymerType(atom.bio!.type);
|
|
88
86
|
return {symbol: atom.elem, polymerType: polymerType};
|
|
89
87
|
}
|
package/src/utils/get-monomer.ts
CHANGED
|
@@ -11,10 +11,7 @@ import {
|
|
|
11
11
|
} from '@datagrok-libraries/bio/src/utils/const';
|
|
12
12
|
import {HelmTypes} from '@datagrok-libraries/bio/src/helm/consts';
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
import {
|
|
16
|
-
AmbiguousWebEditorMonomer, GapWebEditorMonomer, getRS, MissingWebEditorMonomer
|
|
17
|
-
} from './get-monomer-dummy';
|
|
14
|
+
import {AmbiguousWebEditorMonomer, GapWebEditorMonomer, getRS, MissingWebEditorMonomer} from './get-monomer-dummy';
|
|
18
15
|
import {LibraryWebEditorMonomer} from './get-monomer-of-library';
|
|
19
16
|
import {OrgHelmModule, ScilModule} from '../types';
|
|
20
17
|
import {RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from '../constants';
|
|
@@ -59,6 +56,8 @@ export function getMonomerOverrideAndLogAlert(
|
|
|
59
56
|
export function getMonomerHandleArgs(
|
|
60
57
|
a: Atom<HelmType> | HelmType, name?: string
|
|
61
58
|
): [/** biotype */ HelmType, /** elem */ string] {
|
|
59
|
+
if (!a)
|
|
60
|
+
throw new Error(`Argument 'a' of type Atom or HelmType is mandatory.`);
|
|
62
61
|
let biotype: HelmType;
|
|
63
62
|
let elem: string;
|
|
64
63
|
if ((a as Atom<HelmType>).T === 'ATOM') {
|
|
@@ -9,54 +9,38 @@ import {
|
|
|
9
9
|
CellRendererBackAsyncBase, RenderServiceBase
|
|
10
10
|
} from '@datagrok-libraries/bio/src/utils/cell-renderer-async-base';
|
|
11
11
|
import {HelmAux, HelmProps} from '@datagrok-libraries/bio/src/viewers/helm-service';
|
|
12
|
+
import {_getHelmService} from '../package-utils';
|
|
12
13
|
import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
|
|
13
14
|
import {ILogger} from '@datagrok-libraries/bio/src/utils/logger';
|
|
14
15
|
import {getGridCellRendererBack} from '@datagrok-libraries/bio/src/utils/cell-renderer-back-base';
|
|
15
16
|
import {IMonomerLib} from '@datagrok-libraries/bio/src/types/index';
|
|
16
17
|
|
|
17
|
-
import {getHoveredMonomerFromEditorMol} from './get-hovered';
|
|
18
|
-
import {_getHelmService} from '../package-utils';
|
|
18
|
+
import {getHoveredMonomerFromEditorMol, getSeqMonomerFromHelmAtom} from './get-hovered';
|
|
19
19
|
|
|
20
20
|
import {_package} from '../package';
|
|
21
21
|
|
|
22
|
-
class WrapLogger implements ILogger {
|
|
23
|
-
constructor(
|
|
24
|
-
private readonly base: ILogger
|
|
25
|
-
) {}
|
|
26
|
-
|
|
27
|
-
error(message: any, params?: object | undefined, stackTrace?: string | undefined): void {
|
|
28
|
-
this.base.error(message, params, stackTrace);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
warning(message: string, params?: object | undefined): void {
|
|
32
|
-
this.base.warning(message, params);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
info(message: string, params?: object | undefined): void {
|
|
36
|
-
// this.base.info(message, params);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
debug(message: string, params?: object | undefined): void {
|
|
40
|
-
// this.base.debug(message, params);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
22
|
export class HelmGridCellRendererBack extends CellRendererBackAsyncBase<HelmProps, HelmAux> {
|
|
45
23
|
private _auxList: (HelmAux | null)[];
|
|
46
24
|
|
|
47
25
|
private monomerLib: IMonomerLib | null = null;
|
|
48
26
|
|
|
27
|
+
// eslint-disable-next-line max-len
|
|
28
|
+
private readonly uuid: string = wu.repeat(1).map(() => Math.floor((Math.random() * 36)).toString(36)).take(4).toArray().join('');
|
|
29
|
+
|
|
49
30
|
constructor(
|
|
50
31
|
gridCol: DG.GridColumn | null,
|
|
51
32
|
tableCol: DG.Column<string>,
|
|
52
33
|
) {
|
|
53
|
-
super(gridCol, tableCol,
|
|
34
|
+
super(gridCol, tableCol, _package.logger, true);
|
|
54
35
|
}
|
|
55
36
|
|
|
56
37
|
protected override reset(): void {
|
|
38
|
+
const logPrefix = `${this.toLog()}.reset()`;
|
|
39
|
+
this.logger.debug(`${logPrefix}, start`);
|
|
57
40
|
super.reset();
|
|
58
41
|
this._auxList = new Array<HelmAux | null>(this.tableCol.length).fill(null);
|
|
59
42
|
if (this.gridCol && this.gridCol.dart) this.gridCol.grid?.invalidate();
|
|
43
|
+
this.logger.debug(`${logPrefix}, end`);
|
|
60
44
|
}
|
|
61
45
|
|
|
62
46
|
protected override getRenderService(): RenderServiceBase<HelmProps, HelmAux> {
|
|
@@ -70,6 +54,8 @@ export class HelmGridCellRendererBack extends CellRendererBackAsyncBase<HelmProp
|
|
|
70
54
|
}
|
|
71
55
|
|
|
72
56
|
protected override storeAux(gridCell: DG.GridCell, aux: HelmAux): void {
|
|
57
|
+
const logPrefix = `${this.toLog()}.storeAux()`;
|
|
58
|
+
this.logger.debug(`${logPrefix}, start`);
|
|
73
59
|
if (gridCell.tableRowIndex !== null)
|
|
74
60
|
this._auxList[gridCell.tableRowIndex] = aux;
|
|
75
61
|
}
|
|
@@ -141,10 +127,10 @@ export class HelmGridCellRendererBack extends CellRendererBackAsyncBase<HelmProp
|
|
|
141
127
|
this.logger.warning(`${logPrefix}, editorMol of the cell not found.`);
|
|
142
128
|
return; // The gridCell is not rendered yet
|
|
143
129
|
}
|
|
144
|
-
const
|
|
145
|
-
getHoveredMonomerFromEditorMol(argsX, argsY, editorMol, gridCell.bounds.height);
|
|
130
|
+
const hoveredAtom = getHoveredMonomerFromEditorMol(argsX, argsY, editorMol, gridCell.bounds.height);
|
|
146
131
|
|
|
147
|
-
if (
|
|
132
|
+
if (hoveredAtom) {
|
|
133
|
+
const seqMonomer = getSeqMonomerFromHelmAtom(hoveredAtom);
|
|
148
134
|
const monomerLib = _package.monomerLib;
|
|
149
135
|
const tooltipEl = monomerLib ? monomerLib.getTooltip(seqMonomer.polymerType, seqMonomer.symbol) :
|
|
150
136
|
ui.divText('Monomer library is not available');
|
|
@@ -170,7 +156,8 @@ export class HelmGridCellRendererBack extends CellRendererBackAsyncBase<HelmProp
|
|
|
170
156
|
// -- Handle events --
|
|
171
157
|
|
|
172
158
|
private monomerLibOnChanged(_value: any): void {
|
|
173
|
-
this.
|
|
159
|
+
this.dirty = true;
|
|
160
|
+
this.invalidateGrid();
|
|
174
161
|
}
|
|
175
162
|
|
|
176
163
|
static getOrCreate(gridCell: DG.GridCell): HelmGridCellRendererBack {
|
|
@@ -5,23 +5,21 @@ import * as DG from 'datagrok-api/dg';
|
|
|
5
5
|
import $ from 'cash-dom';
|
|
6
6
|
import {Subject, Unsubscribable} from 'rxjs';
|
|
7
7
|
|
|
8
|
-
import {
|
|
9
|
-
import {IMonomerLib} from '@datagrok-libraries/bio/src/types/index';
|
|
10
|
-
import {Editor, HelmType} from '@datagrok-libraries/bio/src/helm/types';
|
|
8
|
+
import {HelmEditor} from '@datagrok-libraries/bio/src/helm/types';
|
|
11
9
|
import {RenderTask} from '@datagrok-libraries/bio/src/utils/cell-renderer-async-base';
|
|
12
10
|
import {HelmAux, HelmProps, HelmServiceBase} from '@datagrok-libraries/bio/src/viewers/helm-service';
|
|
13
11
|
import {svgToImage} from '@datagrok-libraries/utils/src/svg';
|
|
14
12
|
|
|
15
|
-
import {
|
|
13
|
+
import {JSDraw2Module} from '../types';
|
|
16
14
|
|
|
17
15
|
import {_package} from '../package';
|
|
18
16
|
|
|
19
|
-
declare const JSDraw2:
|
|
17
|
+
declare const JSDraw2: JSDraw2Module;
|
|
20
18
|
|
|
21
19
|
export class HelmService extends HelmServiceBase {
|
|
22
20
|
private readonly hostDiv: HTMLDivElement;
|
|
23
21
|
|
|
24
|
-
private editor!:
|
|
22
|
+
private editor!: HelmEditor;
|
|
25
23
|
private image: HTMLImageElement | null = null;
|
|
26
24
|
|
|
27
25
|
constructor() {
|