@datagrok/helm 2.1.3 → 2.1.4
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/dist/package.js +102 -45
- package/package.json +3 -3
- package/src/cell-renderer.ts +43 -37
- package/src/package.ts +28 -12
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@datagrok/helm",
|
|
3
3
|
"friendlyName": "Helm",
|
|
4
|
-
"version": "2.1.
|
|
4
|
+
"version": "2.1.4",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Oleksandra Serhiienko",
|
|
7
7
|
"email": "oserhiienko@datagrok.ai"
|
|
8
8
|
},
|
|
9
9
|
"description": "",
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@datagrok-libraries/bio": "^5.
|
|
11
|
+
"@datagrok-libraries/bio": "^5.22.0",
|
|
12
12
|
"@datagrok-libraries/utils": "^1.19.1",
|
|
13
13
|
"cash-dom": "^8.1.1",
|
|
14
|
-
"datagrok-api": "^1.
|
|
14
|
+
"datagrok-api": "^1.10.2",
|
|
15
15
|
"dayjs": "^1.10.6",
|
|
16
16
|
"rxjs": "^6.5.5"
|
|
17
17
|
},
|
package/src/cell-renderer.ts
CHANGED
|
@@ -4,6 +4,7 @@ import * as DG from 'datagrok-api/dg';
|
|
|
4
4
|
|
|
5
5
|
import {findMonomers, parseHelm, getParts} from './utils';
|
|
6
6
|
import {printLeftOrCentered} from '@datagrok-libraries/bio/src/utils/cell-renderer';
|
|
7
|
+
import {errorToConsole} from '@datagrok-libraries/utils/src/to-console';
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
export class HelmCellRenderer extends DG.GridCellRenderer {
|
|
@@ -16,46 +17,51 @@ export class HelmCellRenderer extends DG.GridCellRenderer {
|
|
|
16
17
|
get defaultHeight(): number | null { return 100; }
|
|
17
18
|
|
|
18
19
|
onMouseMove(gridCell: DG.GridCell, e: MouseEvent): void {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
20
|
+
try {
|
|
21
|
+
const maxLengthWordsSum = gridCell.cell.column.temp['helm-sum-maxLengthWords'];
|
|
22
|
+
const maxIndex = Object.values(gridCell.cell.column.temp['helm-maxLengthWords']).length - 1;
|
|
23
|
+
const argsX = e.offsetX - gridCell.gridColumn.left + (gridCell.gridColumn.left - gridCell.bounds.x);
|
|
24
|
+
let left = 0;
|
|
25
|
+
let right = maxIndex;
|
|
26
|
+
let found = false;
|
|
27
|
+
maxLengthWordsSum[maxIndex + 1] = argsX + 1;
|
|
28
|
+
let mid = 0;
|
|
29
|
+
if (argsX > maxLengthWordsSum[0]) {
|
|
30
|
+
while (!found) {
|
|
31
|
+
mid = Math.floor((right + left) / 2);
|
|
32
|
+
if (argsX >= maxLengthWordsSum[mid] && argsX <= maxLengthWordsSum[mid + 1]) {
|
|
33
|
+
left = mid;
|
|
34
|
+
found = true;
|
|
35
|
+
} else if (argsX < maxLengthWordsSum[mid]) {
|
|
36
|
+
right = mid - 1;
|
|
37
|
+
} else if (argsX > maxLengthWordsSum[mid + 1]) {
|
|
38
|
+
left = mid + 1;
|
|
39
|
+
}
|
|
40
|
+
if (left == right) {
|
|
41
|
+
found = true;
|
|
42
|
+
}
|
|
40
43
|
}
|
|
41
44
|
}
|
|
45
|
+
left = (argsX >= maxLengthWordsSum[left]) ? left + 1 : left;
|
|
46
|
+
const monomers = findMonomers(gridCell.cell.value);
|
|
47
|
+
let s: string = gridCell.cell.value ?? '';
|
|
48
|
+
let subParts: string[] = parseHelm(s);
|
|
49
|
+
let allParts: string[] = getParts(subParts, s);
|
|
50
|
+
let tooltipMessage: HTMLElement[] = [];
|
|
51
|
+
for (let i = 0; i < allParts.length; ++i) {
|
|
52
|
+
if (monomers.has(allParts[i]))
|
|
53
|
+
tooltipMessage[i] = ui.divV([
|
|
54
|
+
ui.divText(`Monomer ${allParts[i]} not found.`),
|
|
55
|
+
ui.divText('Open the Context Panel, then expand Manage Libraries')
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
(((tooltipMessage[left]?.childNodes.length ?? 0) > 0))
|
|
59
|
+
? ui.tooltip.show(ui.div(tooltipMessage[left]), e.x + 16, e.y + 16)
|
|
60
|
+
: ui.tooltip.hide();
|
|
61
|
+
} catch (err: any) {
|
|
62
|
+
const errMsg: string = errorToConsole(err);
|
|
63
|
+
console.error('Helm: HelmCellRenderer.onMouseMove() error:\n' + errMsg);
|
|
42
64
|
}
|
|
43
|
-
left = (argsX >= maxLengthWordsSum[left]) ? left + 1 : left;
|
|
44
|
-
const monomers = findMonomers(gridCell.cell.value);
|
|
45
|
-
let s: string = gridCell.cell.value ?? '';
|
|
46
|
-
let subParts: string[] = parseHelm(s);
|
|
47
|
-
let allParts: string[] = getParts(subParts, s);
|
|
48
|
-
let tooltipMessage: HTMLElement[] = [];
|
|
49
|
-
for (let i = 0; i < allParts.length; ++i) {
|
|
50
|
-
if (monomers.has(allParts[i]))
|
|
51
|
-
tooltipMessage[i] = ui.divV([
|
|
52
|
-
ui.divText(`Monomer ${allParts[i]} not found.`),
|
|
53
|
-
ui.divText('Open the Context Panel, then expand Manage Libraries')
|
|
54
|
-
]);
|
|
55
|
-
}
|
|
56
|
-
(((tooltipMessage[left]?.childNodes.length ?? 0) > 0))
|
|
57
|
-
? ui.tooltip.show(ui.div(tooltipMessage[left]), e.x + 16, e.y + 16)
|
|
58
|
-
: ui.tooltip.hide();
|
|
59
65
|
}
|
|
60
66
|
|
|
61
67
|
render(g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number,
|
package/src/package.ts
CHANGED
|
@@ -8,7 +8,8 @@ import {HelmWebEditor} from './helm-web-editor';
|
|
|
8
8
|
import {HelmCellRenderer} from './cell-renderer';
|
|
9
9
|
import {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types';
|
|
10
10
|
import {NotationConverter} from '@datagrok-libraries/bio/src/utils/notation-converter';
|
|
11
|
-
import {
|
|
11
|
+
import {findMonomers} from './utils';
|
|
12
|
+
import {errorToConsole} from '@datagrok-libraries/utils/src/to-console';
|
|
12
13
|
|
|
13
14
|
export const _package = new DG.Package();
|
|
14
15
|
let monomerLib: IMonomerLib | null = null;
|
|
@@ -20,18 +21,32 @@ export async function initHelm(): Promise<void> {
|
|
|
20
21
|
dojo.ready(function() { resolve(null); });
|
|
21
22
|
}), await grok.functions.call('Bio:getBioLib')]).then(([_, lib]: [void, IMonomerLib]) => {
|
|
22
23
|
monomerLib = lib;
|
|
23
|
-
rewriteLibraries();
|
|
24
|
+
rewriteLibraries(); // initHelm()
|
|
24
25
|
monomerLib.onChanged.subscribe((_) => {
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
try {
|
|
27
|
+
rewriteLibraries(); // initHelm()
|
|
28
|
+
|
|
29
|
+
const monTypeList: string[] = monomerLib.getTypes();
|
|
30
|
+
const msgStr: string = 'Monomer lib updated:<br />' + (
|
|
31
|
+
monTypeList.length == 0 ? 'empty' : monTypeList.map((monType) => {
|
|
32
|
+
return `${monType} ${monomerLib.getMonomerNamesByType(monType).length}`;
|
|
33
|
+
}).join('<br />'));
|
|
34
|
+
|
|
35
|
+
grok.shell.info(msgStr);
|
|
36
|
+
} catch (err: any) {
|
|
37
|
+
const errMsg = errorToConsole(err);
|
|
38
|
+
console.error('Helm: initHelm monomerLib.onChanged() error:\n' + errMsg);
|
|
39
|
+
// throw err; // Prevent disabling event handler
|
|
40
|
+
}
|
|
41
|
+
});
|
|
27
42
|
});
|
|
28
43
|
}
|
|
29
44
|
|
|
30
45
|
function rewriteLibraries() {
|
|
31
46
|
org.helm.webeditor.Monomers.clear();
|
|
32
|
-
monomerLib.getTypes().forEach(type => {
|
|
47
|
+
monomerLib.getTypes().forEach((type) => {
|
|
33
48
|
const mms = monomerLib.getMonomerNamesByType(type);
|
|
34
|
-
mms.forEach(symbol => {
|
|
49
|
+
mms.forEach((symbol) => {
|
|
35
50
|
let isBroken = false;
|
|
36
51
|
const monomer: Monomer = monomerLib.getMonomer(type, symbol);
|
|
37
52
|
const webEditorMonomer: WebEditorMonomer = {
|
|
@@ -43,29 +58,30 @@ function rewriteLibraries() {
|
|
|
43
58
|
type: monomer.polymerType,
|
|
44
59
|
mt: monomer.monomerType,
|
|
45
60
|
at: {}
|
|
46
|
-
};
|
|
61
|
+
};
|
|
47
62
|
|
|
48
|
-
if(monomer.rgroups.length > 0) {
|
|
63
|
+
if (monomer.rgroups.length > 0) {
|
|
49
64
|
webEditorMonomer.rs = monomer.rgroups.length;
|
|
50
65
|
const at = {};
|
|
51
66
|
monomer.rgroups.forEach(it => {
|
|
52
67
|
at[it[RGROUP_LABEL]] = it[RGROUP_CAP_GROUP_NAME];
|
|
53
68
|
});
|
|
54
69
|
webEditorMonomer.at = at;
|
|
55
|
-
} else if (monomer.data[SMILES] != null){
|
|
70
|
+
} else if (monomer.data[SMILES] != null) {
|
|
56
71
|
webEditorMonomer.rs = Object.keys(getRS(monomer.data[SMILES].toString())).length;
|
|
57
72
|
webEditorMonomer.at = getRS(monomer.data[SMILES].toString());
|
|
58
|
-
} else
|
|
73
|
+
} else {
|
|
59
74
|
isBroken = true;
|
|
75
|
+
}
|
|
60
76
|
|
|
61
|
-
if(!isBroken)
|
|
77
|
+
if (!isBroken)
|
|
62
78
|
org.helm.webeditor.Monomers.addOneMonomer(webEditorMonomer);
|
|
63
79
|
});
|
|
64
80
|
});
|
|
65
81
|
|
|
66
82
|
// Obsolete
|
|
67
83
|
let grid: DG.Grid = grok.shell.tv.grid;
|
|
68
|
-
grid.invalidate();
|
|
84
|
+
if (grid) grid.invalidate();
|
|
69
85
|
}
|
|
70
86
|
|
|
71
87
|
//name: helmCellRenderer
|