@datagrok/helm 2.5.0 → 2.5.3

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 (39) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/455.js +2 -0
  3. package/dist/455.js.map +1 -0
  4. package/dist/package-dojo.js +2 -0
  5. package/dist/package-dojo.js.map +1 -0
  6. package/dist/package-test.js +1 -1
  7. package/dist/package-test.js.map +1 -1
  8. package/dist/package.js +1 -1
  9. package/dist/package.js.map +1 -1
  10. package/files/tests/peptide.csv +14 -0
  11. package/helm/dojo/package.ts +41 -0
  12. package/helm/dojo/types.ts +12 -0
  13. package/package.json +7 -6
  14. package/src/helm-helper.ts +78 -7
  15. package/src/helm-monomer-placer.ts +6 -0
  16. package/src/package-test.ts +7 -1
  17. package/src/package-utils.ts +42 -23
  18. package/src/package.ts +35 -8
  19. package/src/tests/findMonomers-tests.ts +2 -3
  20. package/src/tests/get-molfiles-tests.ts +3 -3
  21. package/src/tests/get-monomer-tests.ts +15 -35
  22. package/src/tests/helm-helper-tests.ts +85 -0
  23. package/src/tests/helm-input-tests.ts +2 -4
  24. package/src/tests/helm-service-tests.ts +2 -6
  25. package/src/tests/helm-web-editor-tests.ts +3 -4
  26. package/src/tests/parse-helm-tests.ts +4 -8
  27. package/src/tests/properties-widget-tests.ts +2 -5
  28. package/src/tests/renderers-tests.ts +2 -3
  29. package/src/utils/get-hovered.ts +20 -7
  30. package/src/utils/get-monomer.ts +1 -75
  31. package/src/utils/helm-grid-cell-renderer.ts +27 -6
  32. package/src/widgets/helm-input.ts +4 -4
  33. package/vendor/dojo-1.10.10/dijit/_base.js.uncompressed.js +27 -0
  34. package/vendor/dojo-1.10.10/dojox/gfx/_base.js +253 -0
  35. package/vendor/dojo-1.10.10/dojox/gfx/_base.js.uncompressed.js +1024 -0
  36. package/webpack.config.js +7 -0
  37. package/src/cell-renderer.ts +0 -162
  38. package/src/utils/get-monomer-dummy.ts +0 -149
  39. package/src/utils/get-monomer-of-library.ts +0 -90
@@ -0,0 +1,85 @@
1
+ import * as grok from 'datagrok-api/grok';
2
+ import * as ui from 'datagrok-api/ui';
3
+ import * as DG from 'datagrok-api/dg';
4
+
5
+ import {after, before, category, delay, expect, expectArray, test, testEvent} from '@datagrok-libraries/utils/src/test';
6
+ import {HelmNotSupportedError, HelmNotSupportedErrorType, IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
7
+ import {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
8
+
9
+ import {_package} from '../package-test';
10
+
11
+ type TestSrcType = { helm: string };
12
+ type TestTgtType = { helm: string | null, map: [number, number][] };
13
+
14
+ category('HelmHelper: removeGaps', () => {
15
+ let helmHelper: IHelmHelper;
16
+
17
+ before(async () => {
18
+ helmHelper = await getHelmHelper();
19
+ });
20
+
21
+ const tests: { [testName: string]: { src: TestSrcType, tgt: TestTgtType } } = {
22
+ 'single-linear-start': {
23
+ src: {helm: 'PEPTIDE1{*.[meY].A.G.T}$$$$V2.0'},
24
+ tgt: {
25
+ helm: 'PEPTIDE1{[meY].A.G.T}$$$$V2.0',
26
+ map: [[1, 0], [2, 1], [3, 2], [4, 3]],
27
+ }
28
+ },
29
+ 'single-linear-end': {
30
+ src: {helm: 'PEPTIDE1{[meY].A.G.T.*}$$$$V2.0'},
31
+ tgt: {
32
+ helm: 'PEPTIDE1{[meY].A.G.T}$$$$V2.0',
33
+ map: [[0, 0], [1, 1], [2, 2], [3, 3]],
34
+ }
35
+ },
36
+ 'single-linear-middle': {
37
+ src: {helm: 'PEPTIDE1{[meY].A.*.G.T}$$$$V2.0'},
38
+ tgt: {
39
+ helm: 'PEPTIDE1{[meY].A.G.T}$$$$V2.0',
40
+ map: [[0, 0], [1, 1], [3, 2], [4, 3]],
41
+ }
42
+ },
43
+ 'single-cycle-start': {
44
+ src: {helm: 'PEPTIDE1{*.[meY].C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,3:R3-7:R3$$$V2.0'},
45
+ tgt: {
46
+ helm: 'PEPTIDE1{[meY].C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-6:R3$$$V2.0',
47
+ map: [[1, 0], [2, 1], [3, 2], [4, 3], [5, 4], [6, 5], [7, 6]],
48
+ }
49
+ },
50
+ 'single-cycle-end': {
51
+ src: {helm: 'PEPTIDE1{[meY].C.R.N.P.C.T.*}$PEPTIDE1,PEPTIDE1,2:R3-6:R3$$$V2.0'},
52
+ tgt: {
53
+ helm: 'PEPTIDE1{[meY].C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-6:R3$$$V2.0',
54
+ map: [[0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]],
55
+ }
56
+ },
57
+ 'single-cycle-middle': {
58
+ src: {helm: 'PEPTIDE1{[meY].C.R.N.*.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-7:R3$$$V2.0'},
59
+ tgt: {
60
+ helm: 'PEPTIDE1{[meY].C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-6:R3$$$V2.0',
61
+ map: [[0, 0], [1, 1], [2, 2], [3, 3], [5, 4], [6, 5], [7, 6]],
62
+ }
63
+ },
64
+ 'single-cycle-gap-at-connection': {
65
+ src: {helm: 'PEPTIDE1{[meY].*.C.R.N.P.C.T}$PEPTIDE1,PEPTIDE1,2:R3-7:R3$$$V2.0'},
66
+ tgt: {helm: null, map: []}
67
+ }
68
+ };
69
+
70
+ for (const [testName, testData] of Object.entries(tests)) {
71
+ test(`${testName}`, async () => {
72
+ let resErr: HelmNotSupportedError | null = null;
73
+ try {
74
+ const res = helmHelper.removeGaps(testData.src.helm);
75
+ expect(res.resHelm, testData.tgt.helm);
76
+ expectArray(Array.from(res.monomerMap!.entries()), testData.tgt.map);
77
+ } catch (err: any) {
78
+ resErr = err;
79
+ }
80
+
81
+ expect(resErr?.type == HelmNotSupportedErrorType, testData.tgt.helm === null,
82
+ 'HelmNotSupportedError thrown expected');
83
+ });
84
+ }
85
+ });
@@ -8,7 +8,7 @@ import {after, before, category, delay, expect, test, testEvent} from '@datagrok
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 {
11
- getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
11
+ getUserLibSettings, setUserLibSettings,
12
12
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
13
13
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
14
14
 
@@ -28,9 +28,7 @@ category('HelmInput', () => {
28
28
  userLibSettings = await getUserLibSettings();
29
29
 
30
30
  // Test 'helm' requires default monomer library loaded
31
- await setUserLibSettingsForTests();
32
- await monomerLibHelper.awaitLoaded();
33
- await monomerLibHelper.loadMonomerLib(true); // load default libraries
31
+ await monomerLibHelper.loadMonomerLibForTests(); // load default libraries
34
32
  });
35
33
 
36
34
  after(async () => {
@@ -16,7 +16,7 @@ import {RenderTask} from '@datagrok-libraries/bio/src/utils/cell-renderer-async-
16
16
  import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
17
17
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
18
18
  import {
19
- getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
19
+ getUserLibSettings, setUserLibSettings,
20
20
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
21
21
 
22
22
  import {initHelmMainPackage} from './utils';
@@ -38,11 +38,7 @@ category('HelmService', () => {
38
38
  monomerLibHelper = await getMonomerLibHelper();
39
39
  userLibSettings = await getUserLibSettings();
40
40
 
41
- await delay(1000); // for loading monomer libraries files
42
- // Test 'helm' requires default monomer library loaded
43
- await setUserLibSettingsForTests();
44
- await monomerLibHelper.loadMonomerLib(true); // load default libraries
45
- const libSummary = monomerLibHelper.getMonomerLib().getSummaryObj();
41
+ await monomerLibHelper.loadMonomerLibForTests(); // load default libraries
46
42
 
47
43
  helmSvc = await getHelmService();
48
44
  await helmSvc.reset();
@@ -7,7 +7,7 @@ import {IHelmHelper, getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-
7
7
  import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
8
8
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
9
9
  import {
10
- getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
10
+ getUserLibSettings, setUserLibSettings
11
11
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
12
12
 
13
13
  import {initHelmMainPackage} from './utils';
@@ -22,9 +22,8 @@ category('helm-web-editor', async () => {
22
22
  await initHelmMainPackage();
23
23
  monomerLibHelper = await getMonomerLibHelper();
24
24
  userLibSettings = await getUserLibSettings();
25
- await setUserLibSettingsForTests();
26
- await monomerLibHelper.awaitLoaded();
27
- await monomerLibHelper.loadMonomerLib(true);
25
+
26
+ await monomerLibHelper.loadMonomerLibForTests();
28
27
 
29
28
  hh = await getHelmHelper();
30
29
  });
@@ -8,7 +8,7 @@ import {HelmType, IHelmDrawOptions, Mol, OrgType} from '@datagrok-libraries/bio/
8
8
  import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
9
9
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
10
10
  import {
11
- getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
11
+ getUserLibSettings, setUserLibSettings
12
12
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
13
13
 
14
14
  import {JSDraw2Module} from '../types';
@@ -28,7 +28,7 @@ category('parseHelm', () => {
28
28
  helm: 'PEPTIDE1{[L-hArg(Et,Et)].E.F.G}|PEPTIDE2{C.E}$PEPTIDE1,PEPTIDE2,2:R3-1:R1$$$V2.0'
29
29
  }
30
30
  },
31
- 'PT-cycic': {
31
+ 'PT-cyclic': {
32
32
  src: 'PEPTIDE1{[meI].C.[Aca].[Cys_SEt].T.C.[Thr_PO3H2].[Aca]}$PEPTIDE1,PEPTIDE1,8:R2-1:R1$$$V2.0',
33
33
  tgt: {
34
34
  atomCount: 8, bondCount: 8,
@@ -54,10 +54,7 @@ category('parseHelm', () => {
54
54
  'get user lib settings for backup');
55
55
 
56
56
  // parseHelm is dependent on monomers RGroups available, test requires default monomer library
57
- await setUserLibSettingsForTests();
58
- await timeout(async () => { await libHelper.awaitLoaded(); }, 5000,
59
- 'await monomerLib to be loaded');
60
- await libHelper.loadMonomerLib(true);
57
+ await libHelper.loadMonomerLibForTests();
61
58
  });
62
59
 
63
60
  after(async () => {
@@ -74,7 +71,7 @@ category('parseHelm', () => {
74
71
  for (const [testName, {src, tgt}] of Object.entries(testData)) {
75
72
  test(`woDOM-${testName}`, async () => {
76
73
  _testParseHelmWithoutDOM(src, tgt);
77
- });
74
+ }, testName == 'RNA' ? {skipReason: 'GROK-16721'} : undefined);
78
75
  }
79
76
  });
80
77
 
@@ -103,7 +100,6 @@ function _testParseHelmWithoutDOM(src: string, tgt: TestTgtType): void {
103
100
  io.parseHelm(plugin, src, origin, undefined);
104
101
 
105
102
  const m: Mol<HelmType> = plugin.jsd.m;
106
- debugger;
107
103
  const resHelm = io.getHelm(m);
108
104
  expect(m.atoms.length, tgt.atomCount);
109
105
  expect(m.bonds.length, tgt.bondCount);
@@ -6,7 +6,7 @@ import {after, before, category, expect, expectObject, test, timeout} from '@dat
6
6
  import {ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';
7
7
  import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
8
8
  import {
9
- getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
9
+ getUserLibSettings, setUserLibSettings
10
10
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
11
11
  import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
12
12
  import {generateLongSequence} from '@datagrok-libraries/bio/src/utils/generator';
@@ -82,10 +82,7 @@ category('properties-widget', () => {
82
82
  monomerLibHelper = await getMonomerLibHelper();
83
83
  userLibSettings = getUserLibSettings();
84
84
 
85
- await setUserLibSettingsForTests();
86
- await timeout(async () => { await monomerLibHelper.awaitLoaded(); },
87
- 5000, 'MonomerLibHelper.awaitLoaded() timeout');
88
- await monomerLibHelper.loadMonomerLib(true); // load default libraries
85
+ await monomerLibHelper.loadMonomerLibForTests(); // load default libraries
89
86
  });
90
87
 
91
88
  after(async () => {
@@ -12,7 +12,7 @@ import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
12
12
  import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
13
13
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
14
14
  import {
15
- getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
15
+ getUserLibSettings, setUserLibSettings
16
16
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
17
17
 
18
18
  import {awaitGrid, initHelmMainPackage} from './utils';
@@ -32,8 +32,7 @@ category('renderers', () => {
32
32
  userLibSettings = await getUserLibSettings();
33
33
 
34
34
  // Test 'helm' requires default monomer library loaded
35
- await setUserLibSettingsForTests();
36
- await monomerLibHelper.loadMonomerLib(true); // load default libraries
35
+ await monomerLibHelper.loadMonomerLibForTests(); // load default libraries
37
36
  });
38
37
 
39
38
  after(async () => {
@@ -6,6 +6,9 @@ import {HelmType, PolymerType, Atom, Mol, ISeqMonomer, HelmMol, HelmAtom} from '
6
6
 
7
7
  import {helmTypeToPolymerType} from '@datagrok-libraries/bio/src/monomer-works/monomer-works';
8
8
 
9
+ import {HelmTypes} from '@datagrok-libraries/bio/src/helm/consts';
10
+ import {GAP_SYMBOL, GapOriginals, NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule/consts';
11
+
9
12
  import {HelmMonomerPlacer} from '../helm-monomer-placer';
10
13
 
11
14
  export function getHoveredMonomerFromEditorMol(
@@ -77,23 +80,33 @@ export function getHoveredMonomerFallback(
77
80
  }
78
81
  left = (argsX >= sumLengths[left]) ? left : left - 1; // correct left to between sumLengths
79
82
  if (left >= 0)
80
- hoveredSeqMonomer = getSeqMonomerFromHelm(allParts[0], allParts[left]);
83
+ hoveredSeqMonomer = getSeqMonomerFromHelm(left, allParts[left], allParts[0]);
81
84
  return hoveredSeqMonomer;
82
85
  }
83
86
 
84
87
  export function getSeqMonomerFromHelmAtom(atom: HelmAtom): ISeqMonomer {
85
88
  const polymerType = helmTypeToPolymerType(atom.bio!.type);
86
- return {symbol: atom.elem, polymerType: polymerType};
89
+ const canonicalSymbol = atom.elem === GapOriginals[NOTATION.HELM] ? GAP_SYMBOL : atom.elem;
90
+ return {position: parseInt(atom.bio!.continuousId as string) - 1, symbol: atom.elem, biotype: atom.bio!.type};
87
91
  }
88
92
 
89
- function getSeqMonomerFromHelm(
90
- helmPrefix: string, symbol: string
91
- ): ISeqMonomer {
93
+ /** Linear
94
+ * @deprecated
95
+ */
96
+ function getSeqMonomerFromHelm(pos: number, symbol: string, helmPrefix: string): ISeqMonomer {
92
97
  let resSeqMonomer: ISeqMonomer | undefined = undefined;
93
98
  const polymerTypeList: PolymerType[] = ['RNA', 'PEPTIDE', 'CHEM', 'BLOB', 'G'];
94
99
  for (const polymerType of polymerTypeList) {
95
- if (helmPrefix.startsWith(polymerType))
96
- resSeqMonomer = {symbol: symbol, polymerType: polymerType};
100
+ if (helmPrefix.startsWith(polymerType)) {
101
+ let helmType: HelmType = HelmTypes.AA;
102
+ if (polymerType == 'RNA')
103
+ helmType = HelmTypes.NUCLEOTIDE;
104
+ else if (polymerType == 'PEPTIDE')
105
+ helmType = HelmTypes.AA;
106
+ else if (polymerType == 'CHEM')
107
+ helmType = HelmTypes.CHEM;
108
+ resSeqMonomer = {position: pos, symbol: symbol, biotype: helmType};
109
+ }
97
110
  }
98
111
  if (!resSeqMonomer)
99
112
  throw new Error(`Monomer not found for symbol = '${symbol}' and helmPrefix = '${helmPrefix}'.`);
@@ -5,14 +5,7 @@ import * as DG from 'datagrok-api/dg';
5
5
  import {ILogger} from '@datagrok-libraries/bio/src/utils/logger';
6
6
  import {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types';
7
7
  import {Atom, HelmType, IWebEditorMonomer, GetMonomerResType} from '@datagrok-libraries/bio/src/helm/types';
8
- import {helmTypeToPolymerType} from '@datagrok-libraries/bio/src/monomer-works/monomer-works';
9
- import {
10
- HELM_REQUIRED_FIELD as REQ
11
- } from '@datagrok-libraries/bio/src/utils/const';
12
- import {HelmTypes} from '@datagrok-libraries/bio/src/helm/consts';
13
8
 
14
- import {AmbiguousWebEditorMonomer, GapWebEditorMonomer, getRS, MissingWebEditorMonomer} from './get-monomer-dummy';
15
- import {LibraryWebEditorMonomer} from './get-monomer-of-library';
16
9
  import {OrgHelmModule, ScilModule} from '../types';
17
10
  import {RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from '../constants';
18
11
 
@@ -21,10 +14,6 @@ import {_package} from '../package';
21
14
  declare const org: OrgHelmModule;
22
15
  declare const scil: ScilModule;
23
16
 
24
- const monomerRe = /[\w()]+/;
25
- //** Do not mess with monomer symbol with parenthesis enclosed in square brackets */
26
- const ambMonomerRe = RegExp(String.raw`\(${monomerRe}(,${monomerRe})+\)`);
27
-
28
17
  type GetMonomerOverridingFunc = (
29
18
  a: Atom<HelmType> | HelmType, name: string | undefined, monomerLib: IMonomerLib,
30
19
  originalGetMonomer: (a: Atom<HelmType> | HelmType, name: string) => GetMonomerResType) => GetMonomerResType;
@@ -52,69 +41,6 @@ export function getMonomerOverrideAndLogAlert(
52
41
  }
53
42
  }
54
43
 
55
- /** Inputs logic */
56
- export function getMonomerHandleArgs(
57
- a: Atom<HelmType> | HelmType, name?: string
58
- ): [/** biotype */ HelmType, /** elem */ string] {
59
- if (!a)
60
- throw new Error(`Argument 'a' of type Atom or HelmType is mandatory.`);
61
- let biotype: HelmType;
62
- let elem: string;
63
- if ((a as Atom<HelmType>).T === 'ATOM') {
64
- biotype = (a as Atom<HelmType>).biotype()!;
65
- elem = (a as Atom<HelmType>).elem;
66
- } else {
67
- biotype = a as HelmType;
68
- elem = org.helm.webeditor.IO.trimBracket(name!);
69
- }
70
- return [biotype, elem];
71
- }
72
-
73
-
74
- /** Substitutes {@link org.helm.webeditor.Monomers.getMonomer()} */
75
- export function getWebEditorMonomer(
76
- monomerLib: IMonomerLib,
77
- a: Atom<HelmType> | HelmType, argName?: string,
78
- ): IWebEditorMonomer | null {
79
- const [biotype, elem] = getMonomerHandleArgs(a, argName);
80
- const pt = helmTypeToPolymerType(biotype);
81
-
82
- /** Get or create {@link Monomer} object (in case it is missing in monomer library current config) */
83
- let m: Monomer | null = monomerLib.getMonomer(pt, elem);
84
- if (m && biotype == HelmTypes.LINKER && m[REQ.RGROUPS].length != 2) {
85
- // Web Editor expects null
86
- return null;
87
- }
88
- if (m && biotype == HelmTypes.SUGAR && m[REQ.RGROUPS].length != 3) {
89
- // Web Editor expects null
90
- return null;
91
- }
92
- if (!m /* && biotype != HelmTypes.LINKER*/)
93
- m = monomerLib.addMissingMonomer(pt, elem);
94
-
95
- /** Get or create {@link org,helm.WebEditorMonomer} */
96
- let resWem: IWebEditorMonomer | null = m.wem ?? null;
97
- if (!resWem) {
98
- if (elem === '*')
99
- resWem = m.wem = new GapWebEditorMonomer(biotype, elem);
100
- else if (
101
- (biotype === 'HELM_NUCLETIDE' && elem === 'N') ||
102
- (biotype === 'HELM_AA' && elem === 'X') ||
103
- (biotype === 'HELM_CHEM' && false) || // TODO: Ambiguous monomer for CHEM
104
- ambMonomerRe.test(elem) // e.g. (A,R,_)
105
- )
106
- resWem = m.wem = new AmbiguousWebEditorMonomer(biotype, elem);
107
- else if (!m.lib)
108
- resWem = m.wem = new MissingWebEditorMonomer(biotype, elem);
109
-
110
-
111
- if (!resWem)
112
- resWem = m.wem = LibraryWebEditorMonomer.fromMonomer(biotype, m);
113
- }
114
-
115
- return resWem;
116
- }
117
-
118
44
  /** Fills org.helm.webeditor.Monomers dictionary for WebEditor */
119
45
  export function rewriteLibraries(monomerLib: IMonomerLib): void {
120
46
  org.helm.webeditor.Monomers.clear();
@@ -145,7 +71,7 @@ export function rewriteLibraries(monomerLib: IMonomerLib): void {
145
71
  } else if (monomer[SMILES] != null) {
146
72
  // @ts-ignore
147
73
  webEditorMonomer.rs = Object.keys(getRS(monomer[SMILES].toString())).length;
148
- webEditorMonomer.at = getRS(monomer[SMILES].toString());
74
+ webEditorMonomer.at = monomerLib.getRS(monomer[SMILES].toString());
149
75
  } else
150
76
  isBroken = true;
151
77
 
@@ -12,8 +12,9 @@ import {HelmAux, HelmProps} from '@datagrok-libraries/bio/src/viewers/helm-servi
12
12
  import {_getHelmService} from '../package-utils';
13
13
  import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
14
14
  import {ILogger} from '@datagrok-libraries/bio/src/utils/logger';
15
- import {getGridCellRendererBack} from '@datagrok-libraries/bio/src/utils/cell-renderer-back-base';
15
+ import {getGridCellColTemp} from '@datagrok-libraries/bio/src/utils/cell-renderer-back-base';
16
16
  import {IMonomerLib} from '@datagrok-libraries/bio/src/types/index';
17
+ import {execMonomerHoverLinks} from '@datagrok-libraries/bio/src/monomer-works/monomer-hover';
17
18
 
18
19
  import {getHoveredMonomerFromEditorMol, getSeqMonomerFromHelmAtom} from './get-hovered';
19
20
 
@@ -129,16 +130,23 @@ export class HelmGridCellRendererBack extends CellRendererBackAsyncBase<HelmProp
129
130
  }
130
131
  const hoveredAtom = getHoveredMonomerFromEditorMol(argsX, argsY, editorMol, gridCell.bounds.height);
131
132
 
133
+ let seqMonomer: ISeqMonomer | null = null;
132
134
  if (hoveredAtom) {
133
- const seqMonomer = getSeqMonomerFromHelmAtom(hoveredAtom);
135
+ seqMonomer = getSeqMonomerFromHelmAtom(hoveredAtom);
134
136
  const monomerLib = _package.monomerLib;
135
- const tooltipEl = monomerLib ? monomerLib.getTooltip(seqMonomer.polymerType, seqMonomer.symbol) :
137
+ const tooltipEl = monomerLib ? monomerLib.getTooltip(seqMonomer.biotype, seqMonomer.symbol) :
136
138
  ui.divText('Monomer library is not available');
137
139
  ui.tooltip.show(tooltipEl, e.x + 16, e.y + 16);
138
140
  } else {
139
141
  // Tooltip for missing monomers
140
142
  ui.tooltip.hide();
141
143
  }
144
+
145
+ execMonomerHoverLinks(gridCell, seqMonomer);
146
+ }
147
+
148
+ onMouseLeave(gridCell: DG.GridCell, e: MouseEvent): void {
149
+ execMonomerHoverLinks(gridCell, null);
142
150
  }
143
151
 
144
152
  public override render(g: CanvasRenderingContext2D,
@@ -161,10 +169,10 @@ export class HelmGridCellRendererBack extends CellRendererBackAsyncBase<HelmProp
161
169
 
162
170
  static getOrCreate(gridCell: DG.GridCell): HelmGridCellRendererBack {
163
171
  const [gridCol, tableCol, temp] =
164
- getGridCellRendererBack<string, HelmGridCellRendererBack>(gridCell);
172
+ getGridCellColTemp<string, HelmGridCellRendererBack>(gridCell);
165
173
 
166
- let res: HelmGridCellRendererBack = temp['rendererBack'];
167
- if (!res) res = temp['rendererBack'] = new HelmGridCellRendererBack(gridCol, tableCol);
174
+ let res: HelmGridCellRendererBack = temp.rendererBack;
175
+ if (!res) res = temp.rendererBack = new HelmGridCellRendererBack(gridCol, tableCol);
168
176
  return res;
169
177
  }
170
178
  }
@@ -191,6 +199,19 @@ export class HelmGridCellRenderer extends DG.GridCellRenderer {
191
199
  }
192
200
  }
193
201
 
202
+ override onMouseLeave(gridCell: DG.GridCell, e: MouseEvent) {
203
+ const logPrefix = `Helm: HelmGridCellRenderer.onMouseLeave()`;
204
+ try {
205
+ HelmGridCellRendererBack.getOrCreate(gridCell).onMouseLeave(gridCell, e);
206
+ } catch (err: any) {
207
+ const [errMsg, errStack] = errInfo(err);
208
+ _package.logger.error(errMsg, undefined, errStack);
209
+ } finally {
210
+ e.preventDefault();
211
+ e.stopPropagation();
212
+ }
213
+ }
214
+
194
215
  override render(
195
216
  g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number,
196
217
  gridCell: DG.GridCell, cellStyle: DG.GridCellStyle
@@ -5,7 +5,7 @@ import * as DG from 'datagrok-api/dg';
5
5
  import $ from 'cash-dom';
6
6
  import {fromEvent, Observable, Unsubscribable} from 'rxjs';
7
7
 
8
- import {IMonomerLib} from '@datagrok-libraries/bio/src/types/index';
8
+ import {IMonomerLibBase} from '@datagrok-libraries/bio/src/types/index';
9
9
  import {HelmInputBase, IHelmHelper, IHelmInputInitOptions} from '@datagrok-libraries/bio/src/helm/helm-helper';
10
10
  import {HelmAtom, HelmMol, HelmString, IHelmWebEditor} from '@datagrok-libraries/bio/src/helm/types';
11
11
 
@@ -72,7 +72,7 @@ export class HelmInput extends HelmInputBase {
72
72
 
73
73
  protected constructor(
74
74
  private readonly helmHelper: IHelmHelper,
75
- private readonly monomerLib: IMonomerLib,
75
+ private readonly monomerLib: IMonomerLibBase,
76
76
  name?: string,
77
77
  public readonly options?: IHelmInputInitOptions,
78
78
  private readonly logger = _package.logger,
@@ -135,7 +135,7 @@ export class HelmInput extends HelmInputBase {
135
135
  }
136
136
 
137
137
  /** Inspired by {@link DG.MarkdownInput}, {@link ui._create} */
138
- static create(helmHelper: IHelmHelper, monomerLib: IMonomerLib,
138
+ static create(helmHelper: IHelmHelper, monomerLib: IMonomerLibBase,
139
139
  name?: string, options?: IHelmInputInitOptions
140
140
  ): HelmInput {
141
141
  const input = new HelmInput(helmHelper, monomerLib, name, options);
@@ -183,7 +183,7 @@ export class HelmInput extends HelmInputBase {
183
183
  if (hoveredAtom) {
184
184
  const seqMonomer = getSeqMonomerFromHelmAtom(hoveredAtom);
185
185
  const monomerLib = _package.monomerLib;
186
- const tooltipEl = monomerLib ? monomerLib.getTooltip(seqMonomer.polymerType, seqMonomer.symbol) :
186
+ const tooltipEl = monomerLib ? monomerLib.getTooltip(seqMonomer.biotype, seqMonomer.symbol) :
187
187
  ui.divText('Monomer library is not available');
188
188
  this.showTooltip(tooltipEl, hoveredAtom);
189
189
  event.preventDefault();
@@ -0,0 +1,27 @@
1
+ define("dijit/_base", [
2
+ "./main",
3
+ "./a11y", // used to be in dijit/_base/manager
4
+ "./WidgetSet", // used to be in dijit/_base/manager
5
+ "./_base/focus",
6
+ "./_base/manager",
7
+ "./_base/place",
8
+ "./_base/popup",
9
+ "./_base/scroll",
10
+ "./_base/sniff",
11
+ "./_base/typematic",
12
+ "./_base/wai",
13
+ "./_base/window"
14
+ ], function(dijit){
15
+
16
+ // module:
17
+ // dijit/_base
18
+
19
+ /*=====
20
+ return {
21
+ // summary:
22
+ // Includes all the modules in dijit/_base
23
+ };
24
+ =====*/
25
+
26
+ return dijit._base;
27
+ });