@datagrok/helm 2.2.1 → 2.3.0
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 +17 -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 +9 -10
- package/src/cell-renderer.ts +8 -33
- package/src/helm-helper.ts +67 -17
- package/src/helm-monomer-placer.ts +7 -9
- package/src/helm-web-editor.ts +33 -3
- package/src/package-test.ts +8 -3
- package/src/package-utils.ts +69 -42
- package/src/package.ts +121 -141
- package/src/tests/findMonomers-tests.ts +2 -0
- package/src/tests/get-all-parts-tests.ts +5 -0
- package/src/tests/get-molfiles-tests.ts +3 -1
- package/src/tests/get-monomer-tests.ts +88 -19
- package/src/tests/helm-service-tests.ts +4 -0
- package/src/tests/helm-tests.ts +7 -1
- package/src/tests/helm-web-editor-tests.ts +55 -0
- package/src/tests/parse-helm-tests.ts +98 -0
- package/src/tests/properties-widget-tests.ts +33 -4
- package/src/tests/renderers-tests.ts +3 -1
- package/src/tests/utils.ts +6 -0
- package/src/types/index.ts +5 -0
- package/src/utils/get-hovered.ts +3 -4
- package/src/utils/{dummy-monomer.ts → get-monomer-dummy.ts} +10 -45
- package/src/utils/get-monomer-of-library.ts +90 -0
- package/src/utils/get-monomer.ts +23 -21
- package/src/utils/helm-grid-cell-renderer.ts +9 -2
- package/src/utils/helm-service.ts +6 -5
- package/src/utils/index.ts +11 -17
- package/src/widgets/properties-widget.ts +29 -9
- package/tsconfig.json +1 -1
- package/vendor/helm-web-editor.development.js +39640 -0
- package/vendor/helm-web-editor.production.js +2 -0
- package/vendor/helm-web-editor.production.js.map +1 -0
- package/webpack.config.js +14 -11
- package/helm/JSDraw/Pistoia.HELM-uncompressed.js +0 -9694
- package/helm/JSDraw/Pistoia.HELM.js +0 -27
- package/helm/JSDraw/ReadMe.txt +0 -8
- package/helm/JSDraw/Scilligence.JSDraw2.Lite-uncompressed.js +0 -31126
- package/helm/JSDraw/Scilligence.JSDraw2.Lite.js +0 -12
- package/helm/JSDraw/Scilligence.JSDraw2.Resources.js +0 -762
- package/helm/JSDraw/dojo.js +0 -250
- package/helm/JSDraw/test.html +0 -24
package/package.json
CHANGED
|
@@ -1,31 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@datagrok/helm",
|
|
3
3
|
"friendlyName": "Helm",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.3.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Oleksandra Serhiienko",
|
|
7
7
|
"email": "oserhiienko@datagrok.ai"
|
|
8
8
|
},
|
|
9
9
|
"description": "Provides support for HELM notation (importing, detecting, rendering, conversion).",
|
|
10
10
|
"sources": [
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"helm/JSDraw/Scilligence.JSDraw2.Lite.js",
|
|
14
|
-
"helm/JSDraw/Scilligence.JSDraw2.Resources.js",
|
|
15
|
-
"helm/JSDraw/Pistoia.HELM.js"
|
|
11
|
+
"https://ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js.uncompressed.js",
|
|
12
|
+
"css/helm.css"
|
|
16
13
|
],
|
|
17
14
|
"dependencies": {
|
|
18
|
-
"@datagrok-libraries/bio": "^5.
|
|
15
|
+
"@datagrok-libraries/bio": "^5.42.3",
|
|
19
16
|
"@datagrok-libraries/chem-meta": "^1.2.5",
|
|
20
|
-
"@datagrok-libraries/utils": "^4.2.
|
|
17
|
+
"@datagrok-libraries/utils": "^4.2.11",
|
|
21
18
|
"cash-dom": "^8.1.1",
|
|
22
|
-
"datagrok-api": "^1.
|
|
19
|
+
"datagrok-api": "^1.18.6",
|
|
23
20
|
"dayjs": "^1.10.6",
|
|
24
21
|
"rxjs": "^6.5.5",
|
|
25
22
|
"wu": "latest"
|
|
26
23
|
},
|
|
27
24
|
"devDependencies": {
|
|
28
|
-
"@datagrok/
|
|
25
|
+
"@datagrok-libraries/helm-web-editor": "^1.1.5",
|
|
26
|
+
"@datagrok-libraries/js-draw-lite": "^0.0.3",
|
|
27
|
+
"@datagrok/bio": "^2.13.2",
|
|
29
28
|
"@datagrok/chem": "^1.9.2",
|
|
30
29
|
"@types/node": "17.0.45",
|
|
31
30
|
"@types/wu": "latest",
|
package/src/cell-renderer.ts
CHANGED
|
@@ -2,9 +2,10 @@ 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
|
-
import * as JSDraw2 from 'JSDraw2';
|
|
6
5
|
import wu from 'wu';
|
|
7
6
|
|
|
7
|
+
import {HelmType, Mol} from '@datagrok-libraries/bio/src/helm/types';
|
|
8
|
+
|
|
8
9
|
import {printLeftOrCentered} from '@datagrok-libraries/bio/src/utils/cell-renderer';
|
|
9
10
|
import {errorToConsole} from '@datagrok-libraries/utils/src/to-console';
|
|
10
11
|
import {getGridCellRendererBack} from '@datagrok-libraries/bio/src/utils/cell-renderer-back-base';
|
|
@@ -12,9 +13,12 @@ import {getGridCellRendererBack} from '@datagrok-libraries/bio/src/utils/cell-re
|
|
|
12
13
|
import {findMonomers, parseHelm, removeGapsFromHelm} from './utils';
|
|
13
14
|
import {HelmMonomerPlacer, ISeqMonomer} from './helm-monomer-placer';
|
|
14
15
|
import {getHoveredMonomerFallback, getHoveredMonomerFromEditorMol} from './utils/get-hovered';
|
|
16
|
+
import {JSDraw2HelmModule} from './types';
|
|
15
17
|
|
|
16
18
|
import {getMonomerLib} from './package';
|
|
17
19
|
|
|
20
|
+
declare const JSDraw2: JSDraw2HelmModule;
|
|
21
|
+
|
|
18
22
|
const enum tempTAGS {
|
|
19
23
|
helmSumMaxLengthWords = 'helm-sum-maxLengthWords',
|
|
20
24
|
helmMaxLengthWords = 'helm-maxLengthWords',
|
|
@@ -46,7 +50,7 @@ export class HelmCellRenderer extends DG.GridCellRenderer {
|
|
|
46
50
|
const argsX = e.offsetX - gcb.x;
|
|
47
51
|
const argsY = e.offsetY - gcb.y;
|
|
48
52
|
|
|
49
|
-
const editorMol:
|
|
53
|
+
const editorMol: Mol<HelmType> | null = helmPlacer.getEditorMol(gridCell.tableRowIndex!);
|
|
50
54
|
let seqMonomer: ISeqMonomer | null;
|
|
51
55
|
let missedMonomers: Set<string> = new Set<string>(); // of .size = 0
|
|
52
56
|
if (editorMol)
|
|
@@ -148,37 +152,8 @@ export class HelmCellRenderer extends DG.GridCellRenderer {
|
|
|
148
152
|
return;
|
|
149
153
|
}
|
|
150
154
|
|
|
151
|
-
if (missedMonomers.size > 0)
|
|
152
|
-
|
|
153
|
-
const r = window.devicePixelRatio;
|
|
154
|
-
h = 28;
|
|
155
|
-
g.canvas.height = h * r;
|
|
156
|
-
g.canvas.style.height = `${h}px`;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
w = grid ? Math.min(grid.canvas.width - x, w) : g.canvas.width - x;
|
|
160
|
-
//g.save();
|
|
161
|
-
g.beginPath();
|
|
162
|
-
g.rect(x, y, w, h);
|
|
163
|
-
g.clip();
|
|
164
|
-
g.transform(1, 0, 0, 1, x, y);
|
|
165
|
-
g.font = '12px monospace';
|
|
166
|
-
g.textBaseline = 'top';
|
|
167
|
-
const [allParts, _lengths, sumLengths] = helmPlacer.getCellAllPartsLengths(gridCell.tableRowIndex!);
|
|
168
|
-
|
|
169
|
-
for (let i = 0; i < allParts.length; ++i) {
|
|
170
|
-
const part: string = allParts[i];
|
|
171
|
-
const color: string =
|
|
172
|
-
part === '.' || part.endsWith('{') || part.startsWith('}') ? frameColor :
|
|
173
|
-
missedMonomers.has(part) ? missedColor :
|
|
174
|
-
monomers.has(part) ? monomerColor :
|
|
175
|
-
frameColor;
|
|
176
|
-
g.fillStyle = color;
|
|
177
|
-
printLeftOrCentered(sumLengths[i], 0, w, h, g, allParts[i], color, 0, true, 1.0,
|
|
178
|
-
undefined, undefined, undefined, undefined, undefined,
|
|
179
|
-
undefined, undefined, undefined, helmPlacer.monomerTextSizeMap);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
155
|
+
if (missedMonomers.size > 0)
|
|
156
|
+
throw new Error('Unexpected missed monomers');
|
|
182
157
|
} finally {
|
|
183
158
|
g.restore();
|
|
184
159
|
}
|
package/src/helm-helper.ts
CHANGED
|
@@ -2,27 +2,43 @@ 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
|
-
import
|
|
6
|
-
|
|
5
|
+
import {
|
|
6
|
+
App, Atom, HelmType, GetMonomerFunc, GetMonomerResType
|
|
7
|
+
} from '@datagrok-libraries/bio/src/helm/types';
|
|
7
8
|
|
|
9
|
+
import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
|
|
10
|
+
import {ILogger} from '@datagrok-libraries/bio/src/utils/logger';
|
|
8
11
|
import {IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
|
|
9
12
|
import {IHelmWebEditor} from '@datagrok-libraries/bio/src/helm/types';
|
|
13
|
+
import {IMonomerLib} from '@datagrok-libraries/bio/src/types/index';
|
|
10
14
|
|
|
11
15
|
import {HelmWebEditor} from './helm-web-editor';
|
|
16
|
+
import {OrgHelmModule, ScilModule} from './types';
|
|
17
|
+
import {getWebEditorMonomer} from './utils/get-monomer';
|
|
12
18
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
declare const
|
|
19
|
+
import {_package} from './package';
|
|
20
|
+
|
|
21
|
+
declare const scil: ScilModule;
|
|
22
|
+
declare const org: OrgHelmModule;
|
|
17
23
|
|
|
18
24
|
export class HelmHelper implements IHelmHelper {
|
|
25
|
+
private static instanceCount: number = 0;
|
|
26
|
+
|
|
27
|
+
constructor(
|
|
28
|
+
private readonly logger: ILogger
|
|
29
|
+
) {
|
|
30
|
+
// Watchdog for singleton
|
|
31
|
+
if ((++HelmHelper.instanceCount) > 1)
|
|
32
|
+
throw new Error(`HelmHelper must be a single.`);
|
|
33
|
+
}
|
|
34
|
+
|
|
19
35
|
createHelmWebEditor(): IHelmWebEditor {
|
|
20
36
|
return new HelmWebEditor();
|
|
21
37
|
}
|
|
22
38
|
|
|
23
|
-
createWebEditorApp(host: HTMLDivElement, helm: string):
|
|
39
|
+
createWebEditorApp(host: HTMLDivElement, helm: string): App {
|
|
24
40
|
org.helm.webeditor.MolViewer.molscale = 0.8;
|
|
25
|
-
const webEditorApp:
|
|
41
|
+
const webEditorApp: App = new org.helm.webeditor.App(host, {
|
|
26
42
|
showabout: false,
|
|
27
43
|
mexfontsize: '90%',
|
|
28
44
|
mexrnapinontab: true,
|
|
@@ -47,15 +63,49 @@ export class HelmHelper implements IHelmHelper {
|
|
|
47
63
|
return webEditorApp;
|
|
48
64
|
}
|
|
49
65
|
|
|
50
|
-
// --
|
|
66
|
+
// -- GetMonomer --
|
|
67
|
+
|
|
68
|
+
public originalGetMonomer: GetMonomerFunc | null = null;
|
|
69
|
+
|
|
70
|
+
public revertOriginalGetMonomer(): GetMonomerFunc {
|
|
71
|
+
const logPrefix = `Helm: revertOriginalGetMonomer()`;
|
|
72
|
+
if (this.originalGetMonomer === null)
|
|
73
|
+
throw new Error('Unable to revert original getMonomer');
|
|
74
|
+
|
|
75
|
+
const monomers = org.helm.webeditor.Monomers;
|
|
76
|
+
const overriddenGetMonomer = monomers.getMonomer = this.originalGetMonomer;
|
|
77
|
+
this.originalGetMonomer = null;
|
|
78
|
+
return overriddenGetMonomer;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public overrideGetMonomer(getMonomer: GetMonomerFunc): GetMonomerFunc {
|
|
82
|
+
const logPrefix = `Helm: overrideGetMonomer()`;
|
|
83
|
+
|
|
84
|
+
if (this.originalGetMonomer != null)
|
|
85
|
+
throw new Error('');
|
|
86
|
+
|
|
87
|
+
const monomers = org.helm.webeditor.Monomers;
|
|
88
|
+
this.originalGetMonomer = monomers.getMonomer.bind(monomers);
|
|
89
|
+
monomers.getMonomer = getMonomer;
|
|
90
|
+
return this.originalGetMonomer!;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
public buildGetMonomerFromLib(monomerLib: IMonomerLib): GetMonomerFunc {
|
|
94
|
+
const logPrefix = `Helm: HelmHelper.buildGetMonomerFromLib()`;
|
|
95
|
+
return (a: Atom<HelmType> | HelmType, name?: string): GetMonomerResType => {
|
|
96
|
+
const logPrefixInt = `${logPrefix}, org.helm.webeditor.Monomers.getMonomer()`;
|
|
97
|
+
try {
|
|
98
|
+
// logger.debug(`${logPrefixInt}, a: ${JSON.stringify(a, helmJsonReplacer)}, name: '${name}'`);
|
|
99
|
+
|
|
100
|
+
// Creates monomers in lib
|
|
101
|
+
const dgWem = getWebEditorMonomer(monomerLib, a, name);
|
|
51
102
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
return res;
|
|
103
|
+
return dgWem; //dgWem;
|
|
104
|
+
} catch (err) {
|
|
105
|
+
const [errMsg, errStack] = errInfo(err);
|
|
106
|
+
this.logger.error(`${logPrefixInt}, Error: ${errMsg}`, undefined, errStack);
|
|
107
|
+
throw err;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
60
110
|
}
|
|
61
111
|
}
|
|
@@ -2,27 +2,25 @@ 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
|
-
import * as org from 'org';
|
|
6
|
-
import * as JSDraw2 from 'JSDraw2';
|
|
7
5
|
import wu from 'wu';
|
|
8
6
|
|
|
9
|
-
import {
|
|
7
|
+
import {HelmType, Mol, PolymerType} from '@datagrok-libraries/bio/src/helm/types';
|
|
8
|
+
|
|
10
9
|
import {CellRendererBackBase} from '@datagrok-libraries/bio/src/utils/cell-renderer-back-base';
|
|
11
|
-
import {IEditorMol} from '@datagrok-libraries/bio/src/types/helm-web-editor';
|
|
12
10
|
|
|
13
11
|
import {getParts, parseHelm} from './utils';
|
|
14
12
|
|
|
15
13
|
import {_package, getMonomerLib} from './package';
|
|
16
14
|
|
|
17
15
|
export interface ISeqMonomer {
|
|
18
|
-
polymerType:
|
|
16
|
+
polymerType: PolymerType;
|
|
19
17
|
symbol: string;
|
|
20
18
|
}
|
|
21
19
|
|
|
22
20
|
export class HelmMonomerPlacer extends CellRendererBackBase<string> {
|
|
23
21
|
private _allPartsList: (string[] | null)[];
|
|
24
22
|
private _lengthsList: (number[] | null)[];
|
|
25
|
-
private _editorMolList: (
|
|
23
|
+
private _editorMolList: (Mol<HelmType> | null)[];
|
|
26
24
|
|
|
27
25
|
public monomerCharWidth: number = 7;
|
|
28
26
|
public leftPadding: number = 5;
|
|
@@ -38,7 +36,7 @@ export class HelmMonomerPlacer extends CellRendererBackBase<string> {
|
|
|
38
36
|
protected override reset(): void {
|
|
39
37
|
this._allPartsList = new Array<string[] | null>(this.tableCol.length).fill(null);
|
|
40
38
|
this._lengthsList = new Array<number[] | null>(this.tableCol.length).fill(null);
|
|
41
|
-
this._editorMolList = new Array<
|
|
39
|
+
this._editorMolList = new Array<Mol<HelmType> | null>(this.tableCol.length).fill(null);
|
|
42
40
|
}
|
|
43
41
|
|
|
44
42
|
/** Skips cell for the fallback rendering */
|
|
@@ -84,11 +82,11 @@ export class HelmMonomerPlacer extends CellRendererBackBase<string> {
|
|
|
84
82
|
this.invalidateGrid();
|
|
85
83
|
}
|
|
86
84
|
|
|
87
|
-
public setEditorMol(tableRowIndex: number, editorMol:
|
|
85
|
+
public setEditorMol(tableRowIndex: number, editorMol: Mol<HelmType>) {
|
|
88
86
|
this._editorMolList![tableRowIndex] = editorMol.clone(false);
|
|
89
87
|
}
|
|
90
88
|
|
|
91
|
-
public getEditorMol(tableRowIndex: number):
|
|
89
|
+
public getEditorMol(tableRowIndex: number): Mol<HelmType> | null {
|
|
92
90
|
return this._editorMolList![tableRowIndex];
|
|
93
91
|
}
|
|
94
92
|
}
|
package/src/helm-web-editor.ts
CHANGED
|
@@ -2,12 +2,18 @@ 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
|
-
import
|
|
5
|
+
import {
|
|
6
|
+
App, Editor, HelmType, IHelmWebEditor
|
|
7
|
+
} from '@datagrok-libraries/bio/src/helm/types';
|
|
6
8
|
|
|
7
|
-
import {
|
|
9
|
+
import {JSDraw2HelmModule, OrgHelmModule, ScilModule} from './types';
|
|
10
|
+
|
|
11
|
+
declare const scil: ScilModule;
|
|
12
|
+
declare const JSDraw2: JSDraw2HelmModule;
|
|
13
|
+
declare const org: OrgHelmModule;
|
|
8
14
|
|
|
9
15
|
export class HelmWebEditor implements IHelmWebEditor {
|
|
10
|
-
editor:
|
|
16
|
+
editor: Editor<HelmType>;
|
|
11
17
|
host: HTMLDivElement;
|
|
12
18
|
|
|
13
19
|
w = 200;
|
|
@@ -23,3 +29,27 @@ export class HelmWebEditor implements IHelmWebEditor {
|
|
|
23
29
|
}
|
|
24
30
|
}
|
|
25
31
|
|
|
32
|
+
export function buildWebEditorApp(view: HTMLDivElement): App {
|
|
33
|
+
org.helm.webeditor.MolViewer.molscale = 0.8;
|
|
34
|
+
const app = new org.helm.webeditor.App(view, {
|
|
35
|
+
showabout: false,
|
|
36
|
+
mexfontsize: '90%',
|
|
37
|
+
mexrnapinontab: true,
|
|
38
|
+
topmargin: 20,
|
|
39
|
+
mexmonomerstab: true,
|
|
40
|
+
sequenceviewonly: false,
|
|
41
|
+
mexfavoritefirst: true,
|
|
42
|
+
mexfilter: true
|
|
43
|
+
});
|
|
44
|
+
const sizes = app.calculateSizes();
|
|
45
|
+
app.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);
|
|
46
|
+
let s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};
|
|
47
|
+
scil.apply(app.sequence.style, s);
|
|
48
|
+
scil.apply(app.notation.style, s);
|
|
49
|
+
s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + app.toolbarheight) + 'px'};
|
|
50
|
+
scil.apply(app.properties.parent.style, s);
|
|
51
|
+
app.structureview.resize(sizes.rightwidth, sizes.bottomheight + app.toolbarheight);
|
|
52
|
+
app.mex.resize(sizes.topheight - 80);
|
|
53
|
+
|
|
54
|
+
return app;
|
|
55
|
+
}
|
package/src/package-test.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import * as DG from 'datagrok-api/dg';
|
|
2
2
|
import * as grok from 'datagrok-api/grok';
|
|
3
3
|
|
|
4
|
-
import
|
|
4
|
+
// Do not import anything from JsDrawLite or HelmWebEditor, only to the main Helm package
|
|
5
|
+
// import {JSDraw2ModuleType} from '@datagrok/js-draw-lite/src/types/jsdraw2';
|
|
6
|
+
// import {HelmType, OrgHelmModuleType} from '@datagrok/helm-web-editor/src/types/org-helm';
|
|
7
|
+
|
|
5
8
|
import {runTests, tests, TestContext} from '@datagrok-libraries/utils/src/test';
|
|
9
|
+
import {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
|
|
6
10
|
|
|
7
|
-
import './tests/helm-tests
|
|
11
|
+
import './tests/helm-tests';
|
|
8
12
|
import './tests/findMonomers-tests';
|
|
9
13
|
import './tests/helm-service-tests';
|
|
10
14
|
import './tests/renderers-tests';
|
|
@@ -12,11 +16,12 @@ import './tests/get-molfiles-tests';
|
|
|
12
16
|
import './tests/properties-widget-tests';
|
|
13
17
|
import './tests/get-all-parts-tests';
|
|
14
18
|
import './tests/get-monomer-tests';
|
|
19
|
+
import './tests/parse-helm-tests';
|
|
20
|
+
import './tests/helm-web-editor-tests';
|
|
15
21
|
|
|
16
22
|
export const _package = new DG.Package();
|
|
17
23
|
export {tests};
|
|
18
24
|
|
|
19
|
-
|
|
20
25
|
//name: test
|
|
21
26
|
//input: string category {optional: true}
|
|
22
27
|
//input: string test {optional: true}
|
package/src/package-utils.ts
CHANGED
|
@@ -2,19 +2,27 @@ import * as ui from 'datagrok-api/ui';
|
|
|
2
2
|
import * as grok from 'datagrok-api/grok';
|
|
3
3
|
import * as DG from 'datagrok-api/dg';
|
|
4
4
|
|
|
5
|
-
import
|
|
6
|
-
import * as scil from 'scil';
|
|
7
|
-
import * as JSDraw2 from 'JSDraw2';
|
|
8
|
-
import Atom = JSDraw2.Atom;
|
|
9
|
-
|
|
5
|
+
import {delay, timeout} from '@datagrok-libraries/utils/src/test';
|
|
10
6
|
import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
|
|
7
|
+
import type {
|
|
8
|
+
DojoType, DojoxType, IOrgHelmWebEditor, Monomers
|
|
9
|
+
} from '@datagrok-libraries/bio/src/helm/types';
|
|
11
10
|
import {HelmServiceBase} from '@datagrok-libraries/bio/src/viewers/helm-service';
|
|
12
|
-
import {IMonomerLib
|
|
13
|
-
import {ILogger} from '@datagrok-libraries/bio/src/utils/logger';
|
|
11
|
+
import {IMonomerLib} from '@datagrok-libraries/bio/src/types';
|
|
14
12
|
|
|
13
|
+
import {HelmHelper} from './helm-helper';
|
|
15
14
|
import {HelmService} from './utils/helm-service';
|
|
16
|
-
import {
|
|
15
|
+
import {OrgHelmModule, ScilModule} from './types';
|
|
16
|
+
|
|
17
|
+
import {_package} from './package';
|
|
18
|
+
|
|
19
|
+
declare const dojo: DojoType;
|
|
20
|
+
declare const dojox: DojoxType;
|
|
21
|
+
declare const scil: ScilModule;
|
|
22
|
+
declare const org: OrgHelmModule;
|
|
17
23
|
|
|
24
|
+
// eslint-disable-next-line
|
|
25
|
+
var dojoConfig = {async: true};
|
|
18
26
|
|
|
19
27
|
type HelmWindowType = Window & {
|
|
20
28
|
$helmService?: HelmServiceBase,
|
|
@@ -27,11 +35,42 @@ export function _getHelmService(): HelmServiceBase {
|
|
|
27
35
|
return res;
|
|
28
36
|
}
|
|
29
37
|
|
|
30
|
-
export function
|
|
38
|
+
export async function initHelmLoadAndPatchDojo(): Promise<void> {
|
|
39
|
+
const logPrefix = `Helm: _package.initHelmPatchDojo()`;
|
|
31
40
|
// patch window.dojox.gfx.svg.Text.prototype.getTextWidth hangs
|
|
32
41
|
/** get the text width in pixels */
|
|
33
42
|
// @ts-ignore
|
|
43
|
+
await timeout(async () => {
|
|
44
|
+
const dojoTargetList: { module: string, checker: () => boolean }[] = [
|
|
45
|
+
{module: 'dojo.ready', checker: () => !!dojo?.ready},
|
|
46
|
+
{module: 'dojo.window', checker: () => !!dojo?.window},
|
|
47
|
+
{module: 'dojo.io.script', checker: () => !!dojo?.io?.script},
|
|
48
|
+
// {module: 'dojo.request.iframe', checker: () => !!dojo?.request?.iframe},
|
|
49
|
+
{module: 'dojo.dom', checker: () => !!dojo?.dom},
|
|
50
|
+
{module: 'dojox.gfx', checker: () => !!dojox?.gfx},
|
|
51
|
+
{module: 'dojox.gfx.svg', checker: () => !!dojox?.gfx?.svg},
|
|
52
|
+
{module: 'dojox.gfx.shape', checker: () => !!dojox?.gfx?.shape},
|
|
53
|
+
];
|
|
54
|
+
for (const dojoTarget of dojoTargetList) {
|
|
55
|
+
try { dojo.require(dojoTarget.module); } catch (err: any) {
|
|
56
|
+
_package.logger.error(err.message);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const getDojoProgress = (): string[] => {
|
|
60
|
+
return dojoTargetList.filter((dt) => !dt.checker()).map((dt) => dt.module);
|
|
61
|
+
};
|
|
62
|
+
/** List of dojo modules not ready yet */ let dojoProgress: string[];
|
|
63
|
+
while ((dojoProgress = getDojoProgress()).length > 0) {
|
|
64
|
+
_package.logger.debug(`${logPrefix}, dojo loading ... ${dojoProgress.map((m) => `'${m}'`).join(',')} ...`);
|
|
65
|
+
await delay(100);
|
|
66
|
+
}
|
|
67
|
+
_package.logger.debug(`${logPrefix}, dojo ready all modules`);
|
|
68
|
+
}, 60000, 'timeout dojox.gfx.svg');
|
|
69
|
+
|
|
70
|
+
_package.logger.debug(`${logPrefix}, patch window.dojox.gfx.svg.Text.prototype.getTextWidth`);
|
|
71
|
+
// @ts-ignore
|
|
34
72
|
window.dojox.gfx.svg.Text.prototype.getTextWidth = function() {
|
|
73
|
+
// Patched via Datagrok Helm package
|
|
35
74
|
const rawNode = this.rawNode;
|
|
36
75
|
const oldParent = rawNode.parentNode;
|
|
37
76
|
const _measurementNode = rawNode.cloneNode(true);
|
|
@@ -57,6 +96,7 @@ export function initHelmPatchDojo(): void {
|
|
|
57
96
|
oldParent.removeChild(_measurementNode);
|
|
58
97
|
return _width;
|
|
59
98
|
};
|
|
99
|
+
_package.logger.debug(`${logPrefix}, end`);
|
|
60
100
|
}
|
|
61
101
|
|
|
62
102
|
export const helmJsonReplacer = (key: string, value: any): any => {
|
|
@@ -70,47 +110,34 @@ export const helmJsonReplacer = (key: string, value: any): any => {
|
|
|
70
110
|
};
|
|
71
111
|
|
|
72
112
|
export class HelmPackage extends DG.Package {
|
|
73
|
-
public getMonomerOriginal: GetMonomerFunc;
|
|
74
113
|
public alertOriginal: (s: string) => void;
|
|
114
|
+
public readonly hh: HelmHelper;
|
|
115
|
+
|
|
116
|
+
constructor() {
|
|
117
|
+
super();
|
|
118
|
+
this.hh = new HelmHelper(this.logger);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
public initHelmPatchScilAlert(): void {
|
|
122
|
+
const logPrefix: string = 'Helm: initHelmPatchScilAlert()';
|
|
123
|
+
this.alertOriginal = scil.Utils.alert;
|
|
124
|
+
scil.Utils.alert = (s: string): void => {
|
|
125
|
+
this.logger.warning(`${logPrefix}, scil.Utils.alert() s: "${s}".`);
|
|
126
|
+
};
|
|
127
|
+
}
|
|
75
128
|
|
|
76
129
|
/** Patches Pistoia Monomers.getMonomer method to utilize DG Bio monomer Lib */
|
|
77
|
-
public initHelmPatchPistoia(monomerLib: IMonomerLib
|
|
130
|
+
public async initHelmPatchPistoia(monomerLib: IMonomerLib): Promise<void> {
|
|
78
131
|
const logPrefix: string = 'Helm: initHelmPatchPistoia()';
|
|
79
132
|
const monomers = org.helm.webeditor.Monomers;
|
|
80
133
|
|
|
81
|
-
this.getMonomerOriginal = monomers.getMonomer.bind(monomers);
|
|
82
134
|
this.logger.debug(`${logPrefix}, this.getMonomerOriginal stored`);
|
|
83
135
|
|
|
84
|
-
this.
|
|
85
|
-
|
|
86
|
-
org.helm.webeditor.Monomers.getMonomer = (
|
|
87
|
-
a: Atom<HelmType> | HelmType, name: string
|
|
88
|
-
): GetMonomerResType => {
|
|
89
|
-
const logPrefixInt = `${logPrefix}, org.helm.webeditor.Monomers.getMonomer()`;
|
|
90
|
-
try {
|
|
91
|
-
// logger.debug(`${logPrefixInt}, a: ${JSON.stringify(a, helmJsonReplacer)}, name: '${name}'`);
|
|
92
|
-
|
|
93
|
-
// Creates monomers in lib
|
|
94
|
-
const dgWem = getWebEditorMonomer(monomerLib, a, name);
|
|
95
|
-
|
|
96
|
-
// // Returns null for gap
|
|
97
|
-
// const oWem = this.getMonomerOriginal(a, name);
|
|
98
|
-
// if (!oWem)
|
|
99
|
-
// logger.warning(`${logPrefixInt}, getMonomerOriginal( a: ${a}, name: ${name}) returns null`);
|
|
100
|
-
return dgWem; //dgWem;
|
|
101
|
-
} catch (err) {
|
|
102
|
-
const [errMsg, errStack] = errInfo(err);
|
|
103
|
-
logger.error(`${logPrefixInt}, Error: ${errMsg}`, undefined, errStack);
|
|
104
|
-
throw err;
|
|
105
|
-
}
|
|
106
|
-
};
|
|
107
|
-
scil.Utils.alert = (s: string): void => {
|
|
108
|
-
logger.warning(`${logPrefix}, scil.Utils.alert() s = 's'.`);
|
|
109
|
-
};
|
|
136
|
+
this.hh.overrideGetMonomer(this.hh.buildGetMonomerFromLib(monomerLib));
|
|
110
137
|
|
|
111
138
|
// @ts-ignore, intercept with proxy to observe access and usage
|
|
112
139
|
org.helm.webeditor.Monomers = new class {
|
|
113
|
-
constructor(base:
|
|
140
|
+
constructor(base: Monomers) {
|
|
114
141
|
return new Proxy(base, {
|
|
115
142
|
get(target: any, p: string | symbol, _receiver: any): any {
|
|
116
143
|
return target[p];
|
|
@@ -127,11 +154,11 @@ export class HelmPackage extends DG.Package {
|
|
|
127
154
|
},
|
|
128
155
|
});
|
|
129
156
|
}
|
|
130
|
-
}(org.helm.webeditor.Monomers) as
|
|
157
|
+
}(org.helm.webeditor.Monomers) as Monomers;
|
|
131
158
|
|
|
132
159
|
// @ts-ignore, intercept with proxy to observe access and usage
|
|
133
160
|
org.helm.webeditor = new class {
|
|
134
|
-
constructor(base:
|
|
161
|
+
constructor(base: IOrgHelmWebEditor) {
|
|
135
162
|
return new Proxy(base, {
|
|
136
163
|
get(target: any, p: string | symbol, _receiver: any): any {
|
|
137
164
|
return target[p];
|
|
@@ -145,6 +172,6 @@ export class HelmPackage extends DG.Package {
|
|
|
145
172
|
},
|
|
146
173
|
});
|
|
147
174
|
}
|
|
148
|
-
}(org.helm.webeditor) as
|
|
175
|
+
}(org.helm.webeditor) as IOrgHelmWebEditor;
|
|
149
176
|
}
|
|
150
177
|
}
|