@datagrok/helm 2.2.1 → 2.3.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.
Files changed (44) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/package-test.js +1 -1
  3. package/dist/package-test.js.map +1 -1
  4. package/dist/package.js +1 -1
  5. package/dist/package.js.map +1 -1
  6. package/files/tests/helm2-bracket.csv +2 -0
  7. package/package.json +13 -10
  8. package/src/cell-renderer.ts +8 -33
  9. package/src/helm-helper.ts +67 -17
  10. package/src/helm-monomer-placer.ts +7 -9
  11. package/src/helm-web-editor.ts +33 -3
  12. package/src/package-test.ts +8 -3
  13. package/src/package-utils.ts +69 -42
  14. package/src/package.ts +121 -141
  15. package/src/tests/findMonomers-tests.ts +2 -0
  16. package/src/tests/get-all-parts-tests.ts +5 -0
  17. package/src/tests/get-molfiles-tests.ts +3 -1
  18. package/src/tests/get-monomer-tests.ts +88 -19
  19. package/src/tests/helm-service-tests.ts +4 -0
  20. package/src/tests/helm-tests.ts +7 -1
  21. package/src/tests/helm-web-editor-tests.ts +55 -0
  22. package/src/tests/parse-helm-tests.ts +98 -0
  23. package/src/tests/properties-widget-tests.ts +33 -4
  24. package/src/tests/renderers-tests.ts +3 -1
  25. package/src/tests/utils.ts +6 -0
  26. package/src/types/index.ts +5 -0
  27. package/src/utils/get-hovered.ts +3 -4
  28. package/src/utils/{dummy-monomer.ts → get-monomer-dummy.ts} +10 -45
  29. package/src/utils/get-monomer-of-library.ts +90 -0
  30. package/src/utils/get-monomer.ts +23 -21
  31. package/src/utils/helm-grid-cell-renderer.ts +19 -3
  32. package/src/utils/helm-service.ts +6 -5
  33. package/src/utils/index.ts +11 -17
  34. package/src/widgets/properties-widget.ts +29 -9
  35. package/tsconfig.json +1 -1
  36. package/vendor/helm-web-editor.development.js +39640 -0
  37. package/vendor/helm-web-editor.production.js +2 -0
  38. package/vendor/helm-web-editor.production.js.map +1 -0
  39. package/webpack.config.js +15 -12
  40. package/helm/JSDraw/Pistoia.HELM.js +0 -27
  41. package/helm/JSDraw/Scilligence.JSDraw2.Lite.js +0 -12
  42. package/helm/JSDraw/Scilligence.JSDraw2.Resources.js +0 -762
  43. package/helm/JSDraw/dojo.js +0 -250
  44. package/helm/JSDraw/test.html +0 -24
@@ -0,0 +1,2 @@
1
+ id,helm
2
+ 1,PEPTIDE1{A'2'}$$$$V2.0
package/package.json CHANGED
@@ -1,31 +1,34 @@
1
1
  {
2
2
  "name": "@datagrok/helm",
3
3
  "friendlyName": "Helm",
4
- "version": "2.2.1",
4
+ "version": "2.3.1",
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
+ "sources-backup": [
11
+ "helm/JSDraw/Scilligence.JSDraw2.Lite-uncompressed.js",
12
+ "helm/JSDraw/Pistoia.HELM-uncompressed.js"
13
+ ],
10
14
  "sources": [
11
- "css/helm.css",
12
- "https://ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js",
13
- "helm/JSDraw/Scilligence.JSDraw2.Lite.js",
14
- "helm/JSDraw/Scilligence.JSDraw2.Resources.js",
15
- "helm/JSDraw/Pistoia.HELM.js"
15
+ "https://ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js.uncompressed.js",
16
+ "css/helm.css"
16
17
  ],
17
18
  "dependencies": {
18
- "@datagrok-libraries/bio": "^5.41.2",
19
+ "@datagrok-libraries/bio": "^5.42.3",
19
20
  "@datagrok-libraries/chem-meta": "^1.2.5",
20
- "@datagrok-libraries/utils": "^4.2.2",
21
+ "@datagrok-libraries/utils": "^4.2.11",
21
22
  "cash-dom": "^8.1.1",
22
- "datagrok-api": "^1.17.4",
23
+ "datagrok-api": "^1.18.6",
23
24
  "dayjs": "^1.10.6",
24
25
  "rxjs": "^6.5.5",
25
26
  "wu": "latest"
26
27
  },
27
28
  "devDependencies": {
28
- "@datagrok/bio": "^2.12.18",
29
+ "@datagrok-libraries/helm-web-editor": "^1.1.5",
30
+ "@datagrok-libraries/js-draw-lite": "^0.0.3",
31
+ "@datagrok/bio": "^2.13.3",
29
32
  "@datagrok/chem": "^1.9.2",
30
33
  "@types/node": "17.0.45",
31
34
  "@types/wu": "latest",
@@ -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: JSDraw2.IEditorMol | null = helmPlacer.getEditorMol(gridCell.tableRowIndex!);
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
- if (!grid) {
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
  }
@@ -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 * as scil from 'scil';
6
- import * as org from 'org';
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
- type HelmHelperWindowType = Window & {
14
- $helmHelper?: HelmHelper,
15
- }
16
- declare const window: HelmHelperWindowType;
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): org.helm.IWebEditorApp {
39
+ createWebEditorApp(host: HTMLDivElement, helm: string): App {
24
40
  org.helm.webeditor.MolViewer.molscale = 0.8;
25
- const webEditorApp: org.helm.IWebEditorApp = new org.helm.webeditor.App(host, {
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
- // -- Instance singleton --
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
- public static async getInstance(): Promise<IHelmHelper> {
53
- let res: HelmHelper = window.$helmHelper!;
54
- if (!res) {
55
- // create & init singleton
56
- window.$helmHelper = res = new HelmHelper();
57
- // await res.init();
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 {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types/index';
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: org.helm.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: (JSDraw2.IEditorMol | null)[];
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<JSDraw2.IEditorMol | null>(this.tableCol.length).fill(null);
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: JSDraw2.IEditorMol) {
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): JSDraw2.IEditorMol | null {
89
+ public getEditorMol(tableRowIndex: number): Mol<HelmType> | null {
92
90
  return this._editorMolList![tableRowIndex];
93
91
  }
94
92
  }
@@ -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 * as JSDraw2 from 'JSDraw2';
5
+ import {
6
+ App, Editor, HelmType, IHelmWebEditor
7
+ } from '@datagrok-libraries/bio/src/helm/types';
6
8
 
7
- import {IHelmWebEditor} from '@datagrok-libraries/bio/src/helm/types';
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: JSDraw2.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
+ }
@@ -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 '@datagrok-libraries/bio/src/types/helm';
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.ts';
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}
@@ -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 * as org from 'org';
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, HelmType} from '@datagrok-libraries/bio/src/types';
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 {GetMonomerFunc, GetMonomerResType, getWebEditorMonomer} from './utils/get-monomer';
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 initHelmPatchDojo(): void {
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, logger: ILogger): void {
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.alertOriginal = scil.Utils.alert;
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: org.helm.IMonomers) {
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 org.helm.IMonomers;
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: org.helm.IOrgHelmWebEditor) {
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 org.helm.IOrgHelmWebEditor;
175
+ }(org.helm.webeditor) as IOrgHelmWebEditor;
149
176
  }
150
177
  }