@jbrowse/plugin-alignments 1.6.7 → 1.7.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.
Files changed (94) hide show
  1. package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +216 -0
  2. package/dist/AlignmentsFeatureDetail/index.js +63 -0
  3. package/dist/AlignmentsFeatureDetail/index.test.js +60 -0
  4. package/dist/AlignmentsTrack/index.js +37 -0
  5. package/dist/BamAdapter/BamAdapter.js +598 -0
  6. package/dist/BamAdapter/BamAdapter.test.js +177 -0
  7. package/dist/BamAdapter/BamSlightlyLazyFeature.d.ts +1 -10
  8. package/dist/BamAdapter/BamSlightlyLazyFeature.js +176 -0
  9. package/dist/BamAdapter/MismatchParser.d.ts +3 -5
  10. package/dist/BamAdapter/MismatchParser.js +384 -0
  11. package/dist/BamAdapter/MismatchParser.test.js +259 -0
  12. package/dist/BamAdapter/configSchema.js +48 -0
  13. package/dist/BamAdapter/index.js +36 -0
  14. package/dist/CramAdapter/CramAdapter.js +660 -0
  15. package/dist/CramAdapter/CramAdapter.test.js +138 -0
  16. package/dist/CramAdapter/CramSlightlyLazyFeature.d.ts +1 -2
  17. package/dist/CramAdapter/CramSlightlyLazyFeature.js +447 -0
  18. package/dist/CramAdapter/CramTestAdapters.js +234 -0
  19. package/dist/CramAdapter/configSchema.js +40 -0
  20. package/dist/CramAdapter/index.js +36 -0
  21. package/dist/HtsgetBamAdapter/HtsgetBamAdapter.js +97 -0
  22. package/dist/HtsgetBamAdapter/configSchema.js +31 -0
  23. package/dist/HtsgetBamAdapter/index.js +42 -0
  24. package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +69 -0
  25. package/dist/LinearAlignmentsDisplay/index.js +31 -0
  26. package/dist/LinearAlignmentsDisplay/models/configSchema.js +25 -0
  27. package/dist/LinearAlignmentsDisplay/models/configSchema.test.js +83 -0
  28. package/dist/LinearAlignmentsDisplay/models/model.js +250 -0
  29. package/dist/LinearPileupDisplay/components/ColorByModifications.js +123 -0
  30. package/dist/LinearPileupDisplay/components/ColorByTag.js +98 -0
  31. package/dist/LinearPileupDisplay/components/FilterByTag.js +203 -0
  32. package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +32 -0
  33. package/dist/LinearPileupDisplay/components/SetFeatureHeight.js +99 -0
  34. package/dist/LinearPileupDisplay/components/SetMaxHeight.js +90 -0
  35. package/dist/LinearPileupDisplay/components/SortByTag.js +95 -0
  36. package/dist/LinearPileupDisplay/configSchema.js +47 -0
  37. package/dist/LinearPileupDisplay/configSchema.test.js +92 -0
  38. package/dist/LinearPileupDisplay/index.js +30 -0
  39. package/dist/LinearPileupDisplay/model.js +602 -0
  40. package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +63 -0
  41. package/dist/LinearSNPCoverageDisplay/index.js +30 -0
  42. package/dist/LinearSNPCoverageDisplay/models/configSchema.js +57 -0
  43. package/dist/LinearSNPCoverageDisplay/models/configSchema.test.js +62 -0
  44. package/dist/LinearSNPCoverageDisplay/models/model.d.ts +2 -2
  45. package/dist/LinearSNPCoverageDisplay/models/model.js +237 -0
  46. package/dist/NestedFrequencyTable.js +152 -0
  47. package/dist/PileupRPC/rpcMethods.js +285 -0
  48. package/dist/PileupRenderer/PileupLayoutSession.js +79 -0
  49. package/dist/PileupRenderer/PileupRenderer.d.ts +20 -6
  50. package/dist/PileupRenderer/PileupRenderer.js +1220 -0
  51. package/dist/PileupRenderer/components/PileupRendering.js +270 -0
  52. package/dist/PileupRenderer/components/PileupRendering.test.js +36 -0
  53. package/dist/PileupRenderer/configSchema.js +72 -0
  54. package/dist/PileupRenderer/index.js +25 -0
  55. package/dist/PileupRenderer/sortUtil.js +112 -0
  56. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.d.ts +3 -11
  57. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js +606 -0
  58. package/dist/SNPCoverageAdapter/configSchema.js +22 -0
  59. package/dist/SNPCoverageAdapter/index.js +45 -0
  60. package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js +296 -0
  61. package/dist/SNPCoverageRenderer/configSchema.js +40 -0
  62. package/dist/SNPCoverageRenderer/index.js +34 -0
  63. package/dist/declare.d.js +1 -0
  64. package/dist/index.js +154 -6
  65. package/dist/index.test.js +26 -0
  66. package/dist/plugin-alignments.cjs.development.js +591 -552
  67. package/dist/plugin-alignments.cjs.development.js.map +1 -1
  68. package/dist/plugin-alignments.cjs.production.min.js +1 -1
  69. package/dist/plugin-alignments.cjs.production.min.js.map +1 -1
  70. package/dist/plugin-alignments.esm.js +594 -555
  71. package/dist/plugin-alignments.esm.js.map +1 -1
  72. package/dist/shared.js +96 -0
  73. package/dist/util.d.ts +4 -0
  74. package/dist/util.js +135 -0
  75. package/package.json +5 -9
  76. package/src/BamAdapter/BamAdapter.ts +45 -15
  77. package/src/BamAdapter/BamSlightlyLazyFeature.ts +11 -79
  78. package/src/BamAdapter/MismatchParser.test.ts +53 -297
  79. package/src/BamAdapter/MismatchParser.ts +54 -116
  80. package/src/BamAdapter/configSchema.ts +0 -4
  81. package/src/CramAdapter/CramAdapter.ts +42 -15
  82. package/src/CramAdapter/CramSlightlyLazyFeature.ts +3 -10
  83. package/src/LinearPileupDisplay/components/ColorByModifications.tsx +76 -80
  84. package/src/LinearPileupDisplay/components/ColorByTag.tsx +24 -23
  85. package/src/LinearPileupDisplay/components/FilterByTag.tsx +73 -68
  86. package/src/LinearPileupDisplay/components/SetFeatureHeight.tsx +28 -26
  87. package/src/LinearPileupDisplay/components/SetMaxHeight.tsx +24 -13
  88. package/src/LinearPileupDisplay/components/SortByTag.tsx +29 -21
  89. package/src/LinearPileupDisplay/model.ts +8 -22
  90. package/src/LinearSNPCoverageDisplay/models/model.ts +6 -36
  91. package/src/PileupRenderer/PileupRenderer.tsx +178 -60
  92. package/src/SNPCoverageAdapter/SNPCoverageAdapter.ts +189 -244
  93. package/src/SNPCoverageRenderer/SNPCoverageRenderer.ts +12 -11
  94. package/src/util.ts +25 -0
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _react = _interopRequireDefault(require("react"));
15
+
16
+ var _mobxReact = require("mobx-react");
17
+
18
+ var _pluginWiggle = require("@jbrowse/plugin-wiggle");
19
+
20
+ /* eslint-disable @typescript-eslint/no-explicit-any */
21
+ var en = function en(n) {
22
+ return n.toLocaleString('en-US');
23
+ };
24
+
25
+ var TooltipContents = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref) {
26
+ var feature = _ref.feature;
27
+ var start = feature.get('start');
28
+ var end = feature.get('end');
29
+ var name = feature.get('refName');
30
+ var info = feature.get('snpinfo');
31
+ var loc = [name, start === end ? en(start) : "".concat(en(start), "..").concat(en(end))].filter(function (f) {
32
+ return !!f;
33
+ }).join(':');
34
+ var total = info === null || info === void 0 ? void 0 : info.total;
35
+ return /*#__PURE__*/_react["default"].createElement("div", {
36
+ ref: ref
37
+ }, /*#__PURE__*/_react["default"].createElement("table", null, /*#__PURE__*/_react["default"].createElement("caption", null, loc), /*#__PURE__*/_react["default"].createElement("thead", null, /*#__PURE__*/_react["default"].createElement("tr", null, /*#__PURE__*/_react["default"].createElement("th", null, "Base"), /*#__PURE__*/_react["default"].createElement("th", null, "Count"), /*#__PURE__*/_react["default"].createElement("th", null, "% of Total"), /*#__PURE__*/_react["default"].createElement("th", null, "Strands"), /*#__PURE__*/_react["default"].createElement("th", null, "Source"))), /*#__PURE__*/_react["default"].createElement("tbody", null, /*#__PURE__*/_react["default"].createElement("tr", null, /*#__PURE__*/_react["default"].createElement("td", null, "Total"), /*#__PURE__*/_react["default"].createElement("td", null, total), /*#__PURE__*/_react["default"].createElement("td", null)), Object.entries(info).map(function (_ref2) {
38
+ var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2),
39
+ key = _ref3[0],
40
+ entry = _ref3[1];
41
+
42
+ return Object.entries(entry).map(function (_ref4) {
43
+ var _ref5 = (0, _slicedToArray2["default"])(_ref4, 2),
44
+ base = _ref5[0],
45
+ score = _ref5[1];
46
+
47
+ var strands = score.strands;
48
+ return /*#__PURE__*/_react["default"].createElement("tr", {
49
+ key: base
50
+ }, /*#__PURE__*/_react["default"].createElement("td", null, base.toUpperCase()), /*#__PURE__*/_react["default"].createElement("td", null, score.total), /*#__PURE__*/_react["default"].createElement("td", null, base === 'total' || base === 'skip' ? '---' : "".concat(Math.floor(score.total / (total || score.total || 1) * 100), "%")), /*#__PURE__*/_react["default"].createElement("td", null, strands['-1'] ? "".concat(strands['-1'], "(-)") : '', strands['1'] ? "".concat(strands['1'], "(+)") : ''), /*#__PURE__*/_react["default"].createElement("td", null, key));
51
+ });
52
+ }))));
53
+ });
54
+
55
+ var SNPCoverageTooltip = (0, _mobxReact.observer)(function (props) {
56
+ var model = props.model;
57
+ var feat = model.featureUnderMouse;
58
+ return feat && feat.get('type') === 'skip' ? null : /*#__PURE__*/_react["default"].createElement(_pluginWiggle.Tooltip, (0, _extends2["default"])({
59
+ TooltipContents: TooltipContents
60
+ }, props));
61
+ });
62
+ var _default = SNPCoverageTooltip;
63
+ exports["default"] = _default;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = register;
9
+
10
+ var _configSchema = _interopRequireDefault(require("./models/configSchema"));
11
+
12
+ var _model = _interopRequireDefault(require("./models/model"));
13
+
14
+ var _pluginWiggle = require("@jbrowse/plugin-wiggle");
15
+
16
+ var _DisplayType = _interopRequireDefault(require("@jbrowse/core/pluggableElementTypes/DisplayType"));
17
+
18
+ function register(pluginManager) {
19
+ pluginManager.addDisplayType(function () {
20
+ var configSchema = (0, _configSchema["default"])(pluginManager);
21
+ return new _DisplayType["default"]({
22
+ name: 'LinearSNPCoverageDisplay',
23
+ configSchema: configSchema,
24
+ stateModel: (0, _model["default"])(pluginManager, configSchema),
25
+ trackType: 'AlignmentsTrack',
26
+ viewType: 'LinearGenomeView',
27
+ ReactComponent: _pluginWiggle.LinearWiggleDisplayReactComponent
28
+ });
29
+ });
30
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = SNPCoverageConfigFactory;
7
+
8
+ var _configuration = require("@jbrowse/core/configuration");
9
+
10
+ var _pluginLinearGenomeView = require("@jbrowse/plugin-linear-genome-view");
11
+
12
+ var _mobxStateTree = require("mobx-state-tree");
13
+
14
+ function SNPCoverageConfigFactory(pluginManager) {
15
+ var SNPCoverageRendererConfigSchema = pluginManager.getRendererType('SNPCoverageRenderer').configSchema;
16
+ return (0, _configuration.ConfigurationSchema)('LinearSNPCoverageDisplay', {
17
+ autoscale: {
18
+ type: 'stringEnum',
19
+ defaultValue: 'local',
20
+ model: _mobxStateTree.types.enumeration('Autoscale type', ['local']),
21
+ description: 'performs local autoscaling (no other options for SNP Coverage available)'
22
+ },
23
+ minScore: {
24
+ type: 'number',
25
+ defaultValue: Number.MIN_VALUE,
26
+ description: 'minimum value for the y-scale'
27
+ },
28
+ maxScore: {
29
+ type: 'number',
30
+ description: 'maximum value for the y-scale',
31
+ defaultValue: Number.MAX_VALUE
32
+ },
33
+ scaleType: {
34
+ type: 'stringEnum',
35
+ model: _mobxStateTree.types.enumeration('Scale type', ['linear', 'log']),
36
+ // todo zscale
37
+ description: 'The type of scale to use',
38
+ defaultValue: 'linear'
39
+ },
40
+ inverted: {
41
+ type: 'boolean',
42
+ description: 'draw upside down',
43
+ defaultValue: false
44
+ },
45
+ multiTicks: {
46
+ type: 'boolean',
47
+ description: 'Display multiple values for the ticks',
48
+ defaultValue: false
49
+ },
50
+ renderers: (0, _configuration.ConfigurationSchema)('RenderersConfiguration', {
51
+ SNPCoverageRenderer: SNPCoverageRendererConfigSchema
52
+ })
53
+ }, {
54
+ baseConfiguration: _pluginLinearGenomeView.baseLinearDisplayConfigSchema,
55
+ explicitlyTyped: true
56
+ });
57
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
6
+
7
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
8
+
9
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
10
+
11
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
12
+
13
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
14
+
15
+ var _Plugin2 = _interopRequireDefault(require("@jbrowse/core/Plugin"));
16
+
17
+ var _PluginManager = _interopRequireDefault(require("@jbrowse/core/PluginManager"));
18
+
19
+ var _SNPCoverageRenderer = _interopRequireDefault(require("../../SNPCoverageRenderer"));
20
+
21
+ var _configSchema = _interopRequireDefault(require("./configSchema"));
22
+
23
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
24
+
25
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
26
+
27
+ // mock warnings to avoid unnecessary outputs
28
+ beforeEach(function () {
29
+ jest.spyOn(console, 'warn').mockImplementation(function () {});
30
+ });
31
+ afterEach(function () {
32
+ console.warn.mockRestore();
33
+ }); // change renderer
34
+
35
+ var SNPCoverageRendererPlugin = /*#__PURE__*/function (_Plugin) {
36
+ (0, _inherits2["default"])(SNPCoverageRendererPlugin, _Plugin);
37
+
38
+ var _super = _createSuper(SNPCoverageRendererPlugin);
39
+
40
+ function SNPCoverageRendererPlugin() {
41
+ (0, _classCallCheck2["default"])(this, SNPCoverageRendererPlugin);
42
+ return _super.apply(this, arguments);
43
+ }
44
+
45
+ (0, _createClass2["default"])(SNPCoverageRendererPlugin, [{
46
+ key: "install",
47
+ value: function install(pluginManager) {
48
+ (0, _SNPCoverageRenderer["default"])(pluginManager);
49
+ }
50
+ }]);
51
+ return SNPCoverageRendererPlugin;
52
+ }(_Plugin2["default"]);
53
+
54
+ test('has a type attr', function () {
55
+ var configSchema = (0, _configSchema["default"])(new _PluginManager["default"]([new SNPCoverageRendererPlugin()]).createPluggableElements().configure());
56
+ var config = configSchema.create({
57
+ type: 'LinearSNPCoverageDisplay',
58
+ displayId: 'display1',
59
+ name: 'SNPZonker Display'
60
+ });
61
+ expect(config.type).toEqual('LinearSNPCoverageDisplay');
62
+ });
@@ -26,7 +26,7 @@ declare const stateModelFactory: (pluginManager: PluginManager, configSchema: An
26
26
  renderInProgress: AbortController | undefined;
27
27
  filled: boolean;
28
28
  reactElement: import("react").ReactElement<any, string | ((props: any) => import("react").ReactElement<any, any> | null) | (new (props: any) => import("react").Component<any, any, any>)> | undefined;
29
- features: Map<string, import("@jbrowse/core/util/simpleFeature").Feature> | undefined;
29
+ features: Map<string, import("@jbrowse/core/util").Feature> | undefined;
30
30
  layout: any;
31
31
  status: string;
32
32
  error: unknown;
@@ -44,7 +44,7 @@ declare const stateModelFactory: (pluginManager: PluginManager, configSchema: An
44
44
  setMessage(messageText: string): void;
45
45
  setRendered(props: {
46
46
  reactElement: import("react").ReactElement<any, string | ((props: any) => import("react").ReactElement<any, any> | null) | (new (props: any) => import("react").Component<any, any, any>)>;
47
- features: Map<string, import("@jbrowse/core/util/simpleFeature").Feature>;
47
+ features: Map<string, import("@jbrowse/core/util").Feature>;
48
48
  layout: any;
49
49
  maxHeightReached: boolean;
50
50
  renderProps: any;
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
13
+
14
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
15
+
16
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
+
18
+ var _mobxStateTree = require("mobx-state-tree");
19
+
20
+ var _mobx = require("mobx");
21
+
22
+ var _configuration = require("@jbrowse/core/configuration");
23
+
24
+ var _pluginWiggle = require("@jbrowse/plugin-wiggle");
25
+
26
+ var _util = require("@jbrowse/core/util");
27
+
28
+ var _Tooltip = _interopRequireDefault(require("../components/Tooltip"));
29
+
30
+ var _shared = require("../../shared");
31
+
32
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
33
+
34
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
35
+
36
+ // using a map because it preserves order
37
+ var rendererTypes = new Map([['snpcoverage', 'SNPCoverageRenderer']]);
38
+
39
+ var stateModelFactory = function stateModelFactory(pluginManager, configSchema) {
40
+ return _mobxStateTree.types.compose('LinearSNPCoverageDisplay', (0, _pluginWiggle.linearWiggleDisplayModelFactory)(pluginManager, configSchema), _mobxStateTree.types.model({
41
+ type: _mobxStateTree.types.literal('LinearSNPCoverageDisplay'),
42
+ drawInterbaseCounts: _mobxStateTree.types.maybe(_mobxStateTree.types["boolean"]),
43
+ drawIndicators: _mobxStateTree.types.maybe(_mobxStateTree.types["boolean"]),
44
+ drawArcs: _mobxStateTree.types.maybe(_mobxStateTree.types["boolean"]),
45
+ filterBy: _mobxStateTree.types.optional(_mobxStateTree.types.model({
46
+ flagInclude: _mobxStateTree.types.optional(_mobxStateTree.types.number, 0),
47
+ flagExclude: _mobxStateTree.types.optional(_mobxStateTree.types.number, 1540),
48
+ readName: _mobxStateTree.types.maybe(_mobxStateTree.types.string),
49
+ tagFilter: _mobxStateTree.types.maybe(_mobxStateTree.types.model({
50
+ tag: _mobxStateTree.types.string,
51
+ value: _mobxStateTree.types.string
52
+ }))
53
+ }), {}),
54
+ colorBy: _mobxStateTree.types.maybe(_mobxStateTree.types.model({
55
+ type: _mobxStateTree.types.string,
56
+ tag: _mobxStateTree.types.maybe(_mobxStateTree.types.string)
57
+ }))
58
+ }))["volatile"](function () {
59
+ return {
60
+ modificationTagMap: _mobx.observable.map({})
61
+ };
62
+ }).actions(function (self) {
63
+ return {
64
+ setConfig: function setConfig(configuration) {
65
+ self.configuration = configuration;
66
+ },
67
+ setFilterBy: function setFilterBy(filter) {
68
+ self.filterBy = (0, _mobxStateTree.cast)(filter);
69
+ },
70
+ setColorBy: function setColorBy(colorBy) {
71
+ self.colorBy = (0, _mobxStateTree.cast)(colorBy);
72
+ },
73
+ updateModificationColorMap: function updateModificationColorMap(uniqueModifications) {
74
+ var colorPalette = ['red', 'blue', 'green', 'orange', 'purple'];
75
+ var i = 0;
76
+ uniqueModifications.forEach(function (value) {
77
+ if (!self.modificationTagMap.has(value)) {
78
+ var newColor = colorPalette[i++];
79
+ self.modificationTagMap.set(value, newColor);
80
+ }
81
+ });
82
+ }
83
+ };
84
+ }).views(function (self) {
85
+ var superRenderProps = self.renderProps;
86
+ return {
87
+ get rendererConfig() {
88
+ var configBlob = (0, _configuration.getConf)(self, ['renderers', self.rendererTypeName]) || {};
89
+ return self.rendererType.configSchema.create(_objectSpread(_objectSpread({}, configBlob), {}, {
90
+ drawInterbaseCounts: self.drawInterbaseCounts === undefined ? configBlob.drawInterbaseCounts : self.drawInterbaseCounts,
91
+ drawIndicators: self.drawIndicators === undefined ? configBlob.drawIndicators : self.drawIndicators,
92
+ drawArcs: self.drawArcs === undefined ? configBlob.drawArcs : self.drawArcs
93
+ }), (0, _mobxStateTree.getEnv)(self));
94
+ },
95
+
96
+ get drawArcsSetting() {
97
+ return self.drawArcs !== undefined ? self.drawArcs : (0, _configuration.readConfObject)(this.rendererConfig, 'drawArcs');
98
+ },
99
+
100
+ get drawInterbaseCountsSetting() {
101
+ return self.drawInterbaseCounts !== undefined ? self.drawInterbaseCounts : (0, _configuration.readConfObject)(this.rendererConfig, 'drawInterbaseCounts');
102
+ },
103
+
104
+ get drawIndicatorsSetting() {
105
+ return self.drawIndicators !== undefined ? self.drawIndicators : (0, _configuration.readConfObject)(this.rendererConfig, 'drawIndicators');
106
+ },
107
+
108
+ get modificationsReady() {
109
+ var _self$colorBy;
110
+
111
+ return ((_self$colorBy = self.colorBy) === null || _self$colorBy === void 0 ? void 0 : _self$colorBy.type) === 'modifications' ? Object.keys(JSON.parse(JSON.stringify(self.modificationTagMap))).length > 0 : true;
112
+ },
113
+
114
+ renderProps: function renderProps() {
115
+ var superProps = superRenderProps();
116
+ return _objectSpread(_objectSpread({}, superProps), {}, {
117
+ notReady: superProps.notReady || !this.modificationsReady,
118
+ modificationTagMap: JSON.parse(JSON.stringify(self.modificationTagMap)),
119
+ // must use getSnapshot because otherwise changes to e.g. just the
120
+ // colorBy.type are not read
121
+ colorBy: self.colorBy ? (0, _mobxStateTree.getSnapshot)(self.colorBy) : undefined,
122
+ filterBy: self.filterBy
123
+ });
124
+ }
125
+ };
126
+ }).actions(function (self) {
127
+ return {
128
+ toggleDrawIndicators: function toggleDrawIndicators() {
129
+ self.drawIndicators = !self.drawIndicatorsSetting;
130
+ },
131
+ toggleDrawInterbaseCounts: function toggleDrawInterbaseCounts() {
132
+ self.drawInterbaseCounts = !self.drawInterbaseCountsSetting;
133
+ },
134
+ toggleDrawArcs: function toggleDrawArcs() {
135
+ self.drawArcs = !self.drawArcsSetting;
136
+ },
137
+ afterAttach: function afterAttach() {
138
+ (0, _mobxStateTree.addDisposer)(self, (0, _mobx.autorun)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
139
+ var colorBy, _ref2, staticBlocks, vals;
140
+
141
+ return _regenerator["default"].wrap(function _callee$(_context) {
142
+ while (1) {
143
+ switch (_context.prev = _context.next) {
144
+ case 0:
145
+ _context.prev = 0;
146
+ colorBy = self.colorBy;
147
+ _ref2 = (0, _util.getContainingView)(self), staticBlocks = _ref2.staticBlocks;
148
+
149
+ if (!((colorBy === null || colorBy === void 0 ? void 0 : colorBy.type) === 'modifications')) {
150
+ _context.next = 8;
151
+ break;
152
+ }
153
+
154
+ _context.next = 6;
155
+ return (0, _shared.getUniqueModificationValues)(self, (0, _configuration.getConf)(self.parentTrack, 'adapter'), colorBy, staticBlocks);
156
+
157
+ case 6:
158
+ vals = _context.sent;
159
+ self.updateModificationColorMap(vals);
160
+
161
+ case 8:
162
+ _context.next = 14;
163
+ break;
164
+
165
+ case 10:
166
+ _context.prev = 10;
167
+ _context.t0 = _context["catch"](0);
168
+ console.error(_context.t0);
169
+ self.setError(_context.t0);
170
+
171
+ case 14:
172
+ case "end":
173
+ return _context.stop();
174
+ }
175
+ }
176
+ }, _callee, null, [[0, 10]]);
177
+ })), {
178
+ delay: 1000
179
+ }));
180
+ }
181
+ };
182
+ }).views(function (self) {
183
+ var superTrackMenuItems = self.trackMenuItems;
184
+ return {
185
+ get TooltipComponent() {
186
+ return _Tooltip["default"];
187
+ },
188
+
189
+ get adapterConfig() {
190
+ var subadapter = (0, _configuration.getConf)(self.parentTrack, 'adapter');
191
+ return {
192
+ type: 'SNPCoverageAdapter',
193
+ subadapter: subadapter
194
+ };
195
+ },
196
+
197
+ get rendererTypeName() {
198
+ return rendererTypes.get('snpcoverage');
199
+ },
200
+
201
+ get needsScalebar() {
202
+ return true;
203
+ },
204
+
205
+ contextMenuItems: function contextMenuItems() {
206
+ return [];
207
+ },
208
+ trackMenuItems: function trackMenuItems() {
209
+ return [].concat((0, _toConsumableArray2["default"])(superTrackMenuItems()), [{
210
+ label: 'Draw insertion/clipping indicators',
211
+ type: 'checkbox',
212
+ checked: self.drawIndicatorsSetting,
213
+ onClick: function onClick() {
214
+ self.toggleDrawIndicators();
215
+ }
216
+ }, {
217
+ label: 'Draw insertion/clipping counts',
218
+ type: 'checkbox',
219
+ checked: self.drawInterbaseCountsSetting,
220
+ onClick: function onClick() {
221
+ self.toggleDrawInterbaseCounts();
222
+ }
223
+ }, {
224
+ label: 'Draw arcs',
225
+ type: 'checkbox',
226
+ checked: self.drawArcsSetting,
227
+ onClick: function onClick() {
228
+ self.toggleDrawArcs();
229
+ }
230
+ }]);
231
+ }
232
+ };
233
+ });
234
+ };
235
+
236
+ var _default = stateModelFactory;
237
+ exports["default"] = _default;
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
+
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
+
14
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
+
16
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
17
+
18
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
19
+
20
+ /* eslint-disable @typescript-eslint/no-explicit-any */
21
+ // see perf results on object.keys vs for-in loop
22
+ // https://jsperf.com/object-keys-vs-hasownproperty/55
23
+ var NestedFrequencyTable = /*#__PURE__*/function () {
24
+ function NestedFrequencyTable() {
25
+ var initialData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
26
+ (0, _classCallCheck2["default"])(this, NestedFrequencyTable);
27
+ (0, _defineProperty2["default"])(this, "categories", void 0);
28
+ this.categories = _objectSpread({}, initialData);
29
+ } // get the sum of all the category counts
30
+
31
+
32
+ (0, _createClass2["default"])(NestedFrequencyTable, [{
33
+ key: "total",
34
+ value: function total() {
35
+ // calculate total if necessary
36
+ var t = 0;
37
+
38
+ for (var k in this.categories) {
39
+ var v = this.categories[k];
40
+ t += v.total ? v.total() : v;
41
+ }
42
+
43
+ return t;
44
+ } // decrement the count for the given category
45
+
46
+ }, {
47
+ key: "decrement",
48
+ value: function decrement(slotName, amount) {
49
+ if (!amount) {
50
+ amount = 1;
51
+ }
52
+
53
+ if (!slotName) {
54
+ slotName = 'default';
55
+ } else {
56
+ slotName = slotName.toString();
57
+ }
58
+
59
+ if (this.categories[slotName]) {
60
+ this.categories[slotName] = Math.max(0, this.categories[slotName] - amount);
61
+ return this.categories[slotName];
62
+ }
63
+
64
+ return 0;
65
+ } // increment the count for the given category
66
+
67
+ }, {
68
+ key: "increment",
69
+ value: function increment(slotName, amount) {
70
+ if (!amount) {
71
+ amount = 1;
72
+ }
73
+
74
+ if (!slotName) {
75
+ slotName = 'default';
76
+ } else {
77
+ slotName = slotName.toString();
78
+ }
79
+
80
+ this.categories[slotName] = (this.categories[slotName] || 0) + amount;
81
+ return this.categories[slotName];
82
+ } // get the value of the given category. may be a number or a
83
+ // frequency table.
84
+
85
+ }, {
86
+ key: "get",
87
+ value: function get(slotName) {
88
+ return this.categories[slotName] || 0;
89
+ } // get a given category as a frequency table
90
+
91
+ }, {
92
+ key: "getNested",
93
+ value: function getNested(path) {
94
+ if (typeof path === 'string') {
95
+ path = path.split('/');
96
+ }
97
+
98
+ if (!path.length) {
99
+ return this;
100
+ }
101
+
102
+ var slotName = path[0].toString();
103
+ var slot = this.categories[slotName];
104
+
105
+ if (!slot || !slot.categories) {
106
+ this.categories[slotName] = new NestedFrequencyTable(slot ? {
107
+ "default": slot + 0
108
+ } : {});
109
+ }
110
+
111
+ slot = this.categories[slotName];
112
+
113
+ if (path.length > 1) {
114
+ return slot.getNested(path.slice(1));
115
+ }
116
+
117
+ return slot;
118
+ }
119
+ }, {
120
+ key: "toString",
121
+ value: function toString() {
122
+ return this.total().toPrecision(6).toString().replace(/\.?0+$/, '');
123
+ }
124
+ }, {
125
+ key: "valueOf",
126
+ value: function valueOf() {
127
+ return this.total();
128
+ } // iterate through the categories and counts, call like:
129
+ //
130
+ // tbl.forEach( function( count, categoryName ) {
131
+ // // do something
132
+ // }, this );
133
+ //
134
+
135
+ }, {
136
+ key: "forEach",
137
+ value: function forEach(func, ctx) {
138
+ if (ctx) {
139
+ for (var slotName in this.categories) {
140
+ func.call(ctx, this.categories[slotName], slotName);
141
+ }
142
+ } else {
143
+ for (var _slotName in this.categories) {
144
+ func(this.categories[_slotName], _slotName);
145
+ }
146
+ }
147
+ }
148
+ }]);
149
+ return NestedFrequencyTable;
150
+ }();
151
+
152
+ exports["default"] = NestedFrequencyTable;