@datagrok/bio 2.12.22 → 2.13.2

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.
@@ -452,12 +452,12 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
452
452
  private static viewerCounter: number = -1;
453
453
  private readonly viewerId: number = ++WebLogoViewer.viewerCounter;
454
454
 
455
- private viewerToLog(): string { return `WebLogoViewer<${this.viewerId}>`; }
455
+ private toLog(): string { return `WebLogoViewer<${this.viewerId}>`; }
456
456
 
457
457
  // -- Data --
458
458
 
459
459
  setData(): void {
460
- const logPrefix = `${this.viewerToLog()}.setData()`;
460
+ const logPrefix = `${this.toLog()}.setData()`;
461
461
  _package.logger.debug(`${logPrefix}, in`);
462
462
  this.viewSyncer.sync(`${logPrefix}`, async () => { // setData
463
463
  if (!this.setDataInProgress) this.setDataInProgress = true; else return; // check setDataInProgress synced
@@ -493,18 +493,18 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
493
493
  this.viewSubs = [];
494
494
 
495
495
  const dataFrameTxt = `${this.dataFrame ? 'data' : 'null'}`;
496
- _package.logger.debug(`Bio: WebLogoViewer<${this.viewerId}>.destroyView( dataFrame = ${dataFrameTxt} ) start`);
496
+ _package.logger.debug(`${this.toLog()}.destroyView( dataFrame = ${dataFrameTxt} ) start`);
497
497
 
498
498
  this.host!.remove();
499
499
  this.msgHost = undefined;
500
500
  this.host = undefined;
501
501
 
502
- _package.logger.debug(`Bio: WebLogoViewer<${this.viewerId}>.destroyView() end`);
502
+ _package.logger.debug(`${this.toLog()}.destroyView() end`);
503
503
  }
504
504
 
505
505
  private async buildView(): Promise<void> {
506
506
  const dataFrameTxt: string = this.dataFrame ? 'data' : 'null';
507
- _package.logger.debug(`Bio: WebLogoViewer<${this.viewerId}>.buildView( dataFrame = ${dataFrameTxt} ) start`);
507
+ _package.logger.debug(`${this.toLog()}.buildView( dataFrame = ${dataFrameTxt} ) start`);
508
508
  const dpr = window.devicePixelRatio;
509
509
  this.viewSubs.push(DG.debounce(this.renderRequest, Debounces.render)
510
510
  .subscribe(this.renderRequestOnDebounce.bind(this)));
@@ -559,14 +559,20 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
559
559
  fromEvent<WheelEvent>(this.canvas, 'wheel').subscribe(this.canvasOnWheel.bind(this)));
560
560
 
561
561
  this.render(WlRenderLevel.Freqs, 'buildView');
562
- _package.logger.debug(`Bio: WebLogoViewer<${this.viewerId}>.buildView() end`);
562
+ _package.logger.debug(`${this.toLog()}.buildView() end`);
563
563
  }
564
564
 
565
- /** Handler of changing size WebLogo */
566
- private rootOnSizeChanged(): void {
567
- _package.logger.debug(`Bio: WebLogoViewer<${this.viewerId}>.rootOnSizeChanged(), start `);
565
+ private lastSize: { width: number, height: number } = {width: -1, height: -1};
568
566
 
569
- this.render(WlRenderLevel.Layout, 'rootOnSizeChanged');
567
+ /** Handler of changing size WebLogo */
568
+ private rootOnSizeChanged(value: ResizeObserverEntry): void {
569
+ const size = {width: value.target.clientWidth, height: value.target.clientHeight};
570
+ if (this.lastSize.width != size.width || this.lastSize.height != size.height) {
571
+ _package.logger.debug(
572
+ `${this.toLog()}.rootOnSizeChanged(), ${JSON.stringify(size)}, start `);
573
+ this.render(WlRenderLevel.Layout, 'rootOnSizeChanged');
574
+ }
575
+ this.lastSize = size;
570
576
  }
571
577
 
572
578
  private updateEditors(): void {
@@ -853,7 +859,7 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
853
859
 
854
860
  /** Add filter handlers when table is a attached */
855
861
  public override onTableAttached() {
856
- _package.logger.debug(`Bio: WebLogoViewer<${this.viewerId}>.onTableAttached(), `);
862
+ _package.logger.debug(`${this.toLog()}.onTableAttached(), `);
857
863
 
858
864
  super.onTableAttached();
859
865
  this.setData();
@@ -861,7 +867,7 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
861
867
 
862
868
  /** Remove all handlers when table is a detach */
863
869
  public override detach() {
864
- const logPrefix = `${this.viewerToLog()}.detach()`;
870
+ const logPrefix = `${this.toLog()}.detach()`;
865
871
  _package.logger.debug(`${logPrefix}, in`);
866
872
 
867
873
  const superDetach = super.detach.bind(this);
@@ -933,7 +939,7 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
933
939
 
934
940
  /** Renders requested repeatedly will be performed once on window.requestAnimationFrame() */
935
941
  render(renderLevel: WlRenderLevel, reason: string): void {
936
- _package.logger.debug(`Bio: WebLogoViewer<${this.viewerId}>` +
942
+ _package.logger.debug(`${this.toLog()}` +
937
943
  `.render( recalcLevelVal=${renderLevel}, reason='${reason}' )`);
938
944
  this.requestedRenderLevel = Math.max(this.requestedRenderLevel, renderLevel);
939
945
  this.renderRequest.next(this.requestedRenderLevel);
@@ -943,12 +949,12 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
943
949
  *@param {WlRenderLevel} renderLevel - indicates that need to recalculate data for rendering
944
950
  */
945
951
  protected async renderInt(renderLevel: WlRenderLevel): Promise<void> {
946
- _package.logger.debug(`Bio: WebLogoViewer<${this.viewerId}>.render.renderInt( renderLevel=${renderLevel} ), ` +
952
+ _package.logger.debug(`${this.toLog()}.render.renderInt( renderLevel=${renderLevel} ), ` +
947
953
  `start `);
948
954
 
949
955
  /** Calculate freqs of monomers */
950
956
  const calculateFreqsInt = (): void => {
951
- _package.logger.debug(`Bio: WebLogoViewer<${this.viewerId}>.render.calculateFreqsInt(), start `);
957
+ _package.logger.debug(`${this.toLog()}.render.calculateFreqsInt(), start `);
952
958
  if (!this.host || !this.seqCol || !this.dataFrame) return;
953
959
 
954
960
  // region updatePositions
@@ -1050,7 +1056,7 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
1050
1056
 
1051
1057
  /** Calculate layout of monomers on screen (canvas) based on freqs, required to handle mouse events */
1052
1058
  const calculateLayoutInt = (firstPos: number, lastPos: number, dpr: number, positionLabelsHeight: number): void => {
1053
- _package.logger.debug(`Bio: WebLogoViewer<${this.viewerId}>.render.calculateLayoutInt(), start `);
1059
+ _package.logger.debug(`${this.toLog()}.render.calculateLayoutInt(), start `);
1054
1060
 
1055
1061
  const absoluteMaxHeight: number = this.canvas.height - positionLabelsHeight * dpr;
1056
1062
  let alphabetSizeLog: number;
@@ -1066,7 +1072,7 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
1066
1072
 
1067
1073
  for (let jPos = firstPos; jPos <= lastPos; ++jPos) {
1068
1074
  if (!(jPos in this.positions)) {
1069
- _package.logger.warning(`Bio: WebLogoViewer<${this.viewerId}>.render.calculateLayoutInt() ` +
1075
+ _package.logger.warning(`${this.toLog()}.render.calculateLayoutInt() ` +
1070
1076
  `this.positions.length = ${this.positions.length}, jPos = ${jPos}`);
1071
1077
  continue;
1072
1078
  }
@@ -1074,7 +1080,7 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
1074
1080
  jPos, this.slider.min, absoluteMaxHeight, this.positionHeight,
1075
1081
  alphabetSizeLog, this._positionWidthWithMargin, this._positionWidth, dpr, positionLabelsHeight);
1076
1082
  }
1077
- _package.logger.debug(`Bio: WebLogoViewer<${this.viewerId}>.render.calculateLayoutInt(), end `);
1083
+ _package.logger.debug(`${this.toLog()}.render.calculateLayoutInt(), end `);
1078
1084
  this._onLayoutCalculated.next();
1079
1085
  };
1080
1086
 
@@ -1132,11 +1138,11 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
1132
1138
  g.restore();
1133
1139
  }
1134
1140
 
1135
- _package.logger.debug(`Bio: WebLogoViewer<${this.viewerId}>.render.renderInt( recalcLevel=${renderLevel} ), end`);
1141
+ _package.logger.debug(`${this.toLog()}.render.renderInt( recalcLevel=${renderLevel} ), end`);
1136
1142
  }
1137
1143
 
1138
1144
  private renderRequestOnDebounce(renderLevel: WlRenderLevel): void {
1139
- const logPrefix = `${this.viewerToLog()}.renderRequestOnDebounce()`;
1145
+ const logPrefix = `${this.toLog()}.renderRequestOnDebounce()`;
1140
1146
  if ($(this.root).offsetParent().get()[0]?.tagName === 'HTML') {
1141
1147
  _package.logger.warning(`${logPrefix}, $(this.root).offsetParent() is the 'HTML' tag.`);
1142
1148
  return;
@@ -1167,35 +1173,35 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
1167
1173
  maxRange: this.slider.maxRange
1168
1174
  };
1169
1175
  _package.logger.debug(
1170
- `Bio: WebLogoViewer<${this.viewerId}>.sliderOnValuesChanged( ${JSON.stringify(val)} ), start`);
1176
+ `${this.toLog()}.sliderOnValuesChanged( ${JSON.stringify(val)} ), start`);
1171
1177
  this.render(WlRenderLevel.Layout, 'sliderOnValuesChanged');
1172
1178
  } catch (err: any) {
1173
1179
  const errMsg = errorToConsole(err);
1174
- _package.logger.error(`Bio: WebLogoViewer<${this.viewerId}>.sliderOnValuesChanged() error:\n` + errMsg);
1180
+ _package.logger.error(`${this.toLog()}.sliderOnValuesChanged() error:\n` + errMsg);
1175
1181
  //throw err; // Do not throw to prevent disabling event handler
1176
1182
  }
1177
1183
  }
1178
1184
 
1179
1185
  private dataFrameFilterOnChanged(_value: any): void {
1180
- _package.logger.debug(`Bio: WebLogoViewer<${this.viewerId}>.dataFrameFilterChanged()`);
1186
+ _package.logger.debug(`${this.toLog()}.dataFrameFilterChanged()`);
1181
1187
  try {
1182
1188
  if (this.filterSource === FilterSources.Filtered)
1183
1189
  this.render(WlRenderLevel.Freqs, 'dataFrameFilterOnChanged');
1184
1190
  } catch (err: any) {
1185
1191
  const errMsg = errorToConsole(err);
1186
- _package.logger.error(`Bio: WebLogoViewer<${this.viewerId}>.dataFrameFilterOnChanged() error:\n` + errMsg);
1192
+ _package.logger.error(`${this.toLog()}.dataFrameFilterOnChanged() error:\n` + errMsg);
1187
1193
  //throw err; // Do not throw to prevent disabling event handler
1188
1194
  }
1189
1195
  }
1190
1196
 
1191
1197
  private dataFrameSelectionOnChanged(_value: any): void {
1192
- _package.logger.debug(`Bio: WebLogoViewer<${this.viewerId}>.dataFrameSelectionOnChanged()`);
1198
+ _package.logger.debug(`${this.toLog()}.dataFrameSelectionOnChanged()`);
1193
1199
  try {
1194
1200
  if (this.filterSource === FilterSources.Selected)
1195
1201
  this.render(WlRenderLevel.Freqs, 'dataFrameSelectionOnChanged');
1196
1202
  } catch (err: any) {
1197
1203
  const errMsg = errorToConsole(err);
1198
- _package.logger.error(`Bio: WebLogoViewer<${this.viewerId}>.dataFrameSelectionOnChanged() error:\n` + errMsg);
1204
+ _package.logger.error(`${this.toLog()}.dataFrameSelectionOnChanged() error:\n` + errMsg);
1199
1205
  //throw err; // Do not throw to prevent disabling event handler
1200
1206
  }
1201
1207
  }
@@ -1236,7 +1242,7 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
1236
1242
  ui.tooltip.hide();
1237
1243
  } catch (err: any) {
1238
1244
  const errMsg = errorToConsole(err);
1239
- _package.logger.error(`Bio: WebLogoViewer<${this.viewerId}>.canvasOnMouseMove() error:\n` + errMsg);
1245
+ _package.logger.error(`${this.toLog()}.canvasOnMouseMove() error:\n` + errMsg);
1240
1246
  //throw err; // Do not throw to prevent disabling event handler
1241
1247
  }
1242
1248
  }
@@ -1257,7 +1263,7 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
1257
1263
  }
1258
1264
  } catch (err: any) {
1259
1265
  const errMsg = errorToConsole(err);
1260
- _package.logger.error(`Bio: WebLogoViewer<${this.viewerId}>.canvasOnMouseDown() error:\n` + errMsg);
1266
+ _package.logger.error(`${this.toLog()}.canvasOnMouseDown() error:\n` + errMsg);
1261
1267
  //throw err; // Do not throw to prevent disabling event handler
1262
1268
  }
1263
1269
  }
@@ -1271,7 +1277,7 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
1271
1277
  this.slider.scrollBy(this.slider.min + countOfScrollPositions);
1272
1278
  } catch (err: any) {
1273
1279
  const errMsg = errorToConsole(err);
1274
- _package.logger.error(`Bio: WebLogoViewer<${this.viewerId}>.canvasOnWheel() error:\n` + errMsg);
1280
+ _package.logger.error(`${this.toLog()}.canvasOnWheel() error:\n` + errMsg);
1275
1281
  //throw err; // Do not throw to prevent disabling event handler
1276
1282
  }
1277
1283
  }
@@ -1284,7 +1290,7 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
1284
1290
 
1285
1291
  invalidate(caller?: string): void {
1286
1292
  const callLog = `invalidate(${caller ? ` <- ${caller} ` : ''})`;
1287
- const logPrefix = `${this.viewerToLog()}.${callLog}`;
1293
+ const logPrefix = `${this.toLog()}.${callLog}`;
1288
1294
  // Put the event trigger in the tail of the synced calls queue.
1289
1295
  this.render(WlRenderLevel.None, callLog); // Put render request to the syncer
1290
1296
  this.viewSyncer.sync(`${logPrefix}`, async () => {
@@ -2,11 +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 org from 'org';
6
5
  import $ from 'cash-dom';
7
6
  import {fromEvent, Unsubscribable} from 'rxjs';
8
7
 
9
- import {IHelmWebEditor} from '@datagrok-libraries/bio/src/helm/types';
8
+ import {App, IHelmWebEditor} from '@datagrok-libraries/bio/src/helm/types';
10
9
  import {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
11
10
  import {ILogger} from '@datagrok-libraries/bio/src/utils/logger';
12
11
  import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
@@ -55,7 +54,7 @@ export class HelmBioFilter extends BioFilterBase<BioFilterProps> /* implements I
55
54
  this.logger.warning('TEST: HelmBioFilter.init().sync() waitForElementInDom ready');
56
55
  this.updateFilterPanel();
57
56
  let webEditorHost: HTMLDivElement | null;
58
- let webEditorApp: org.helm.IWebEditorApp | null;
57
+ let webEditorApp: App | null;
59
58
  // TODO: Unsubscribe 'click' and 'sizeChanged'
60
59
  this.viewSubs.push(fromEvent(this._filterPanel, 'click').subscribe(() => {
61
60
  webEditorHost = ui.div();
@@ -1,6 +1,8 @@
1
- import * as grok from 'datagrok-api/grok';
2
1
  import * as ui from 'datagrok-api/ui';
3
2
  import * as DG from 'datagrok-api/dg';
3
+
4
+ import {MonomerWidthMode} from '../utils/cell-renderer-consts';
5
+
4
6
  import {_package} from '../package';
5
7
 
6
8
  export class PackageSettingsEditorWidget extends DG.Widget {
@@ -20,6 +22,13 @@ export class PackageSettingsEditorWidget extends DG.Widget {
20
22
  }
21
23
 
22
24
  async init(): Promise<void> {
25
+ const monomerWidthModeInput = ui.choiceInput('Monomer width mode',
26
+ _package.properties.MonomerWidthMode,
27
+ [MonomerWidthMode.short, MonomerWidthMode.long],
28
+ (value: MonomerWidthMode) => {
29
+ _package.properties.MonomerWidthMode = value;
30
+ });
31
+
23
32
  const maxMonomerLengthInput = ui.intInput('Max monomer length',
24
33
  _package.properties.MaxMonomerLength,
25
34
  (value: number) => {
@@ -40,6 +49,7 @@ export class PackageSettingsEditorWidget extends DG.Widget {
40
49
  });
41
50
 
42
51
  this.root.appendChild(ui.form([
52
+ monomerWidthModeInput,
43
53
  maxMonomerLengthInput,
44
54
  tooltipWebLogoInput,
45
55
  defaultSeparatorInput,
@@ -25,29 +25,41 @@ export function getMacromoleculeColumnPropertyPanel(col: DG.Column): DG.Widget {
25
25
  const columnsSet = new Set(columnsList);
26
26
  columnsSet.delete(col.name);
27
27
 
28
- const monomerWidth = ui.choiceInput('Monomer width',
29
- (col?.temp[tempTAGS.monomerWidth] != null) ? col.temp[tempTAGS.monomerWidth] : MonomerWidthMode.short,
30
- [MonomerWidthMode.short, MonomerWidthMode.long],
31
- (s: string) => {
32
- col.temp[tempTAGS.monomerWidth] = s;
28
+ const monomerWidthModeInput = ui.input.choice('Monomer width', {
29
+ value: (col?.temp[tempTAGS.monomerWidthMode] != null) ? col.temp[tempTAGS.monomerWidthMode] :
30
+ (_package.properties?.MonomerWidthMode ?? MonomerWidthMode.short),
31
+ items: [MonomerWidthMode.short, MonomerWidthMode.long],
32
+ onValueChanged: () => {
33
+ const s = monomerWidthModeInput.value;
34
+ col.temp[tempTAGS.monomerWidthMode] = s;
33
35
  col.setTag(mmcrTags.RendererSettingsChanged, rendererSettingsChangedState.true);
34
36
  col.dataFrame.fireValuesChanged();
35
- });
36
- monomerWidth.setTooltip(
37
- `In short mode, only the 'Max monomer length' characters are displayed, followed by .. if there are more`,
38
- );
37
+
38
+ maxMonomerLengthInput.enabled = monomerWidthModeInput.value === MonomerWidthMode.short;
39
+ },
40
+ });
41
+ monomerWidthModeInput.setTooltip(
42
+ `In short mode, only the 'Max monomer length' characters are displayed, followed by .. if there are more`);
39
43
 
40
44
  const tagMaxMonomerLength: number = parseInt(col.getTag(mmcrTAGS.maxMonomerLength));
41
- const maxMonomerLength: DG.InputBase = ui.intInput('Max monomer length',
42
- !isNaN(tagMaxMonomerLength) ? tagMaxMonomerLength : _package.properties.MaxMonomerLength,
43
- (value: number) => {
45
+ const maxMonomerLengthInput = ui.input.slider('Max monomer length', {
46
+ value: !isNaN(tagMaxMonomerLength) ? tagMaxMonomerLength :
47
+ (_package.properties?.MaxMonomerLength ?? 4),
48
+ min: 1, max: 16, step: 1,
49
+ onValueChanged: () => {
50
+ const value = maxMonomerLengthInput.value;
51
+ maxMonomerLengthValueDiv.innerText = maxMonomerLengthInput.stringValue;
44
52
  col.setTag(mmcrTAGS.maxMonomerLength, value.toString());
45
53
  col.setTag(mmcrTags.RendererSettingsChanged, rendererSettingsChangedState.true);
46
54
  col.dataFrame.fireValuesChanged();
47
- });
48
- maxMonomerLength.setTooltip(
49
- `The max length of monomer name displayed without shortening in '${MonomerWidthMode.short}' monomer width mode.`
50
- );
55
+ },
56
+ });
57
+ const maxMonomerLengthValueDiv = ui.divText(maxMonomerLengthInput.stringValue, 'ui-input-description');
58
+ maxMonomerLengthInput.addOptions(maxMonomerLengthValueDiv);
59
+ maxMonomerLengthInput.setTooltip(
60
+ `The max length of monomer name displayed without shortening ` +
61
+ ` in '${MonomerWidthMode.short}' monomer width mode.`);
62
+ maxMonomerLengthInput.enabled = monomerWidthModeInput.value === MonomerWidthMode.short;
51
63
 
52
64
  const gapLengthInput = ui.intInput('Monomer margin', col.temp[mmcrTemps.gapLength] ?? 0,
53
65
  (value: number) => {
@@ -82,8 +94,8 @@ export function getMacromoleculeColumnPropertyPanel(col: DG.Column): DG.Widget {
82
94
  compareWithCurrent.setTooltip('When on, all sequences get rendered in the "diff" mode');
83
95
 
84
96
  const rdKitInputs = ui.inputs([
85
- monomerWidth,
86
- maxMonomerLength,
97
+ monomerWidthModeInput,
98
+ maxMonomerLengthInput,
87
99
  gapLengthInput,
88
100
  referenceSequence,
89
101
  colorCode,
package/webpack.config.js CHANGED
@@ -3,14 +3,11 @@ const FuncGeneratorPlugin = require('datagrok-tools/plugins/func-gen-plugin');
3
3
  const packageName = path.parse(require('./package.json').name).name.toLowerCase().replace(/-/g, '');
4
4
 
5
5
  const mode = process.env.NODE_ENV ?? 'production';
6
- if (mode !== 'production') {
6
+ if (mode !== 'production')
7
7
  console.warn(`Building Bio in '${mode}' mode.`);
8
- }
9
8
 
10
9
  module.exports = {
11
- cache: {
12
- type: 'filesystem',
13
- },
10
+ ...(mode === 'production' ? {cache: {type: 'filesystem'}} : {}),
14
11
  mode: mode,
15
12
  entry: {
16
13
  package: ['./src/package.ts'],
@@ -45,9 +42,6 @@ module.exports = {
45
42
  'cash-dom': '$',
46
43
  'dayjs': 'dayjs',
47
44
  'wu': 'wu',
48
- 'scil': 'scil',
49
- 'org': 'org',
50
- // 'JSDraw2': 'JSDraw2',
51
45
  },
52
46
  output: {
53
47
  filename: '[name].js',
@@ -1 +0,0 @@
1
- code,monomer1,monomer2,modification1,modification2,R1,R2