@jbrowse/core 2.1.4 → 2.1.6
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/BaseFeatureWidget/BaseFeatureDetail.d.ts +4 -3
- package/BaseFeatureWidget/BaseFeatureDetail.js +16 -17
- package/BaseFeatureWidget/SequenceBox.d.ts +29 -0
- package/BaseFeatureWidget/SequenceBox.js +61 -0
- package/BaseFeatureWidget/SequenceFeatureDetails.d.ts +2 -8
- package/BaseFeatureWidget/SequenceFeatureDetails.js +123 -135
- package/BaseFeatureWidget/SequenceFeatureSettingsDialog.d.ts +9 -0
- package/BaseFeatureWidget/SequenceFeatureSettingsDialog.js +71 -0
- package/BaseFeatureWidget/SequenceHelpDialog.d.ts +4 -0
- package/BaseFeatureWidget/SequenceHelpDialog.js +51 -0
- package/BaseFeatureWidget/SequencePanel.d.ts +10 -0
- package/BaseFeatureWidget/SequencePanel.js +72 -0
- package/BaseFeatureWidget/index.d.ts +7 -0
- package/BaseFeatureWidget/index.js +21 -5
- package/BaseFeatureWidget/test_data/DLGAP3.d.ts +80 -0
- package/BaseFeatureWidget/test_data/DLGAP3.js +585 -0
- package/BaseFeatureWidget/test_data/NCDN.d.ts +141 -0
- package/BaseFeatureWidget/test_data/NCDN.js +1118 -0
- package/BaseFeatureWidget/types.d.ts +2 -2
- package/BaseFeatureWidget/util.d.ts +13 -2
- package/BaseFeatureWidget/util.js +13 -1
- package/PluginLoader.d.ts +29 -13
- package/PluginLoader.js +47 -77
- package/PluginManager.d.ts +4 -3
- package/PluginManager.js +16 -8
- package/assemblyManager/assembly.d.ts +8 -15
- package/assemblyManager/assembly.js +14 -17
- package/assemblyManager/assemblyManager.d.ts +37 -86
- package/assemblyManager/assemblyManager.js +2 -1
- package/configuration/configurationSlot.js +2 -1
- package/data_adapters/CytobandAdapter.js +1 -1
- package/package.json +3 -3
- package/pluggableElementTypes/ViewType.d.ts +2 -0
- package/pluggableElementTypes/ViewType.js +1 -0
- package/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +7 -5
- package/pluggableElementTypes/models/BaseConnectionModelFactory.js +3 -2
- package/pluggableElementTypes/models/BaseDisplayModel.d.ts +1 -1
- package/pluggableElementTypes/models/BaseDisplayModel.js +3 -2
- package/pluggableElementTypes/models/BaseTrackModel.d.ts +1 -1
- package/pluggableElementTypes/models/BaseTrackModel.js +1 -1
- package/pluggableElementTypes/models/baseTrackConfig.js +16 -4
- package/rpc/RpcManager.d.ts +1 -1
- package/rpc/RpcManager.js +4 -1
- package/rpc/WebWorkerRpcDriver.d.ts +2 -0
- package/rpc/WebWorkerRpcDriver.js +21 -11
- package/rpc/configSchema.js +4 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/ui/AboutDialog.d.ts +6 -0
- package/ui/AboutDialog.js +42 -20
- package/ui/App.d.ts +1 -1
- package/ui/App.js +49 -42
- package/ui/DrawerWidget.js +11 -6
- package/ui/FatalErrorDialog.d.ts +6 -22
- package/ui/FatalErrorDialog.js +10 -29
- package/ui/theme.d.ts +18 -171
- package/ui/theme.js +17 -20
- package/util/calculateStaticBlocks.js +3 -8
- package/util/index.d.ts +5 -1
- package/util/index.js +34 -11
- package/util/simpleFeature.d.ts +1 -2
- package/util/stats.js +7 -5
- package/util/tracks.d.ts +5 -2
- package/util/tracks.js +15 -5
- package/util/types/index.d.ts +1 -1
- package/util/types/index.js +3 -1
package/ui/theme.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.createJBrowseTheme = exports.
|
|
6
|
+
exports.createJBrowseTheme = exports.createJBrowseBaseTheme = exports.createJBrowseDefaultOverrides = exports.createJBrowseDefaultProps = exports.jbrowseDefaultPalette = void 0;
|
|
7
7
|
const colors_1 = require("@mui/material/colors");
|
|
8
8
|
const styles_1 = require("@mui/material/styles");
|
|
9
9
|
const deepmerge_1 = __importDefault(require("deepmerge"));
|
|
@@ -168,38 +168,35 @@ function createJBrowseDefaultOverrides(palette = {}) {
|
|
|
168
168
|
};
|
|
169
169
|
}
|
|
170
170
|
exports.createJBrowseDefaultOverrides = createJBrowseDefaultOverrides;
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
171
|
+
function createJBrowseBaseTheme(palette) {
|
|
172
|
+
return {
|
|
173
|
+
palette: exports.jbrowseDefaultPalette,
|
|
174
|
+
typography: { fontSize: 12 },
|
|
175
|
+
spacing: 4,
|
|
176
|
+
...(0, deepmerge_1.default)(createJBrowseDefaultProps(), createJBrowseDefaultOverrides(palette)),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
exports.createJBrowseBaseTheme = createJBrowseBaseTheme;
|
|
178
180
|
function createJBrowseTheme(theme) {
|
|
179
|
-
var _a, _b
|
|
181
|
+
var _a, _b;
|
|
180
182
|
if ((_a = theme === null || theme === void 0 ? void 0 : theme.palette) === null || _a === void 0 ? void 0 : _a.tertiary) {
|
|
181
183
|
theme = (0, deepmerge_1.default)(theme, {
|
|
182
184
|
palette: {
|
|
183
|
-
tertiary: refTheme.palette.augmentColor(
|
|
185
|
+
tertiary: refTheme.palette.augmentColor('color' in theme.palette.tertiary
|
|
184
186
|
? theme.palette.tertiary
|
|
185
|
-
: {
|
|
186
|
-
color: theme.palette.tertiary,
|
|
187
|
-
}),
|
|
187
|
+
: { color: theme.palette.tertiary }),
|
|
188
188
|
},
|
|
189
189
|
});
|
|
190
190
|
}
|
|
191
|
-
if ((
|
|
191
|
+
if ((_b = theme === null || theme === void 0 ? void 0 : theme.palette) === null || _b === void 0 ? void 0 : _b.quaternary) {
|
|
192
192
|
theme = (0, deepmerge_1.default)(theme, {
|
|
193
193
|
palette: {
|
|
194
|
-
quaternary: refTheme.palette.augmentColor(
|
|
194
|
+
quaternary: refTheme.palette.augmentColor('color' in theme.palette.quaternary
|
|
195
195
|
? theme.palette.quaternary
|
|
196
|
-
: {
|
|
197
|
-
color: theme.palette.quaternary,
|
|
198
|
-
}),
|
|
196
|
+
: { color: theme.palette.quaternary }),
|
|
199
197
|
},
|
|
200
198
|
});
|
|
201
199
|
}
|
|
202
|
-
|
|
203
|
-
return (0, styles_1.createTheme)((0, deepmerge_1.default)(exports.jbrowseBaseTheme, theme || {}));
|
|
200
|
+
return (0, styles_1.createTheme)((0, deepmerge_1.default)(createJBrowseBaseTheme(theme === null || theme === void 0 ? void 0 : theme.palette), theme || {}));
|
|
204
201
|
}
|
|
205
202
|
exports.createJBrowseTheme = createJBrowseTheme;
|
|
@@ -3,15 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const mobx_state_tree_1 = require("mobx-state-tree");
|
|
4
4
|
const _1 = require(".");
|
|
5
5
|
const blockTypes_1 = require("./blockTypes");
|
|
6
|
-
function calculateStaticBlocks(model, padding = true, elision = true, extra = 0,
|
|
7
|
-
|
|
8
|
-
// recalculating the blocks, otherwise, model.width for cases such as
|
|
9
|
-
// off-main-thread. also this is not a ternary because our window.innerWidth
|
|
10
|
-
// might be undefined on off-main-thread, so instead use || model.width
|
|
11
|
-
width = (typeof window !== 'undefined' && window.innerWidth) || model.width) {
|
|
12
|
-
const { offsetPx, displayedRegions, bpPerPx, minimumBlockWidth, interRegionPaddingWidth, } = model;
|
|
6
|
+
function calculateStaticBlocks(model, padding = true, elision = true, extra = 0, width = 800) {
|
|
7
|
+
const { offsetPx, displayedRegions, bpPerPx, minimumBlockWidth, interRegionPaddingWidth, width: modelWidth, } = model;
|
|
13
8
|
const windowLeftBp = offsetPx * bpPerPx;
|
|
14
|
-
const windowRightBp = (offsetPx +
|
|
9
|
+
const windowRightBp = (offsetPx + modelWidth) * bpPerPx;
|
|
15
10
|
const blockSizePx = width;
|
|
16
11
|
const blockSizeBp = Math.ceil(blockSizePx * bpPerPx);
|
|
17
12
|
// for each displayed region
|
package/util/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import PluginManager from '../PluginManager';
|
|
1
2
|
import { IAnyStateTreeNode, IStateTreeNode } from 'mobx-state-tree';
|
|
2
3
|
import { IReactionPublic, IReactionOptions } from 'mobx';
|
|
3
4
|
import SimpleFeature, { Feature, isFeature } from './simpleFeature';
|
|
@@ -327,10 +328,13 @@ export declare function getLayoutId({ sessionId, layoutId, }: {
|
|
|
327
328
|
sessionId: string;
|
|
328
329
|
layoutId: string;
|
|
329
330
|
}): string;
|
|
330
|
-
export declare
|
|
331
|
+
export declare function useLocalStorage<T>(key: string, initialValue: T): readonly [T, (value: T | ((val: T) => T)) => void];
|
|
331
332
|
export declare function getUriLink(value: {
|
|
332
333
|
uri: string;
|
|
333
334
|
baseUri?: string;
|
|
334
335
|
}): string;
|
|
335
336
|
export declare function getStr(obj: unknown): string;
|
|
336
337
|
export declare function measureGridWidth(elements: string[]): number;
|
|
338
|
+
export declare function getEnv(obj: any): {
|
|
339
|
+
pluginManager: PluginManager;
|
|
340
|
+
};
|
package/util/index.js
CHANGED
|
@@ -30,7 +30,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
30
30
|
};
|
|
31
31
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
32
|
exports.getBpDisplayStr = exports.supportedIndexingAdapters = exports.bytesForRegions = exports.objectHash = exports.hashCode = exports.updateStatus = exports.generateCodonTable = exports.defaultCodonTable = exports.defaultStops = exports.defaultStarts = exports.measureText = exports.rIC = exports.blobToDataURL = exports.complement = exports.reverse = exports.revcom = exports.isElectron = exports.stringify = exports.minmax = exports.renameRegionsIfNeeded = exports.renameRegionIfNeeded = exports.makeAbortableReaction = exports.findLastIndex = exports.iterMap = exports.bpSpanPx = exports.featureSpanPx = exports.cartesianToPolar = exports.polarToCartesian = exports.degToRad = exports.radToDeg = exports.bpToPx = exports.clamp = exports.compareLocStrings = exports.compareLocs = exports.parseLocString = exports.parseLocStringOneBased = exports.assembleLocString = exports.getContainingDisplay = exports.getContainingTrack = exports.getContainingView = exports.getSession = exports.findParentThatIs = exports.springAnimate = exports.findParentThat = exports.useDebouncedCallback = exports.useDebounce = exports.inProduction = exports.inDevelopment = exports.isFeature = exports.SimpleFeature = void 0;
|
|
33
|
-
exports.measureGridWidth = exports.getStr = exports.getUriLink = exports.useLocalStorage = exports.getLayoutId = exports.getViewParams = exports.getTickDisplayStr = exports.toLocale = void 0;
|
|
33
|
+
exports.getEnv = exports.measureGridWidth = exports.getStr = exports.getUriLink = exports.useLocalStorage = exports.getLayoutId = exports.getViewParams = exports.getTickDisplayStr = exports.toLocale = void 0;
|
|
34
34
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
35
35
|
const react_1 = require("react");
|
|
36
36
|
const is_object_1 = __importDefault(require("is-object"));
|
|
@@ -941,16 +941,35 @@ function getLayoutId({ sessionId, layoutId, }) {
|
|
|
941
941
|
return sessionId + '-' + layoutId;
|
|
942
942
|
}
|
|
943
943
|
exports.getLayoutId = getLayoutId;
|
|
944
|
-
//
|
|
945
|
-
|
|
946
|
-
const [
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
}
|
|
944
|
+
// Hook from https://usehooks.com/useLocalStorage/
|
|
945
|
+
function useLocalStorage(key, initialValue) {
|
|
946
|
+
const [storedValue, setStoredValue] = (0, react_1.useState)(() => {
|
|
947
|
+
if (typeof window === 'undefined') {
|
|
948
|
+
return initialValue;
|
|
949
|
+
}
|
|
950
|
+
try {
|
|
951
|
+
const item = window.localStorage.getItem(key);
|
|
952
|
+
return item ? JSON.parse(item) : initialValue;
|
|
953
|
+
}
|
|
954
|
+
catch (error) {
|
|
955
|
+
console.error(error);
|
|
956
|
+
return initialValue;
|
|
957
|
+
}
|
|
958
|
+
});
|
|
959
|
+
const setValue = (value) => {
|
|
960
|
+
try {
|
|
961
|
+
const valueToStore = value instanceof Function ? value(storedValue) : value;
|
|
962
|
+
setStoredValue(valueToStore);
|
|
963
|
+
if (typeof window !== 'undefined') {
|
|
964
|
+
window.localStorage.setItem(key, JSON.stringify(valueToStore));
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
catch (error) {
|
|
968
|
+
console.error(error);
|
|
969
|
+
}
|
|
970
|
+
};
|
|
971
|
+
return [storedValue, setValue];
|
|
972
|
+
}
|
|
954
973
|
exports.useLocalStorage = useLocalStorage;
|
|
955
974
|
function getUriLink(value) {
|
|
956
975
|
const { uri, baseUri = '' } = value;
|
|
@@ -977,3 +996,7 @@ function measureGridWidth(elements) {
|
|
|
977
996
|
return Math.max(...elements.map(element => Math.min(Math.max(measureText(getStr(element), 14) + 50, 80), 1000)));
|
|
978
997
|
}
|
|
979
998
|
exports.measureGridWidth = measureGridWidth;
|
|
999
|
+
function getEnv(obj) {
|
|
1000
|
+
return (0, mobx_state_tree_1.getEnv)(obj);
|
|
1001
|
+
}
|
|
1002
|
+
exports.getEnv = getEnv;
|
package/util/simpleFeature.d.ts
CHANGED
|
@@ -42,7 +42,7 @@ export interface SimpleFeatureArgs {
|
|
|
42
42
|
/** unique identifier. can also be in data.uniqueId */
|
|
43
43
|
id: string | number;
|
|
44
44
|
}
|
|
45
|
-
interface SimpleFeatureSerializedNoId {
|
|
45
|
+
export interface SimpleFeatureSerializedNoId {
|
|
46
46
|
[key: string]: unknown;
|
|
47
47
|
parentId?: string;
|
|
48
48
|
subfeatures?: SimpleFeatureSerializedNoId[];
|
|
@@ -94,4 +94,3 @@ export default class SimpleFeature implements Feature {
|
|
|
94
94
|
toJSON(): SimpleFeatureSerialized;
|
|
95
95
|
static fromJSON(json: SimpleFeatureSerialized): SimpleFeature;
|
|
96
96
|
}
|
|
97
|
-
export {};
|
package/util/stats.js
CHANGED
|
@@ -86,11 +86,13 @@ async function scoresToStats(region, features) {
|
|
|
86
86
|
const { start, end } = region;
|
|
87
87
|
const { scoreMin, scoreMax, scoreSum, scoreSumSquares, featureCount } = await features
|
|
88
88
|
.pipe((0, operators_1.reduce)((seed, f) => {
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
seed.
|
|
93
|
-
seed.
|
|
89
|
+
const s = f.get('score');
|
|
90
|
+
const summary = f.get('summary');
|
|
91
|
+
const { scoreMax, scoreMin } = seed;
|
|
92
|
+
seed.scoreMax = Math.max(scoreMax, summary ? f.get('maxScore') : s);
|
|
93
|
+
seed.scoreMin = Math.min(scoreMin, summary ? f.get('minScore') : s);
|
|
94
|
+
seed.scoreSum += s;
|
|
95
|
+
seed.scoreSumSquares += s * s;
|
|
94
96
|
seed.featureCount += 1;
|
|
95
97
|
return seed;
|
|
96
98
|
}, {
|
package/util/tracks.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { IAnyStateTreeNode } from 'mobx-state-tree';
|
|
2
2
|
import { PreFileLocation, FileLocation } from './types';
|
|
3
|
-
import { AnyConfigurationModel } from '../configuration
|
|
3
|
+
import { AnyConfigurationModel } from '../configuration';
|
|
4
4
|
export declare function getTrackAssemblyNames(track: IAnyStateTreeNode & {
|
|
5
5
|
configuration: AnyConfigurationModel;
|
|
6
|
-
}):
|
|
6
|
+
}): string[];
|
|
7
7
|
/** return the rpcSessionId of the highest parent node in the tree that has an rpcSessionId */
|
|
8
8
|
export declare function getRpcSessionId(thisNode: IAnyStateTreeNode): string;
|
|
9
9
|
/**
|
|
@@ -73,3 +73,6 @@ export declare function generateUnknownTrackConf(trackName: string, trackUrl: st
|
|
|
73
73
|
category: string[] | undefined;
|
|
74
74
|
trackId: string;
|
|
75
75
|
};
|
|
76
|
+
export declare function getTrackName(conf: AnyConfigurationModel, session: {
|
|
77
|
+
assemblies: AnyConfigurationModel[];
|
|
78
|
+
}): any;
|
package/util/tracks.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.generateUnknownTrackConf = exports.generateUnsupportedTrackConf = exports.guessTrackType = exports.guessAdapter = exports.getFileName = exports.makeIndexType = exports.makeIndex = exports.storeBlobLocation = exports.setBlobMap = exports.getBlobMap = exports.getBlob = exports.UNSUPPORTED = exports.UNKNOWN = exports.getParentRenderProps = exports.getRpcSessionId = exports.getTrackAssemblyNames = void 0;
|
|
3
|
+
exports.getTrackName = exports.generateUnknownTrackConf = exports.generateUnsupportedTrackConf = exports.guessTrackType = exports.guessAdapter = exports.getFileName = exports.makeIndexType = exports.makeIndex = exports.storeBlobLocation = exports.setBlobMap = exports.getBlobMap = exports.getBlob = exports.UNSUPPORTED = exports.UNKNOWN = exports.getParentRenderProps = exports.getRpcSessionId = exports.getTrackAssemblyNames = void 0;
|
|
4
4
|
const mobx_state_tree_1 = require("mobx-state-tree");
|
|
5
5
|
const index_1 = require("./index");
|
|
6
6
|
const configuration_1 = require("../configuration");
|
|
7
7
|
/* utility functions for use by track models and so forth */
|
|
8
8
|
function getTrackAssemblyNames(track) {
|
|
9
|
-
const
|
|
10
|
-
const trackAssemblyNames = (0, configuration_1.readConfObject)(trackConf, 'assemblyNames');
|
|
9
|
+
const trackAssemblyNames = (0, configuration_1.getConf)(track, 'assemblyNames');
|
|
11
10
|
if (!trackAssemblyNames) {
|
|
12
11
|
// Check if it's an assembly sequence track
|
|
13
12
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -126,7 +125,7 @@ function getFileName(track) {
|
|
|
126
125
|
exports.getFileName = getFileName;
|
|
127
126
|
function guessAdapter(file, index, adapterHint, model) {
|
|
128
127
|
if (model) {
|
|
129
|
-
const { pluginManager } = (0,
|
|
128
|
+
const { pluginManager } = (0, index_1.getEnv)(model);
|
|
130
129
|
const adapterGuesser = pluginManager.evaluateExtensionPoint('Core-guessAdapterForLocation', (_file, _index, _adapterHint) => {
|
|
131
130
|
return undefined;
|
|
132
131
|
});
|
|
@@ -144,7 +143,7 @@ function guessTrackType(adapterType, model) {
|
|
|
144
143
|
if (model) {
|
|
145
144
|
// @ts-ignore
|
|
146
145
|
const session = (0, index_1.getSession)(model);
|
|
147
|
-
const trackTypeGuesser = (0,
|
|
146
|
+
const trackTypeGuesser = (0, index_1.getEnv)(session).pluginManager.evaluateExtensionPoint('Core-guessTrackTypeForLocation', (_adapterName) => {
|
|
148
147
|
return undefined;
|
|
149
148
|
});
|
|
150
149
|
const trackType = trackTypeGuesser(adapterType);
|
|
@@ -179,3 +178,14 @@ function generateUnknownTrackConf(trackName, trackUrl, categories) {
|
|
|
179
178
|
return conf;
|
|
180
179
|
}
|
|
181
180
|
exports.generateUnknownTrackConf = generateUnknownTrackConf;
|
|
181
|
+
function getTrackName(conf, session) {
|
|
182
|
+
const trackName = (0, configuration_1.readConfObject)(conf, 'name');
|
|
183
|
+
if (!trackName && (0, configuration_1.readConfObject)(conf, 'type') === 'ReferenceSequenceTrack') {
|
|
184
|
+
const asm = session.assemblies.find(a => a.sequence === conf);
|
|
185
|
+
return asm
|
|
186
|
+
? `Reference sequence (${(0, configuration_1.readConfObject)(asm, 'displayName') || (0, configuration_1.readConfObject)(asm, 'name')})`
|
|
187
|
+
: 'Reference sequence';
|
|
188
|
+
}
|
|
189
|
+
return trackName;
|
|
190
|
+
}
|
|
191
|
+
exports.getTrackName = getTrackName;
|
package/util/types/index.d.ts
CHANGED
|
@@ -73,7 +73,7 @@ export interface AbstractSessionModel extends AbstractViewContainer {
|
|
|
73
73
|
addWidget?: Function;
|
|
74
74
|
DialogComponent?: DialogComponentType;
|
|
75
75
|
DialogProps: any;
|
|
76
|
-
queueDialog
|
|
76
|
+
queueDialog<T extends DialogComponentType>(callback: (doneCallback: () => void) => [T, React.ComponentProps<T>]): void;
|
|
77
77
|
name: string;
|
|
78
78
|
id?: string;
|
|
79
79
|
tracks: AnyConfigurationModel[];
|
package/util/types/index.js
CHANGED
|
@@ -36,7 +36,9 @@ function isSessionModelWithConfigEditing(thing) {
|
|
|
36
36
|
}
|
|
37
37
|
exports.isSessionModelWithConfigEditing = isSessionModelWithConfigEditing;
|
|
38
38
|
function isSessionWithAddTracks(thing) {
|
|
39
|
-
return
|
|
39
|
+
return (
|
|
40
|
+
// @ts-ignore
|
|
41
|
+
isSessionModel(thing) && 'addTrackConf' in thing && !thing.disableAddTracks);
|
|
40
42
|
}
|
|
41
43
|
exports.isSessionWithAddTracks = isSessionWithAddTracks;
|
|
42
44
|
function isSessionModelWithWidgets(thing) {
|