From 7c640f27de375490c47e53566d636146783a1b41 Mon Sep 17 00:00:00 2001 From: Colin Date: Mon, 22 Jan 2024 11:15:16 -0700 Subject: [PATCH 1/9] Color by config Bump --- .../models/configSchema.ts | 12 ++++++---- .../LinearAlignmentsDisplay/models/model.tsx | 18 +++----------- .../LinearAlignmentsDisplay/models/util.ts | 14 +++++++++++ .../SharedLinearPileupDisplayMixin.ts | 24 +++++++++++++++---- .../src/LinearPileupDisplay/configSchema.ts | 5 ++++ test_data/volvox/config.json | 6 +++-- 6 files changed, 54 insertions(+), 25 deletions(-) diff --git a/plugins/alignments/src/LinearAlignmentsDisplay/models/configSchema.ts b/plugins/alignments/src/LinearAlignmentsDisplay/models/configSchema.ts index a01edcddc6..63934db613 100644 --- a/plugins/alignments/src/LinearAlignmentsDisplay/models/configSchema.ts +++ b/plugins/alignments/src/LinearAlignmentsDisplay/models/configSchema.ts @@ -6,21 +6,25 @@ import PluginManager from '@jbrowse/core/PluginManager' * #config LinearAlignmentsDisplay * has a "pileup" sub-display, where you can see individual reads and a * quantitative "snpcoverage" sub-display track showing SNP frequencies + * extends + * - [BaseLinearDisplay](../baselineardisplay) */ -export default function configModelFactory(pm: PluginManager) { +export default function configModelFactory(pluginManager: PluginManager) { return ConfigurationSchema( 'LinearAlignmentsDisplay', { /** * #slot */ - pileupDisplay: pm.getDisplayType('LinearPileupDisplay').configSchema, + pileupDisplay: pluginManager.getDisplayType('LinearPileupDisplay') + .configSchema, /** * #slot */ - snpCoverageDisplay: pm.getDisplayType('LinearSNPCoverageDisplay') - .configSchema, + snpCoverageDisplay: pluginManager.getDisplayType( + 'LinearSNPCoverageDisplay', + ).configSchema, /** * #slot diff --git a/plugins/alignments/src/LinearAlignmentsDisplay/models/model.tsx b/plugins/alignments/src/LinearAlignmentsDisplay/models/model.tsx index 6cbfaf7d78..9ce1022ed0 100644 --- a/plugins/alignments/src/LinearAlignmentsDisplay/models/model.tsx +++ b/plugins/alignments/src/LinearAlignmentsDisplay/models/model.tsx @@ -6,7 +6,6 @@ import { isAlive, types, Instance, - IStateTreeNode, } from 'mobx-state-tree' import deepEqual from 'fast-deep-equal' @@ -23,20 +22,10 @@ import { FeatureDensityStats } from '@jbrowse/core/data_adapters/BaseAdapter' // locals import { LinearAlignmentsDisplayMixin } from './alignmentsModel' -import { getLowerPanelDisplays } from './util' +import { deepSnap, getLowerPanelDisplays } from './util' const minDisplayHeight = 20 -function deepSnap( - x1: T, - x2: U, -) { - return deepEqual( - x1 ? getSnapshot(x1) : undefined, - x2 ? getSnapshot(x2) : undefined, - ) -} - function preCheck(self: AlignmentsDisplayModel) { const { PileupDisplay, SNPCoverageDisplay } = self return ( @@ -53,7 +42,7 @@ function propagateColorBy(self: AlignmentsDisplayModel) { return } if (!deepSnap(PileupDisplay.colorBy, SNPCoverageDisplay.colorBy)) { - SNPCoverageDisplay.setColorBy(getSnapshot(PileupDisplay.colorBy)) + SNPCoverageDisplay.setColorBy(PileupDisplay.colorBy) } } @@ -63,10 +52,9 @@ function propagateFilterBy(self: AlignmentsDisplayModel) { return } if (!deepSnap(PileupDisplay.filterBy, SNPCoverageDisplay.filterBy)) { - SNPCoverageDisplay.setFilterBy(getSnapshot(PileupDisplay.filterBy)) + SNPCoverageDisplay.setFilterBy(PileupDisplay.filterBy) } } - /** * #stateModel LinearAlignmentsDisplay * extends diff --git a/plugins/alignments/src/LinearAlignmentsDisplay/models/util.ts b/plugins/alignments/src/LinearAlignmentsDisplay/models/util.ts index 2652f499f8..d87c714014 100644 --- a/plugins/alignments/src/LinearAlignmentsDisplay/models/util.ts +++ b/plugins/alignments/src/LinearAlignmentsDisplay/models/util.ts @@ -1,4 +1,6 @@ import PluginManager from '@jbrowse/core/PluginManager' +import { getSnapshot, isStateTreeNode } from 'mobx-state-tree' +import deepEqual from 'fast-deep-equal' export function getLowerPanelDisplays(pluginManager: PluginManager) { return ( @@ -10,3 +12,15 @@ export function getLowerPanelDisplays(pluginManager: PluginManager) { .filter(f => f.subDisplay?.lowerPanel) ) } + +function snapOrObj(r: unknown) { + return isStateTreeNode(r) ? getSnapshot(r) : r +} + +function snap(r: unknown) { + return r ? snapOrObj(r) : undefined +} + +export function deepSnap(x1: unknown, x2: unknown) { + return deepEqual(snap(x1), snap(x2)) +} diff --git a/plugins/alignments/src/LinearPileupDisplay/SharedLinearPileupDisplayMixin.ts b/plugins/alignments/src/LinearPileupDisplay/SharedLinearPileupDisplayMixin.ts index 1fe0b669a8..09425c2596 100644 --- a/plugins/alignments/src/LinearPileupDisplay/SharedLinearPileupDisplayMixin.ts +++ b/plugins/alignments/src/LinearPileupDisplay/SharedLinearPileupDisplayMixin.ts @@ -56,7 +56,8 @@ type LGV = LinearGenomeViewModel /** * #stateModel SharedLinearPileupDisplayMixin * #category display - * extends `BaseLinearDisplay` + * extends + * - [BaseLinearDisplay](../baselineardisplay) */ export function SharedLinearPileupDisplayMixin( configSchema: AnyConfigurationSchemaType, @@ -88,7 +89,7 @@ export function SharedLinearPileupDisplayMixin( /** * #property */ - colorBy: ColorByModel, + colorBySetting: ColorByModel, /** * #property */ @@ -104,6 +105,13 @@ export function SharedLinearPileupDisplayMixin( featureUnderMouseVolatile: undefined as undefined | Feature, tagsReady: false, })) + .views(self => ({ + get colorBy() { + return self.colorBySetting + ? getSnapshot(self.colorBySetting) + : getConf(self, 'colorBy') + }, + })) .views(self => ({ get autorunReady() { const view = getContainingView(self) as LGV @@ -152,7 +160,7 @@ export function SharedLinearPileupDisplayMixin( extra?: ExtraColorBy }) { self.colorTagMap = observable.map({}) // clear existing mapping - self.colorBy = cast(colorScheme) + self.colorBySetting = cast(colorScheme) if (colorScheme.tag) { self.tagsReady = false } @@ -363,7 +371,7 @@ export function SharedLinearPileupDisplayMixin( notReady: superProps.notReady || !self.renderReady(), rpcDriverName, displayModel: self, - colorBy: colorBy ? getSnapshot(colorBy) : undefined, + colorBy: colorBy, filterBy: JSON.parse(JSON.stringify(filterBy)), filters: self.filters, colorTagMap: Object.fromEntries(colorTagMap.toJSON()), @@ -601,4 +609,12 @@ export function SharedLinearPileupDisplayMixin( ) }, })) + .preProcessSnapshot(snap => { + if (snap) { + // @ts-expect-error + const { colorBy, ...rest } = snap + return { ...rest, colorBySetting: colorBy } + } + return snap + }) } diff --git a/plugins/alignments/src/LinearPileupDisplay/configSchema.ts b/plugins/alignments/src/LinearPileupDisplay/configSchema.ts index 1e91cb8939..e9259799db 100644 --- a/plugins/alignments/src/LinearPileupDisplay/configSchema.ts +++ b/plugins/alignments/src/LinearPileupDisplay/configSchema.ts @@ -53,6 +53,11 @@ function configSchemaF(pluginManager: PluginManager) { description: 'color scheme to use', defaultValue: 'normal', }, + + colorBy: { + type: 'frozen', + defaultValue: {}, + }, }, { /** diff --git a/test_data/volvox/config.json b/test_data/volvox/config.json index e4cf6fb8ae..8e27f1fe9e 100644 --- a/test_data/volvox/config.json +++ b/test_data/volvox/config.json @@ -364,7 +364,8 @@ { "type": "LinearPileupDisplay", "displayId": "volvox_cram_pileup_pileup", - "height": 400 + "height": 400, + "colorBy": { "type": "mappingQuality" } } ] }, @@ -512,7 +513,8 @@ "displayId": "volvox_alignments_alignments", "pileupDisplay": { "type": "LinearPileupDisplay", - "displayId": "volvox_bam_altname_alignments_pileup" + "displayId": "volvox_bam_altname_alignments_pileup", + "colorBy": { "type": "mappingQuality" } } } ] From 0375d2de228a63e0fae3591b088b29125039e5ba Mon Sep 17 00:00:00 2001 From: Colin Date: Wed, 20 Nov 2024 22:56:38 -0500 Subject: [PATCH 2/9] Group by strand --- .../alignments/src/BamAdapter/BamAdapter.ts | 22 +- .../alignments/src/CramAdapter/CramAdapter.ts | 36 +- .../components/GroupByDialog.tsx | 187 ++++++---- .../src/LinearPileupDisplay/model.ts | 5 +- plugins/alignments/src/shared/util.ts | 20 ++ yarn.lock | 318 +++++++++--------- 6 files changed, 321 insertions(+), 267 deletions(-) diff --git a/plugins/alignments/src/BamAdapter/BamAdapter.ts b/plugins/alignments/src/BamAdapter/BamAdapter.ts index 83fa8ade57..f003f3c113 100644 --- a/plugins/alignments/src/BamAdapter/BamAdapter.ts +++ b/plugins/alignments/src/BamAdapter/BamAdapter.ts @@ -16,6 +16,7 @@ import QuickLRU from '@jbrowse/core/util/QuickLRU' import BamSlightlyLazyFeature from './BamSlightlyLazyFeature' import { FilterBy } from '../shared/types' import { checkStopToken } from '@jbrowse/core/util/stopToken' +import { filterReadFlag, filterTagValue } from '../shared/util' interface Header { idToName: string[] @@ -208,30 +209,21 @@ export default class BamAdapter extends BaseFeatureDataAdapter { ) } - const flags = record.flags - if ((flags & flagInclude) !== flagInclude && !(flags & flagExclude)) { + if (filterReadFlag(record.flags, flagInclude, flagExclude)) { continue } - if (tagFilter) { - const readVal = record.tags[tagFilter.tag] - const filterVal = tagFilter.value - if ( - filterVal === '*' - ? readVal === undefined - : `${readVal}` !== `${filterVal}` - ) { - continue - } + if ( + tagFilter && + filterTagValue(record.tags[tagFilter.tag], tagFilter.value) + ) { + continue } if (readName && record.name !== readName) { continue } - // retrieve a feature from our feature cache if it is available, the - // features in the cache have pre-computed mismatches objects that - // can be re-used across blocks const ret = this.ultraLongFeatureCache.get(`${record.id}`) if (!ret) { const elt = new BamSlightlyLazyFeature(record, this, ref) diff --git a/plugins/alignments/src/CramAdapter/CramAdapter.ts b/plugins/alignments/src/CramAdapter/CramAdapter.ts index 704bf4e22c..dc21d72fa2 100644 --- a/plugins/alignments/src/CramAdapter/CramAdapter.ts +++ b/plugins/alignments/src/CramAdapter/CramAdapter.ts @@ -17,6 +17,7 @@ import QuickLRU from '@jbrowse/core/util/QuickLRU' import CramSlightlyLazyFeature from './CramSlightlyLazyFeature' import { FilterBy } from '../shared/types' import { checkStopToken } from '@jbrowse/core/util/stopToken' +import { filterReadFlag, filterTagValue } from '../shared/util' interface Header { idToName?: string[] @@ -152,8 +153,8 @@ export default class CramAdapter extends BaseFeatureDataAdapter { const { cram } = conf const samHeader = await cram.cram.getSamHeader() - // use the @SQ lines in the header to figure out the - // mapping between ref ID numbers and names + // use the @SQ lines in the header to figure out the mapping between ref + // ID numbers and names const idToName: string[] = [] const nameToId: Record = {} samHeader @@ -195,8 +196,8 @@ export default class CramAdapter extends BaseFeatureDataAdapter { return samHeader.idToName } - // use info from the SAM header if possible, but fall back to using - // the ref seq order from when the browser's refseqs were loaded + // use info from the SAM header if possible, but fall back to using the ref + // seq order from when the browser's refseqs were loaded refNameToId(refName: string) { if (this.samHeader.nameToId) { return this.samHeader.nameToId[refName] @@ -207,8 +208,8 @@ export default class CramAdapter extends BaseFeatureDataAdapter { return undefined } - // use info from the SAM header if possible, but fall back to using - // the ref seq order from when the browser's refseqs were loaded + // use info from the SAM header if possible, but fall back to using the ref + // seq order from when the browser's refseqs were loaded refIdToName(refId: number) { return this.samHeader.idToName?.[refId] || this.seqIdToRefName?.[refId] } @@ -254,24 +255,19 @@ export default class CramAdapter extends BaseFeatureDataAdapter { } = filterBy || {} for (const record of records) { - const flags = record.flags - if ((flags & flagInclude) !== flagInclude && !(flags & flagExclude)) { + if (filterReadFlag(record.flags, flagInclude, flagExclude)) { continue } - - if (tagFilter) { - const readVal = + if ( + tagFilter && + filterTagValue( tagFilter.tag === 'RG' ? samHeader.readGroups?.[record.readGroupId] - : record.tags[tagFilter.tag] - const filterVal = tagFilter.value - if ( - filterVal === '*' - ? readVal === undefined - : `${readVal}` !== `${filterVal}` - ) { - continue - } + : record.tags[tagFilter.tag], + tagFilter.value, + ) + ) { + continue } if (readName && record.readName !== readName) { diff --git a/plugins/alignments/src/LinearPileupDisplay/components/GroupByDialog.tsx b/plugins/alignments/src/LinearPileupDisplay/components/GroupByDialog.tsx index fd59f149c1..15d411af43 100644 --- a/plugins/alignments/src/LinearPileupDisplay/components/GroupByDialog.tsx +++ b/plugins/alignments/src/LinearPileupDisplay/components/GroupByDialog.tsx @@ -6,6 +6,7 @@ import { DialogActions, DialogContent, FormControlLabel, + MenuItem, TextField, Typography, } from '@mui/material' @@ -36,8 +37,8 @@ const GroupByTagDialog = observer(function (props: { handleClose: () => void }) { const { model, handleClose } = props - const [tag, setTag] = useState('') - const [tagSet, setTagSet] = useState() + const [tag, setGroupByTag] = useState('') + const [tagSet, setGroupByTagSet] = useState() const [loading, setLoading] = useState(false) const [error, setError] = useState() const [includeUndefined, setIncludeUndefined] = useState(true) @@ -45,6 +46,8 @@ const GroupByTagDialog = observer(function (props: { const validTag = /^[A-Za-z][A-Za-z0-9]$/.exec(tag) const isInvalid = tag.length === 2 && !validTag const debouncedTag = useDebounce(tag, 1000) + const [type, setType] = useState('') + useEffect(() => { // eslint-disable-next-line @typescript-eslint/no-floating-promises ;(async () => { @@ -58,7 +61,7 @@ const GroupByTagDialog = observer(function (props: { blocks: (getContainingView(model) as LinearGenomeViewModel) .staticBlocks, }) - setTagSet(vals) + setGroupByTagSet(vals) } } catch (e) { console.error(e) @@ -69,54 +72,67 @@ const GroupByTagDialog = observer(function (props: { })() }, [model, isInvalid, debouncedTag]) return ( - + - - Set the tag to group by. NOTE: this will make a set of fully - functional subtracks with the filter by by default set to the values - of the tag that are visible in the current view - - - Examples: HP for haplotype, RG for read group, etc. - - - { - setIncludeUndefined(!includeUndefined) + setType(event.target.value)} + label="Group by..." + select + > + Strand + Tag + + {type === 'tag' ? ( + <> + + NOTE: this will create new session tracks with the "filter by" set + to the values chosen here rather than affecting the current track + state + + + Examples: HP for haplotype, RG for read group, etc. + + { + setIncludeUndefined(!includeUndefined) + }} + /> + } + label="Make a new subtrack for undefined values of tag as well?" + /> + { + setGroupByTag(event.target.value) + }} + placeholder="Enter tag name" + error={isInvalid} + helperText={isInvalid ? 'Not a valid tag' : ''} + autoComplete="off" + data-testid="group-tag-name" + slotProps={{ + htmlInput: { + maxLength: 2, + 'data-testid': 'group-tag-name-input', + }, }} /> - } - label="Make a new subtrack for undefined values of tag as well?" - /> - { - setTag(event.target.value) - }} - placeholder="Enter tag name" - error={isInvalid} - helperText={isInvalid ? 'Not a valid tag' : ''} - autoComplete="off" - data-testid="group-tag-name" - slotProps={{ - htmlInput: { - maxLength: 2, - 'data-testid': 'group-tag-name-input', - }, - }} - /> - {error ? ( - - ) : loading ? ( - - ) : tagSet ? ( -
-
Found unique {tag} values:
-
{tagSet.join(', ')}
-
+ {error ? ( + + ) : loading ? ( + + ) : tagSet ? ( +
+
Found unique {tag} values:
+
{tagSet.join(', ')}
+
+ ) : null} + ) : null}
@@ -130,31 +146,58 @@ const GroupByTagDialog = observer(function (props: { const track = getContainingTrack(model) const trackConf = clone(getSnapshot(track.configuration)) const session = getSession(model) - if (tagSet) { - const ret = [...tagSet] as (string | undefined)[] - if (includeUndefined) { - ret.push(undefined) - } - for (const tagValue of ret) { - // @ts-expect-error - const newTrackConf = session.addTrackConf({ - ...trackConf, - trackId: `${trackConf.trackId}-${tag}:${tagValue}-${+Date.now()}-sessionTrack`, - name: `${trackConf.name} ${tag}:${tagValue}`, - displays: undefined, - }) - const view = getContainingView(model) as LinearGenomeViewModel - const t = view.showTrack(newTrackConf.trackId) - const d = t.displays[0] as LinearAlignmentsDisplayModel - d.setFilterBy({ - flagInclude: 0, - flagExclude: 1540, - tagFilter: { - tag, - value: tagValue, - }, - }) + const view = getContainingView(model) as LinearGenomeViewModel + if (type === 'tag') { + if (tagSet) { + const ret = [...tagSet] as (string | undefined)[] + if (includeUndefined) { + ret.push(undefined) + } + for (const tagValue of ret) { + // @ts-expect-error + const newTrackConf = session.addTrackConf({ + ...trackConf, + trackId: `${trackConf.trackId}-${tag}:${tagValue}-${+Date.now()}-sessionTrack`, + name: `${trackConf.name} ${tag}:${tagValue}`, + displays: undefined, + }) + const view = getContainingView(model) as LinearGenomeViewModel + const t = view.showTrack(newTrackConf.trackId) + const d = t.displays[0] as LinearAlignmentsDisplayModel + d.setFilterBy({ + flagInclude: 0, + flagExclude: 1540, + tagFilter: { + tag, + value: tagValue, + }, + }) + } } + } else if (type === 'strand') { + // @ts-expect-error + const newTrackConf1 = session.addTrackConf({ + ...trackConf, + trackId: `${trackConf.trackId}-${tag}:(-)-${+Date.now()}-sessionTrack`, + name: `${trackConf.name} (-)`, + displays: undefined, + }) + view.showTrack(newTrackConf1.trackId).displays[0].setFilterBy({ + flagInclude: 16, + flagExclude: 1540, + }) + + // @ts-expect-error + const newTrackConf2 = session.addTrackConf({ + ...trackConf, + trackId: `${trackConf.trackId}-${tag}:(+)-${+Date.now()}-sessionTrack`, + name: `${trackConf.name} (+)`, + displays: undefined, + }) + view.showTrack(newTrackConf2.trackId).displays[0].setFilterBy({ + flagInclude: 0, + flagExclude: 1556, + }) } handleClose() }} diff --git a/plugins/alignments/src/LinearPileupDisplay/model.ts b/plugins/alignments/src/LinearPileupDisplay/model.ts index cf84d30f9c..5ae6dd6b35 100644 --- a/plugins/alignments/src/LinearPileupDisplay/model.ts +++ b/plugins/alignments/src/LinearPileupDisplay/model.ts @@ -416,7 +416,10 @@ function stateModelFactory(configSchema: AnyConfigurationSchemaType) { onClick: () => { getSession(self).queueDialog(handleClose => [ GroupByDialog, - { model: self, handleClose }, + { + model: self, + handleClose, + }, ]) }, }, diff --git a/plugins/alignments/src/shared/util.ts b/plugins/alignments/src/shared/util.ts index 27311ff264..ea5b257549 100644 --- a/plugins/alignments/src/shared/util.ts +++ b/plugins/alignments/src/shared/util.ts @@ -34,3 +34,23 @@ export function cacheGetter(ctor: { prototype: T }, prop: keyof T): void { }, }) } + +export function filterReadFlag( + flags: number, + flagInclude: number, + flagExclude: number, +) { + if ((flags & flagInclude) !== flagInclude) { + return true + } else if (flags & flagExclude) { + return true + } else { + return false + } +} + +export function filterTagValue(readVal: unknown, filterVal?: string) { + return filterVal === '*' + ? readVal === undefined + : `${readVal}` !== `${filterVal}` +} diff --git a/yarn.lock b/yarn.lock index 00b542b775..00ab805abc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -89,9 +89,9 @@ tslib "^2.6.2" "@aws-sdk/client-cloudfront@^3.687.0": - version "3.696.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudfront/-/client-cloudfront-3.696.0.tgz#47ad5b16780959f28df7056aac8b346025f1eb24" - integrity sha512-8lhDJF29RrCD56HQTdaamTB4WBVsoU8BuSJJvl8CC3wE1jnF8dLIBAjVUnDhU/dGQINMb0bC7MWQ9Mnafxy8OQ== + version "3.697.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudfront/-/client-cloudfront-3.697.0.tgz#d26b954b5b2862391c2d6ca1bd18dc47ce50864a" + integrity sha512-zzI48mIXlZuzRnzV5UTcFwK8TapOLPpwBeochG5HvaYKdm+EnN0q0kZJ3uaWbRAvGr9HGZ5O5/6c+TKuPfFrJQ== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" @@ -139,9 +139,9 @@ tslib "^2.6.2" "@aws-sdk/client-s3@^3.693.0": - version "3.696.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.696.0.tgz#498f2716658a7092c896c07be8e9bce2401ab9ce" - integrity sha512-kJw6J8QqxKLd2yNACPt2Y9J0vzi7Q25DHOrBkz6SX3nPLp5Qtzxm4rjKbHs9gKhX7ijUoVkOpzZ/4ufz6/RJmA== + version "3.697.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.697.0.tgz#7f03d1c522dcf98eb6df26e591c411994a20b8ba" + integrity sha512-NJ5V9whlb99YVAG/b0nLSb9sM/ZrEJZC+JT3Skxu7dgo6LIFLavdXjEtkR+rFdG34Gps34jwJ7wvKG2mp1zKHg== dependencies: "@aws-crypto/sha1-browser" "5.2.0" "@aws-crypto/sha256-browser" "5.2.0" @@ -152,7 +152,7 @@ "@aws-sdk/credential-provider-node" "3.696.0" "@aws-sdk/middleware-bucket-endpoint" "3.696.0" "@aws-sdk/middleware-expect-continue" "3.696.0" - "@aws-sdk/middleware-flexible-checksums" "3.696.0" + "@aws-sdk/middleware-flexible-checksums" "3.697.0" "@aws-sdk/middleware-host-header" "3.696.0" "@aws-sdk/middleware-location-constraint" "3.696.0" "@aws-sdk/middleware-logger" "3.696.0" @@ -477,10 +477,10 @@ "@smithy/types" "^3.7.1" tslib "^2.6.2" -"@aws-sdk/middleware-flexible-checksums@3.696.0": - version "3.696.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.696.0.tgz#4c6db8aa9216fa847c744f42ae5b7674e86ab5ee" - integrity sha512-EF+iHcLluuRPashlrRa2Sjf2fjUU6h+FB9CpALv9hq2XgDziseWbs+fJcP3QUnJ1tSdW+3WXtMQFvyMyVYpQKw== +"@aws-sdk/middleware-flexible-checksums@3.697.0": + version "3.697.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.697.0.tgz#fe0a417db512d9a773f096ef275047236004fa15" + integrity sha512-K/y43P+NuHu5+21/29BoJSltcPekvcCU8i74KlGGHbW2Z105e5QVZlFjxivcPOjOA3gdC0W4SoFSIWam5RBhzw== dependencies: "@aws-crypto/crc32" "5.2.0" "@aws-crypto/crc32c" "5.2.0" @@ -3001,28 +3001,28 @@ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz#f29a55df17cb6e87cfbabce33ff6a14a9f85076d" integrity sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA== -"@mui/core-downloads-tracker@^6.1.7": +"@mui/core-downloads-tracker@^6.1.8": version "6.1.8" resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.8.tgz#4fccd4eb9960ffa17ebf0533a6e9cfd2787cba57" integrity sha512-TGAvzwUg9hybDacwfIGFjI2bXYXrIqky+vMfaeay8rvT56/PNAlvIDUJ54kpT5KRc9AWAihOvtDI7/LJOThOmQ== "@mui/icons-material@^6.0.0": - version "6.1.7" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-6.1.7.tgz#79c0fa7087acbcba2fe81f89d9dda15cb65c6742" - integrity sha512-RGzkeHNArIVy5ZQ12bq/8VYNeICEyngngsFskTJ/2hYKhIeIII3iRGtaZaSvLpXh7h3Fg3VKTulT+QU0w5K4XQ== + version "6.1.8" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-6.1.8.tgz#696fe487c16a6caba5b10cf72c5954dce4d33401" + integrity sha512-6frsXcf1TcJKWevWwRup6V4L8lzI33cbHcAjT83YLgKw0vYRZKY0kjMI9fhrJZdRWXgFFgKKvEv3GjoxbqFF7A== dependencies: "@babel/runtime" "^7.26.0" "@mui/material@^6.0.0": - version "6.1.7" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-6.1.7.tgz#a30dcfdae6e3cbb184669813d6b3a8addd4540ee" - integrity sha512-KsjujQL/A2hLd1PV3QboF+W6SSL5QqH6ZlSuQoeYz9r69+TnyBFIevbYLxdjJcJmGBjigL5pfpn7hTGop+vhSg== + version "6.1.8" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-6.1.8.tgz#67cc5796aaa3f81ac94783fd79c85c80062e4a99" + integrity sha512-QZdQFnXct+7NXIzHgT3qt+sQiO7HYGZU2vymP9Xl9tUMXEOA/S1mZMMb7+WGZrk5TzNlU/kP/85K0da5V1jXoQ== dependencies: "@babel/runtime" "^7.26.0" - "@mui/core-downloads-tracker" "^6.1.7" - "@mui/system" "^6.1.7" + "@mui/core-downloads-tracker" "^6.1.8" + "@mui/system" "^6.1.8" "@mui/types" "^7.2.19" - "@mui/utils" "^6.1.7" + "@mui/utils" "^6.1.8" "@popperjs/core" "^2.11.8" "@types/react-transition-group" "^4.4.11" clsx "^2.1.1" @@ -3031,16 +3031,16 @@ react-is "^18.3.1" react-transition-group "^4.4.5" -"@mui/private-theming@^6.1.7": - version "6.1.7" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-6.1.7.tgz#9415c32eb567194b713941243cf18fde09981ba1" - integrity sha512-uLbfUSsug5K0LVkv0PI6Flste3le8+6WSL2omdTiYde93P89Qr7pKr8TA6d2yXfr+Bm+SvD8/fGnkaRwFkryuQ== +"@mui/private-theming@^6.1.8": + version "6.1.8" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-6.1.8.tgz#3ac194689bd4a4bb79816508e9fcc00708753d12" + integrity sha512-TuKl7msynCNCVvhX3c0ef1sF0Qb3VHcPs8XOGB/8bdOGBr/ynmIG1yTMjZeiFQXk8yN9fzK/FDEKMFxILNn3wg== dependencies: "@babel/runtime" "^7.26.0" - "@mui/utils" "^6.1.7" + "@mui/utils" "^6.1.8" prop-types "^15.8.1" -"@mui/styled-engine@^6.1.7": +"@mui/styled-engine@^6.1.8": version "6.1.8" resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-6.1.8.tgz#8e99ff036d171b811eff0f0421c7aae8b0b9ac35" integrity sha512-ZvEoT0U2nPLSLI+B4by4cVjaZnPT2f20f4JUPkyHdwLv65ZzuoHiTlwyhqX1Ch63p8bcJzKTHQVGisEoMK6PGA== @@ -3052,16 +3052,16 @@ csstype "^3.1.3" prop-types "^15.8.1" -"@mui/system@^6.0.0", "@mui/system@^6.1.7": - version "6.1.7" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-6.1.7.tgz#041d450b842d5c2fb1608d4027360ad2ba25bd9a" - integrity sha512-qbMGgcC/FodpuRSfjXlEDdbNQaW++eATh0vNBcPUv2/YXSpReoOpoT9FhogxEBNks+aQViDXBRZKh6HX2fVmwg== +"@mui/system@^6.0.0", "@mui/system@^6.1.8": + version "6.1.8" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-6.1.8.tgz#8ec7eabbb40a6888ebc526fd919b8f3a9d8eeece" + integrity sha512-i1kLfQoWxzFpXTBQIuPoA3xKnAnP3en4I2T8xIolovSolGQX5k8vGjw1JaydQS40td++cFsgCdEU458HDNTGUA== dependencies: "@babel/runtime" "^7.26.0" - "@mui/private-theming" "^6.1.7" - "@mui/styled-engine" "^6.1.7" + "@mui/private-theming" "^6.1.8" + "@mui/styled-engine" "^6.1.8" "@mui/types" "^7.2.19" - "@mui/utils" "^6.1.7" + "@mui/utils" "^6.1.8" clsx "^2.1.1" csstype "^3.1.3" prop-types "^15.8.1" @@ -3071,10 +3071,10 @@ resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.19.tgz#c941954dd24393fdce5f07830d44440cf4ab6c80" integrity sha512-6XpZEM/Q3epK9RN8ENoXuygnqUQxE+siN/6rGRi2iwJPgBUR25mphYQ9ZI87plGh58YoZ5pp40bFvKYOCDJ3tA== -"@mui/utils@^5.16.6 || ^6.0.0", "@mui/utils@^6.1.7": - version "6.1.7" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-6.1.7.tgz#0959d9772ae13c6ceac984a493e06aebb9087e71" - integrity sha512-Gr7cRZxBoZ0BIa3Xqf/2YaUrBLyNPJvXPQH3OsD9WMZukI/TutibbQBVqLYpgqJn8pKSjbD50Yq2auG0wI1xOw== +"@mui/utils@^5.16.6 || ^6.0.0", "@mui/utils@^6.1.8": + version "6.1.8" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-6.1.8.tgz#ae07cad4f6099eeb43dbc71267b4a96304ba3982" + integrity sha512-O2DWb1kz8hiANVcR7Z4gOB3SvPPsSQGUmStpyBDzde6dJIfBzgV9PbEQOBZd3EBsd1pB+Uv1z5LAJAbymmawrA== dependencies: "@babel/runtime" "^7.26.0" "@mui/types" "^7.2.19" @@ -4262,10 +4262,10 @@ "@smithy/types" "^3.7.1" tslib "^2.6.2" -"@storybook/addon-actions@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-8.4.4.tgz#905f14e37eaf53196cf70245994d7bb083378b10" - integrity sha512-+Dd6alcieS6UN7IKhXLuhyQYQMu9HG/Tdr790a4EOQKpJM1NxIMuPuUH3fAoKfa9VhtI1BxTBr7zNtzg9Akqhg== +"@storybook/addon-actions@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-8.4.5.tgz#9224f635c78240f611eb340ba9b4248986b4763c" + integrity sha512-rbB19uiGJ61XHbKIbS1a9bUS6re5L8rT5NMNeEJhCxXRpFUPrlTXMSoD/Pgcn3ENeEMVZsm8/eCzxAVgAP3Mgg== dependencies: "@storybook/global" "^5.0.0" "@types/uuid" "^9.0.1" @@ -4273,103 +4273,103 @@ polished "^4.2.2" uuid "^9.0.0" -"@storybook/addon-backgrounds@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-8.4.4.tgz#997a3f29eb6dda134f42a9d332ea54f6fb065f6c" - integrity sha512-asaGD4ruIPFthyhpByQSJagvtNN7EGKdHj5yMnsMvkSXnN0r1uVkI2/Z37hmLt02Qbzf6OQiBPW5TDL+X+EEBg== +"@storybook/addon-backgrounds@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-8.4.5.tgz#3d93d24d0b8e77d6d5bad78bae4c8621ee27c5d1" + integrity sha512-FeMt4qHCMYDQiLGGDKiRuSPXFup2WXOaZSdL137v1W36wEL/vGkK1A5iQt1qJ8MZzL5WZQuedox8rSybFy7eow== dependencies: "@storybook/global" "^5.0.0" memoizerific "^1.11.3" ts-dedent "^2.0.0" -"@storybook/addon-controls@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-8.4.4.tgz#26454b8daa9bbec6a034d510e1a2b8c772638e3a" - integrity sha512-FbZRbwJQggLz6M3zB6scCp1SDGwQ5zdiD6sjBilZzgGO5rBFqG0A8PoOyr4iPrLU2y/NZBdRrJBD+6MkaJ+yzw== +"@storybook/addon-controls@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-8.4.5.tgz#1f6ce4044ab093aabb79fcd6537a996f2d12597f" + integrity sha512-RVTtDDuESLYc1+SJQv2kI7wzBddzAS9uoEe8P75quN6S4pC0GxAB6xirWZ2+WOcba4eHosY+PxMwuBXQfH78Ew== dependencies: "@storybook/global" "^5.0.0" dequal "^2.0.2" ts-dedent "^2.0.0" -"@storybook/addon-docs@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-8.4.4.tgz#f614b7eba5756263588707609c2b34df7cb4a6b2" - integrity sha512-wuHaStfpd2rkAN5Lf0qmvE3JKTHTEDbnAMTvfs9inzGBL0iAwBLjW48/ll7lLkJ2E3k/FQtaevNpuc7C52u1Bw== +"@storybook/addon-docs@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-8.4.5.tgz#fa38b6c6c0ef1c8fc588b6913ddb55b67be55666" + integrity sha512-zPELIl7wXormOylVaaSpkUIuuCCxrO+OFPMKZnlENt6zSReyy0dJu4V0tzfV8FCw+V4D6Y4wrLRk/TIG951Ojw== dependencies: "@mdx-js/react" "^3.0.0" - "@storybook/blocks" "8.4.4" - "@storybook/csf-plugin" "8.4.4" - "@storybook/react-dom-shim" "8.4.4" + "@storybook/blocks" "8.4.5" + "@storybook/csf-plugin" "8.4.5" + "@storybook/react-dom-shim" "8.4.5" react "^16.8.0 || ^17.0.0 || ^18.0.0" react-dom "^16.8.0 || ^17.0.0 || ^18.0.0" ts-dedent "^2.0.0" "@storybook/addon-essentials@^8.0.0": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-8.4.4.tgz#12a98cedebcf270a6fd6be2691c275f5ef56ee9a" - integrity sha512-0ObUQ98zZkeWqP2k3Un5jny3WxT3THgUKZUGD+mR8eq6CuTmJ3bUXWzDHreuDxQwgr8s5f04XD8IcRvjZ9IRgA== - dependencies: - "@storybook/addon-actions" "8.4.4" - "@storybook/addon-backgrounds" "8.4.4" - "@storybook/addon-controls" "8.4.4" - "@storybook/addon-docs" "8.4.4" - "@storybook/addon-highlight" "8.4.4" - "@storybook/addon-measure" "8.4.4" - "@storybook/addon-outline" "8.4.4" - "@storybook/addon-toolbars" "8.4.4" - "@storybook/addon-viewport" "8.4.4" + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-8.4.5.tgz#7ff4f71b4435f734936272a691a830a34eaaef49" + integrity sha512-AxetQo/zSPIu3RZqWG2opwAz22Bb+jpf1nWbHp0kEpCrBemcWd8X2gonVmXNOC1PDKNl3jcWyc3lmg/+3mxjYg== + dependencies: + "@storybook/addon-actions" "8.4.5" + "@storybook/addon-backgrounds" "8.4.5" + "@storybook/addon-controls" "8.4.5" + "@storybook/addon-docs" "8.4.5" + "@storybook/addon-highlight" "8.4.5" + "@storybook/addon-measure" "8.4.5" + "@storybook/addon-outline" "8.4.5" + "@storybook/addon-toolbars" "8.4.5" + "@storybook/addon-viewport" "8.4.5" ts-dedent "^2.0.0" -"@storybook/addon-highlight@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/addon-highlight/-/addon-highlight-8.4.4.tgz#7ef88b1908e156ad95af2255493aad32dd13df36" - integrity sha512-k7EUxiMe8RCasmgfa6ZKx7UG6kU9RooTYGwqY5TG5xAQOzDwKn4qom+OYkT/9/6lORhJrUe2GgQLCrq/WGpS1A== +"@storybook/addon-highlight@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-highlight/-/addon-highlight-8.4.5.tgz#44c194f88395a6e221744867a11f39ea8910d290" + integrity sha512-sMA7v+4unaKY+5RDhow6lLncJqNX9ZLUnBIt3vzY1ntUsOYVwykAY1Hq4Ysj0luCBXjJJdJ6223ylrycnb7Ilw== dependencies: "@storybook/global" "^5.0.0" -"@storybook/addon-measure@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-8.4.4.tgz#1ccc187c3071f4972ef4607a255e263f2d1f1b94" - integrity sha512-KsjrwrXwrI+z7hKKfjyY1w1b0gLSLZmp15vIRJMELybWV0+4bZFLJGwMBOQFx+aWBED8yZrRV9OjTmoczawsZg== +"@storybook/addon-measure@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-8.4.5.tgz#9b22ea0f28740f0c9c1edee2642de2b75415abdd" + integrity sha512-+sNjew991YaoXQyWWloFybjEGrDO40Jk6w8BgZs2X7oc3D5t/6oFzvyC862U++LGqKFA3quXDeBjEb92CI9cRA== dependencies: "@storybook/global" "^5.0.0" tiny-invariant "^1.3.1" -"@storybook/addon-outline@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-8.4.4.tgz#af719f0dd69a938af16dc7a319bcc884ef136153" - integrity sha512-CVS1dm6BNUWKGrJj9E1ThBp5Khe6Yw+Hhz6OFxrPZfoTr6RstwoTmvSpKjDUCn8zj6ujoORdiQUh1FsHOxAPBg== +"@storybook/addon-outline@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-8.4.5.tgz#32d0a798b7c5abacbe2576125f589c8d4bcd5bcc" + integrity sha512-XlpN98AUDnWQWNFSFVm+HkRUzm3xIUMjBGTkv6HsL6zt6XoJ+LsQMca+PPtYqlBJA+5CU41xMDaG8HC/p+sd3A== dependencies: "@storybook/global" "^5.0.0" ts-dedent "^2.0.0" -"@storybook/addon-toolbars@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-8.4.4.tgz#9b04f18c22ce6539614456905e3fae0dd7d6bbd9" - integrity sha512-ENPshJMDpfzOJ4Tgm1hSzQoaEmgDxCtP6C8LKk4MOd3X92MJ7p6kfb3y3R1BLg4E/g90qp6lKPFdcohS2tKCgQ== +"@storybook/addon-toolbars@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-8.4.5.tgz#ebe20f0577a3e399858ba591066dbc8ac9636a5c" + integrity sha512-hOq5560ONOU/qrslrwosWzxnC4nrF8HZWD43ciKwtethm8HuptU2M+Jrui1CRsMScEZLopWWVE9o0vJMdKpIFQ== -"@storybook/addon-viewport@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-8.4.4.tgz#fdbcc478cf70a194c9531dd22b5a4ea51be970ea" - integrity sha512-SRHJlLhf3tu7+sYNfVIYTeMegn6aiv4HGX97ZLvL76NWWBU8BntQ1LKMki7475mWiZNUFMoYYPsHlG+HU9FAtg== +"@storybook/addon-viewport@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-8.4.5.tgz#21a8b6d49f31cdca72018e9cd3adffbc435fa61a" + integrity sha512-l7Y41gIbJAsIN/QCg1QJ9sr61FLz1C/imUotcDej41tOHxUTSQOlXpNtVnfhUM1vGQc0yNpP3pVxj8BpXi0cAw== dependencies: memoizerific "^1.11.3" -"@storybook/blocks@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/blocks/-/blocks-8.4.4.tgz#5cfffd04bf4e417e19e2948a94133e36bf5e4d0e" - integrity sha512-LwM3guL7uWpYR1a/SY0KZjCUskTKEaS22eF7GK8iXAV5BY4KpKr6ArW4O9orK29KtFwKhDZQLcMcECsOJBVk/A== +"@storybook/blocks@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/blocks/-/blocks-8.4.5.tgz#9494d9ccddc04bacd6a7a6c67cf870b72bf4ce9d" + integrity sha512-Z+LHauSqm3A4HBR9pUEf9KQhD3/3xYMt0FXgA+GHCAyDa6lFeD1C6r9Y2nlT+9dt8gv9B9oygTZvV6GqFVyRSQ== dependencies: "@storybook/csf" "^0.1.11" "@storybook/icons" "^1.2.12" ts-dedent "^2.0.0" -"@storybook/builder-webpack5@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-8.4.4.tgz#4d0af0af68f637ac30e3c0abefe959aaf70dc41d" - integrity sha512-I7SmGngtGc/WA44UkG3sCyYtGXVjTpPe42umf70n5EVaHRvtmXCxfL41C1y3CIfEMAfF36gOFm7rEJROIO5NyA== +"@storybook/builder-webpack5@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-8.4.5.tgz#f2c15eb2219dc21bc6b0f4a5f83afd8c80561bff" + integrity sha512-5TSpirK2LIL4Wultpowlkrv3iAje57HTw92Hy6c4Zn64tAs30123mkdE6MoJcXMBfD4JwX9I2K2Q+ofZXblJPg== dependencies: - "@storybook/core-webpack" "8.4.4" + "@storybook/core-webpack" "8.4.5" "@types/node" "^22.0.0" "@types/semver" "^7.3.4" browser-assert "^1.2.1" @@ -4395,23 +4395,23 @@ webpack-hot-middleware "^2.25.1" webpack-virtual-modules "^0.6.0" -"@storybook/components@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-8.4.4.tgz#487c5d89061519bd3f8f3dcb7cbf052d032ea744" - integrity sha512-0BSZVmsk23C0BSRKx3liZSVQFXtoF86XQFdNQxjrXIwdHIEN7TcL3DwcxeVUU5ilGp7HeDgAydGNIPGgTeEe6g== +"@storybook/components@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-8.4.5.tgz#039e4cb5090c56c47fc10f0c5ecda77f4b015c7f" + integrity sha512-2PdnKfqNNv3sO7qILgWXiNvmLOi503oN9OMemNCQjTIvdvySc5JpS9/eClwcl/JfmE4qHdSHZr8dLLkBM9S7+Q== -"@storybook/core-webpack@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/core-webpack/-/core-webpack-8.4.4.tgz#0e769da04918066de69edac2baebd388f60cce50" - integrity sha512-JeODT64uRJDH0o/ZOAAZHJswBkTYd2u9AdGyAzjp16KRK2NcHM2iUMNT94lOlCYzshvRVqPFVxbNmaL16/K0Ag== +"@storybook/core-webpack@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/core-webpack/-/core-webpack-8.4.5.tgz#b17422cff80c638e3478406193acedb9be2d50cb" + integrity sha512-IpK/3fM+l2WjRNplTtP+MtnRf/394GcBwyemZknUCzFFDJWNYAN1+meEZmOaZKzJ3tQyRYiErrJLHzd1+UH6Dw== dependencies: "@types/node" "^22.0.0" ts-dedent "^2.0.0" -"@storybook/core@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/core/-/core-8.4.4.tgz#9da9d630869d3b888145d5dfd22127a93f207417" - integrity sha512-WjTmJpsHsFCd7tQ/8jFpDWjhntauXcWYYTcEZk56Pq4miyNrrXhV0S80Gxv3Uvzk0jocgtT2AKf8rQuH2UkQEg== +"@storybook/core@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/core/-/core-8.4.5.tgz#4133927a43834664777f0918caf32542630cbdd5" + integrity sha512-aB1sQNX5nRoUAqg5u1py0MuR/VPd6c6PhECa4rW6pmr7kZcfyP4PP6UFpXuN71ypTQlkRE3Vc5PQZ3gLhE9o3g== dependencies: "@storybook/csf" "^0.1.11" better-opn "^3.0.2" @@ -4425,10 +4425,10 @@ util "^0.12.5" ws "^8.2.3" -"@storybook/csf-plugin@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-8.4.4.tgz#cb197181859abbc075f840192f06e8547fe79a2e" - integrity sha512-4+6SUhp5sEJN9BY5RuxcFKvJbOqCzIUp9oHSSz36hkP07a4QH+SwxfEd0U7JRfmPpB63L+izywTzWhdADiAMOQ== +"@storybook/csf-plugin@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-8.4.5.tgz#7f9ae0176e36cb74b1f638aac04dfec4aa04222f" + integrity sha512-qd2rQTglOTS+phQmTbNTXNjNyxdGvolaqHqDNMw3Vf6h9o3U+mLkwnDWNVnQ9oqvOoUEAqpBthgwzU9FhkIk+A== dependencies: unplugin "^1.3.1" @@ -4449,23 +4449,23 @@ resolved "https://registry.yarnpkg.com/@storybook/icons/-/icons-1.2.12.tgz#3e4c939113b67df7ab17b78f805dbb57f4acf0db" integrity sha512-UxgyK5W3/UV4VrI3dl6ajGfHM4aOqMAkFLWe2KibeQudLf6NJpDrDMSHwZj+3iKC4jFU7dkKbbtH2h/al4sW3Q== -"@storybook/manager-api@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/manager-api/-/manager-api-8.4.4.tgz#ea3e134d7cc5a91ef82d95601206eb839e34c631" - integrity sha512-rmNPcbEyzakEHoaecUbhkW7WWOkyZ0z7ywH4d5/s0ZuQS57Px2N+ZLVgRJwYK+YNHiJYqDf1BTln9YJ/Mt1L6Q== +"@storybook/manager-api@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/manager-api/-/manager-api-8.4.5.tgz#ce586cc5961297272f7228446161015464c65067" + integrity sha512-t39JaMy3UX4StbUH/tIDcaflBDxTcyIq853wQtBMhVL3e1+Dw3MIiiG/5bw79HU4R7kSmPVLXIIbV3FmXkq7KQ== "@storybook/node-logger@^8.0.0": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-8.4.4.tgz#a74524112d0e40e8bdf946c2f25edb9cdcced2a5" - integrity sha512-SONyAqPtwB0prZN0ekhAiM2K/n674keOCGnGX5QLRuDYjqhhFq/vmtw1L43dMYu6qlA29cGfxosvrr7pDa+kHg== + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-8.4.5.tgz#570235e9ce071cbd55eea8e94ccc2c98bd0ca9d5" + integrity sha512-AVK/w17vrjTnmdfkHQaIjSFJDP9lJ/fXCT2d9/POUz6KXH0sTWFDb6dPMnjX+Fcu5Ef28kT91RQ+lnWUmLql8Q== -"@storybook/preset-react-webpack@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/preset-react-webpack/-/preset-react-webpack-8.4.4.tgz#e543f834136013778727fe170735ad125daf4f16" - integrity sha512-sCuTZ/zbEWfTYy2cyDUHVDLIEKYFmFPhGDbQLk1D4MEXZsVQqBx7H0yaG9GqB7swvED+XIgQeZTeUA/lTq41fg== +"@storybook/preset-react-webpack@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/preset-react-webpack/-/preset-react-webpack-8.4.5.tgz#da27afe7eaacaa17816608b1ccf225eb986965d8" + integrity sha512-BKPAN7G0yFXfojQdF8tvgwVJ0ldcl6+p1JtAPAieH69BMGni3TEPnvPhkefRWcM8oM8pl+Hch/J2PLHiZ6QKNQ== dependencies: - "@storybook/core-webpack" "8.4.4" - "@storybook/react" "8.4.4" + "@storybook/core-webpack" "8.4.5" + "@storybook/react" "8.4.5" "@storybook/react-docgen-typescript-plugin" "1.0.6--canary.9.0c3f3b7.0" "@types/node" "^22.0.0" "@types/semver" "^7.3.4" @@ -4477,10 +4477,10 @@ tsconfig-paths "^4.2.0" webpack "5" -"@storybook/preview-api@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/preview-api/-/preview-api-8.4.4.tgz#bcfde521927406f9c37744f5cc959c54bf268a92" - integrity sha512-iZrWQcjRBqBHFdDXVxGpw6mHBZMCMYqhWXdyJ0d1S2y3PwcfOjkcXlQ1UiAenFHlA6dKrcYw8luKUQTL9bKReA== +"@storybook/preview-api@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/preview-api/-/preview-api-8.4.5.tgz#f8c046575c68062eda1de9494e7118571d20c72a" + integrity sha512-MKIZ2jQO/3cUdsT57eq8jRgB6inALo9BxrQ88f7mqzltOkMvADvTAY6y8JZqTUoDzWTH/ny/8SGGdtpqlxRuiQ== "@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0": version "1.0.6--canary.9.0c3f3b7.0" @@ -4495,37 +4495,37 @@ react-docgen-typescript "^2.2.2" tslib "^2.0.0" -"@storybook/react-dom-shim@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-8.4.4.tgz#7ea45d7760a49648829e3be70866c7a52bf6ab16" - integrity sha512-kufv2FDK3kjADBo+/aKHsUn9T5E4p9IBAmCoIvXBGRDumPRds7Pt3MB4ODKlg+IumR7LMEq0jTJkn27ZRTuUmw== +"@storybook/react-dom-shim@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-8.4.5.tgz#cc874d008a1def4410c32a95bcf9aac8defdb6f5" + integrity sha512-YTWTfPagptEYXJsnxAl3zP97Ev0zebtaEV0WgjGaEeumr+zsfgKKwzzHxgrtumBmDzwkuKlzFwlQB5A8keOIGA== "@storybook/react-webpack5@^8.0.0": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/react-webpack5/-/react-webpack5-8.4.4.tgz#e4fad3a586795736b1567b129686b383751fd2fb" - integrity sha512-58dxE92h/JZO3xKl88BbEJ165UVCazX9oWd5si+V2GoeqKilVsVM9EMLv5sZY+9blv+lxrZdkykHDeIrcXVxOg== + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/react-webpack5/-/react-webpack5-8.4.5.tgz#1221099959527dabc06b4f26b87244f126ba0771" + integrity sha512-tmYO68I4c0mn2XwM4/WkzEVdP27umfa+Sce+NHkk6fGlp25BiKw70uE8sOkM1leB0wn4ktn9eBw46xXdJv2oew== dependencies: - "@storybook/builder-webpack5" "8.4.4" - "@storybook/preset-react-webpack" "8.4.4" - "@storybook/react" "8.4.4" + "@storybook/builder-webpack5" "8.4.5" + "@storybook/preset-react-webpack" "8.4.5" + "@storybook/react" "8.4.5" "@types/node" "^22.0.0" -"@storybook/react@8.4.4", "@storybook/react@^8.0.0": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-8.4.4.tgz#f456a904e1afea780b08cdfc6827618e8badf250" - integrity sha512-92lGnRcAI2qW6zH8GMBScyXmOS1ANI8ZuSP4ExQj+lGsCrAr7PBr0wuHy3wIn1YyAvQGPUn/mpYrmMz08c2HfA== +"@storybook/react@8.4.5", "@storybook/react@^8.0.0": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-8.4.5.tgz#9395ce8ffd4e27765459703c0634b306af882137" + integrity sha512-2+p4aGEdGOnu2XNhnMi1B8GPeszm34P905HgqGD1cuz9gMt7x/bgZQaVxs6kpHZ3Hb6V9qp62La2dbAYatHdSw== dependencies: - "@storybook/components" "8.4.4" + "@storybook/components" "8.4.5" "@storybook/global" "^5.0.0" - "@storybook/manager-api" "8.4.4" - "@storybook/preview-api" "8.4.4" - "@storybook/react-dom-shim" "8.4.4" - "@storybook/theming" "8.4.4" + "@storybook/manager-api" "8.4.5" + "@storybook/preview-api" "8.4.5" + "@storybook/react-dom-shim" "8.4.5" + "@storybook/theming" "8.4.5" -"@storybook/theming@8.4.4": - version "8.4.4" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-8.4.4.tgz#3d209a235bf2b6f5543f1eebe78244f0104811b5" - integrity sha512-iq4yt3Fx35ZV5owNC//E6G+QPV19xHHVN2Ugi3p7KOSFK3chuXX9mxZ1rfir+t+U30a5EPOEnlsY3/1LXn7aTw== +"@storybook/theming@8.4.5": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-8.4.5.tgz#d7c77215f09906c9bb124d530d4307fd1841fbb8" + integrity sha512-45e/jeG4iuqdZcHg3PbB6dwXQTwlnnEB7r/QcVExyC7ibrkTnjUfvxzyUw4mmU3CXETFGD5EcUobFkgK+/aPxQ== "@szmarczak/http-timer@^4.0.5": version "4.0.6" @@ -15054,11 +15054,11 @@ statuses@2.0.1: integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== storybook@^8.0.0: - version "8.4.4" - resolved "https://registry.yarnpkg.com/storybook/-/storybook-8.4.4.tgz#33fff732a79219866871e4f722ebcd82109b254a" - integrity sha512-xBOq3q/MuUUg3zM0imMMaK5ziKq3TO388jsnaiemJ4Uf0ZGwcHjM8HDBCDt0s5/CfsOQ49zo1ouZ3aNlu0qsUg== + version "8.4.5" + resolved "https://registry.yarnpkg.com/storybook/-/storybook-8.4.5.tgz#ba9589e2887958d1353dbc1a2cb6142e80e36a2c" + integrity sha512-9tfgabXnMibYp3SvoaJXXMD63Pw0SA9Hnf5v6TxysCYZs4DZ/04fAkK+9RW+K4C5JkV83qXMMlrsPj766R47fg== dependencies: - "@storybook/core" "8.4.4" + "@storybook/core" "8.4.5" string-length@^4.0.1: version "4.0.2" From 6340ef37d73443bab821d96f082a24ac8a6ada4e Mon Sep 17 00:00:00 2001 From: Colin Date: Wed, 20 Nov 2024 23:36:10 -0500 Subject: [PATCH 3/9] Misc --- .../LinearAlignmentsDisplay/configSchema.ts | 4 +- .../SharedLinearPileupDisplayMixin.ts | 25 ++++-- .../components/GroupByDialog.tsx | 89 ++++++++++++------- .../src/LinearPileupDisplay/configSchema.ts | 25 +++--- .../src/LinearReadArcsDisplay/configSchema.ts | 23 +++-- .../src/LinearReadArcsDisplay/model.ts | 38 +++++++- .../src/LinearReadCloudDisplay/model.ts | 38 +++++++- 7 files changed, 172 insertions(+), 70 deletions(-) diff --git a/plugins/alignments/src/LinearAlignmentsDisplay/configSchema.ts b/plugins/alignments/src/LinearAlignmentsDisplay/configSchema.ts index 63934db613..c61f297446 100644 --- a/plugins/alignments/src/LinearAlignmentsDisplay/configSchema.ts +++ b/plugins/alignments/src/LinearAlignmentsDisplay/configSchema.ts @@ -16,7 +16,7 @@ export default function configModelFactory(pluginManager: PluginManager) { /** * #slot */ - pileupDisplay: pluginManager.getDisplayType('LinearPileupDisplay') + pileupDisplay: pluginManager.getDisplayType('LinearPileupDisplay')! .configSchema, /** @@ -24,7 +24,7 @@ export default function configModelFactory(pluginManager: PluginManager) { */ snpCoverageDisplay: pluginManager.getDisplayType( 'LinearSNPCoverageDisplay', - ).configSchema, + )!.configSchema, /** * #slot diff --git a/plugins/alignments/src/LinearPileupDisplay/SharedLinearPileupDisplayMixin.ts b/plugins/alignments/src/LinearPileupDisplay/SharedLinearPileupDisplayMixin.ts index 05d5e02f8f..2b45d71c3c 100644 --- a/plugins/alignments/src/LinearPileupDisplay/SharedLinearPileupDisplayMixin.ts +++ b/plugins/alignments/src/LinearPileupDisplay/SharedLinearPileupDisplayMixin.ts @@ -37,7 +37,6 @@ import LinearPileupDisplayBlurb from './components/LinearPileupDisplayBlurb' import { createAutorun } from '../util' import { ColorBy, FilterBy } from '../shared/types' import { getUniqueTags } from '../shared/getUniqueTags' -import { defaultFilterFlags } from '../shared/util' // lazies const FilterByTagDialog = lazy( @@ -97,7 +96,7 @@ export function SharedLinearPileupDisplayMixin( /** * #property */ - filterBySetting: types.optional(types.frozen(), defaultFilterFlags), + filterBySetting: types.frozen(), /** * #property */ @@ -105,12 +104,20 @@ export function SharedLinearPileupDisplayMixin( }), ) .volatile(() => ({ + /** + * #volatile + */ colorTagMap: observable.map({}), + /** + * #volatile + */ featureUnderMouseVolatile: undefined as undefined | Feature, + /** + * #volatile + */ tagsReady: false, })) .views(self => ({ - /** * #getter */ @@ -169,7 +176,7 @@ export function SharedLinearPileupDisplayMixin( */ setColorScheme(colorScheme: ColorBy) { self.colorTagMap = observable.map({}) - self.colorBy = { + self.colorBySetting = { ...colorScheme, } if (colorScheme.tag) { @@ -254,7 +261,7 @@ export function SharedLinearPileupDisplayMixin( * #action */ setFilterBy(filter: FilterBy) { - self.filterBy = { + self.filterBySetting = { ...filter, } }, @@ -675,8 +682,12 @@ export function SharedLinearPileupDisplayMixin( .preProcessSnapshot(snap => { if (snap) { // @ts-expect-error - const { colorBy, ...rest } = snap - return { ...rest, colorBySetting: colorBy } + const { colorBy, filterBy, ...rest } = snap + return { + ...rest, + filterBySetting: filterBy, + colorBySetting: colorBy, + } } return snap }) diff --git a/plugins/alignments/src/LinearPileupDisplay/components/GroupByDialog.tsx b/plugins/alignments/src/LinearPileupDisplay/components/GroupByDialog.tsx index 15d411af43..7cd0ffb236 100644 --- a/plugins/alignments/src/LinearPileupDisplay/components/GroupByDialog.tsx +++ b/plugins/alignments/src/LinearPileupDisplay/components/GroupByDialog.tsx @@ -24,6 +24,7 @@ import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' // locals import { getUniqueTags } from '../../shared/getUniqueTags' import { LinearAlignmentsDisplayModel } from '../../LinearAlignmentsDisplay/model' +import { defaultFilterFlags } from '../../shared/util' function clone(c: unknown) { return JSON.parse(JSON.stringify(c)) @@ -154,50 +155,78 @@ const GroupByTagDialog = observer(function (props: { ret.push(undefined) } for (const tagValue of ret) { + const t1 = `${trackConf.trackId}-${tag}:${tagValue}-${+Date.now()}-sessionTrack` // @ts-expect-error - const newTrackConf = session.addTrackConf({ + session.addTrackConf({ ...trackConf, - trackId: `${trackConf.trackId}-${tag}:${tagValue}-${+Date.now()}-sessionTrack`, - name: `${trackConf.name} ${tag}:${tagValue}`, - displays: undefined, - }) - const view = getContainingView(model) as LinearGenomeViewModel - const t = view.showTrack(newTrackConf.trackId) - const d = t.displays[0] as LinearAlignmentsDisplayModel - d.setFilterBy({ - flagInclude: 0, - flagExclude: 1540, - tagFilter: { - tag, - value: tagValue, - }, + trackId: t1, + name: `${trackConf.name} (-)`, + displays: [ + { + displayId: `${t1}-LinearAlignmentsDisplay`, + type: 'LinearAlignmentsDisplay', + pileupDisplay: { + displayId: `${t1}-LinearAlignmentsDisplay-LinearPileupDisplay`, + type: 'LinearPileupDisplay', + filterBy: { + ...defaultFilterFlags, + tagFilter: { + tag, + value: tagValue, + }, + }, + }, + }, + ], }) + view.showTrack(t1) } } } else if (type === 'strand') { + const t1 = `${trackConf.trackId}-${tag}:(-)-${+Date.now()}-sessionTrack` + const t2 = `${trackConf.trackId}-${tag}:(+)-${+Date.now()}-sessionTrack` // @ts-expect-error - const newTrackConf1 = session.addTrackConf({ + session.addTrackConf({ ...trackConf, - trackId: `${trackConf.trackId}-${tag}:(-)-${+Date.now()}-sessionTrack`, + trackId: t1, name: `${trackConf.name} (-)`, - displays: undefined, - }) - view.showTrack(newTrackConf1.trackId).displays[0].setFilterBy({ - flagInclude: 16, - flagExclude: 1540, + displays: [ + { + displayId: `${t1}-LinearAlignmentsDisplay`, + type: 'LinearAlignmentsDisplay', + pileupDisplay: { + displayId: `${t1}-LinearAlignmentsDisplay-LinearPileupDisplay`, + type: 'LinearPileupDisplay', + filterBy: { + flagInclude: 16, + flagExclude: 1540, + }, + }, + }, + ], }) - // @ts-expect-error - const newTrackConf2 = session.addTrackConf({ + session.addTrackConf({ ...trackConf, - trackId: `${trackConf.trackId}-${tag}:(+)-${+Date.now()}-sessionTrack`, + trackId: t2, name: `${trackConf.name} (+)`, - displays: undefined, - }) - view.showTrack(newTrackConf2.trackId).displays[0].setFilterBy({ - flagInclude: 0, - flagExclude: 1556, + displays: [ + { + displayId: `${t2}-LinearAlignmentsDisplay`, + type: 'LinearAlignmentsDisplay', + pileupDisplay: { + displayId: `${t2}-LinearAlignmentsDisplay-LinearPileupDisplay`, + type: 'LinearPileupDisplay', + filterBy: { + flagInclude: 0, + flagExclude: 1556, + }, + }, + }, + ], }) + view.showTrack(t1) + view.showTrack(t2) } handleClose() }} diff --git a/plugins/alignments/src/LinearPileupDisplay/configSchema.ts b/plugins/alignments/src/LinearPileupDisplay/configSchema.ts index 30b05c6d6c..480df2b216 100644 --- a/plugins/alignments/src/LinearPileupDisplay/configSchema.ts +++ b/plugins/alignments/src/LinearPileupDisplay/configSchema.ts @@ -2,6 +2,7 @@ import { ConfigurationSchema } from '@jbrowse/core/configuration' import { linearBasicDisplayConfigSchemaFactory } from '@jbrowse/plugin-linear-genome-view' import { types } from 'mobx-state-tree' import PluginManager from '@jbrowse/core/PluginManager' +import { defaultFilterFlags } from '../shared/util' /** * #config LinearPileupDisplay @@ -39,23 +40,21 @@ function configSchemaF(pluginManager: PluginManager) { /** * #slot */ - colorScheme: { - type: 'stringEnum', - model: types.enumeration('colorScheme', [ - 'strand', - 'normal', - 'insertSize', - 'insertSizeAndOrientation', - 'mappingQuality', - 'tag', - ]), + colorBy: { + type: 'frozen', description: 'color scheme to use', - defaultValue: 'normal', + defaultValue: { + type: 'normal', + }, }, - colorBy: { + /** + * #slot + */ + filterBy: { type: 'frozen', - defaultValue: {}, + description: 'default filters to use', + defaultValue: defaultFilterFlags, }, }, { diff --git a/plugins/alignments/src/LinearReadArcsDisplay/configSchema.ts b/plugins/alignments/src/LinearReadArcsDisplay/configSchema.ts index 79e04ec5c5..3ba8e453a2 100644 --- a/plugins/alignments/src/LinearReadArcsDisplay/configSchema.ts +++ b/plugins/alignments/src/LinearReadArcsDisplay/configSchema.ts @@ -2,6 +2,7 @@ import PluginManager from '@jbrowse/core/PluginManager' import { ConfigurationSchema } from '@jbrowse/core/configuration' import { linearBasicDisplayConfigSchemaFactory } from '@jbrowse/plugin-linear-genome-view' import { types } from 'mobx-state-tree' +import { defaultFilterFlags } from '../shared/util' /** * #config LinearReadArcsDisplay @@ -41,18 +42,16 @@ function configSchemaF(pluginManager: PluginManager) { /** * #slot */ - colorScheme: { - type: 'stringEnum', - model: types.enumeration('colorScheme', [ - 'strand', - 'normal', - 'insertSize', - 'insertSizeAndOrientation', - 'mappingQuality', - 'tag', - ]), - description: 'color scheme to use', - defaultValue: 'normal', + colorBy: { + type: 'frozen', + defaultValue: { type: 'normal' }, + }, + /** + * #slot + */ + filterBy: { + type: 'frozen', + defaultValue: defaultFilterFlags, }, }, { diff --git a/plugins/alignments/src/LinearReadArcsDisplay/model.ts b/plugins/alignments/src/LinearReadArcsDisplay/model.ts index cacd4fb7f1..f60b119108 100644 --- a/plugins/alignments/src/LinearReadArcsDisplay/model.ts +++ b/plugins/alignments/src/LinearReadArcsDisplay/model.ts @@ -70,7 +70,12 @@ function stateModelFactory(configSchema: AnyConfigurationSchemaType) { /** * #property */ - colorBy: types.frozen(), + colorBySetting: types.frozen(), + + /** + * #property + */ + filterBySetting: types.frozen(), /** * #property @@ -84,12 +89,41 @@ function stateModelFactory(configSchema: AnyConfigurationSchemaType) { }), ) .volatile(() => ({ + /** + * #volatile + */ loading: false, + /** + * #volatile + */ chainData: undefined as ChainData | undefined, + /** + * #volatile + */ lastDrawnOffsetPx: undefined as number | undefined, + /** + * #volatile + */ lastDrawnBpPerPx: 0, + /** + * #volatile + */ ref: null as HTMLCanvasElement | null, })) + .views(self => ({ + /** + * #getter + */ + get colorBy() { + return self.colorBySetting ?? getConf(self, 'colorBy') + }, + /** + * #getter + */ + get filterBy() { + return self.filterBySetting ?? getConf(self, 'filterBy') + }, + })) .actions(self => ({ /** * #action @@ -129,7 +163,7 @@ function stateModelFactory(configSchema: AnyConfigurationSchemaType) { * #action */ setColorScheme(colorBy: { type: string }) { - self.colorBy = { + self.colorBySetting = { ...colorBy, } }, diff --git a/plugins/alignments/src/LinearReadCloudDisplay/model.ts b/plugins/alignments/src/LinearReadCloudDisplay/model.ts index 39bd7ac540..68895b6854 100644 --- a/plugins/alignments/src/LinearReadCloudDisplay/model.ts +++ b/plugins/alignments/src/LinearReadCloudDisplay/model.ts @@ -4,6 +4,7 @@ import { BaseDisplay } from '@jbrowse/core/pluggableElementTypes' import { AnyConfigurationSchemaType, ConfigurationReference, + getConf, } from '@jbrowse/core/configuration' import { getSession } from '@jbrowse/core/util' import { @@ -53,12 +54,12 @@ function stateModelFactory(configSchema: AnyConfigurationSchemaType) { /** * #property */ - filterBy: types.optional(types.frozen(), defaultFilterFlags), + filterBySetting: types.frozen(), /** * #property */ - colorBy: types.frozen(), + colorBySetting: types.frozen(), /** * #property @@ -67,12 +68,41 @@ function stateModelFactory(configSchema: AnyConfigurationSchemaType) { }), ) .volatile(() => ({ + /** + * #volatile + */ loading: false, + /** + * #volatile + */ chainData: undefined as ChainData | undefined, + /** + * #volatile + */ lastDrawnOffsetPx: undefined as number | undefined, + /** + * #volatile + */ lastDrawnBpPerPx: 0, + /** + * #volatile + */ ref: null as HTMLCanvasElement | null, })) + .views(self => ({ + /** + * #getter + */ + get colorBy() { + return self.colorBySetting ?? getConf(self, 'colorBy') + }, + /** + * #getter + */ + get filterBy() { + return self.filterBySetting ?? getConf(self, 'filterBy') + }, + })) .actions(self => ({ /** * #action @@ -115,7 +145,7 @@ function stateModelFactory(configSchema: AnyConfigurationSchemaType) { }, setColorScheme(colorBy: { type: string }) { - self.colorBy = { + self.colorBySetting = { ...colorBy, } }, @@ -131,7 +161,7 @@ function stateModelFactory(configSchema: AnyConfigurationSchemaType) { * #action */ setFilterBy(filter: FilterBy) { - self.filterBy = { + self.filterBySetting = { ...filter, } }, From d16e7d4a599aeb8e2c585b61f7010970c1dc652b Mon Sep 17 00:00:00 2001 From: Colin Date: Wed, 20 Nov 2024 23:54:13 -0500 Subject: [PATCH 4/9] Updates --- .../SharedLinearPileupDisplayMixin.ts | 1 + .../components/GroupByDialog.tsx | 57 ++++++++----------- .../src/LinearReadArcsDisplay/configSchema.ts | 1 - .../src/LinearReadCloudDisplay/model.ts | 1 - .../LinearSNPCoverageDisplay/configSchema.ts | 23 +++++++- .../src/LinearSNPCoverageDisplay/model.ts | 26 ++++++--- plugins/alignments/src/shared/util.ts | 8 +++ test_data/volvox/config.json | 4 +- 8 files changed, 75 insertions(+), 46 deletions(-) diff --git a/plugins/alignments/src/LinearPileupDisplay/SharedLinearPileupDisplayMixin.ts b/plugins/alignments/src/LinearPileupDisplay/SharedLinearPileupDisplayMixin.ts index 2b45d71c3c..b581890442 100644 --- a/plugins/alignments/src/LinearPileupDisplay/SharedLinearPileupDisplayMixin.ts +++ b/plugins/alignments/src/LinearPileupDisplay/SharedLinearPileupDisplayMixin.ts @@ -680,6 +680,7 @@ export function SharedLinearPileupDisplayMixin( }, })) .preProcessSnapshot(snap => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (snap) { // @ts-expect-error const { colorBy, filterBy, ...rest } = snap diff --git a/plugins/alignments/src/LinearPileupDisplay/components/GroupByDialog.tsx b/plugins/alignments/src/LinearPileupDisplay/components/GroupByDialog.tsx index 7cd0ffb236..e662d68e3b 100644 --- a/plugins/alignments/src/LinearPileupDisplay/components/GroupByDialog.tsx +++ b/plugins/alignments/src/LinearPileupDisplay/components/GroupByDialog.tsx @@ -2,10 +2,8 @@ import React, { useEffect, useState } from 'react' import { observer } from 'mobx-react' import { Button, - Checkbox, DialogActions, DialogContent, - FormControlLabel, MenuItem, TextField, Typography, @@ -23,8 +21,7 @@ import { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view' // locals import { getUniqueTags } from '../../shared/getUniqueTags' -import { LinearAlignmentsDisplayModel } from '../../LinearAlignmentsDisplay/model' -import { defaultFilterFlags } from '../../shared/util' +import { defaultFilterFlags, negFlags, posFlags } from '../../shared/util' function clone(c: unknown) { return JSON.parse(JSON.stringify(c)) @@ -42,7 +39,6 @@ const GroupByTagDialog = observer(function (props: { const [tagSet, setGroupByTagSet] = useState() const [loading, setLoading] = useState(false) const [error, setError] = useState() - const [includeUndefined, setIncludeUndefined] = useState(true) const validTag = /^[A-Za-z][A-Za-z0-9]$/.exec(tag) const isInvalid = tag.length === 2 && !validTag @@ -75,10 +71,16 @@ const GroupByTagDialog = observer(function (props: { return ( + + NOTE: this will create new session tracks with the "filter by" set to + the values chosen here rather than affecting the current track state + setType(event.target.value)} + onChange={event => { + setType(event.target.value) + }} label="Group by..." select > @@ -87,25 +89,10 @@ const GroupByTagDialog = observer(function (props: { {type === 'tag' ? ( <> - - NOTE: this will create new session tracks with the "filter by" set - to the values chosen here rather than affecting the current track - state - Examples: HP for haplotype, RG for read group, etc. - { - setIncludeUndefined(!includeUndefined) - }} - /> - } - label="Make a new subtrack for undefined values of tag as well?" - /> + { @@ -150,10 +137,7 @@ const GroupByTagDialog = observer(function (props: { const view = getContainingView(model) as LinearGenomeViewModel if (type === 'tag') { if (tagSet) { - const ret = [...tagSet] as (string | undefined)[] - if (includeUndefined) { - ret.push(undefined) - } + const ret = [...tagSet, undefined] as (string | undefined)[] for (const tagValue of ret) { const t1 = `${trackConf.trackId}-${tag}:${tagValue}-${+Date.now()}-sessionTrack` // @ts-expect-error @@ -185,6 +169,7 @@ const GroupByTagDialog = observer(function (props: { } else if (type === 'strand') { const t1 = `${trackConf.trackId}-${tag}:(-)-${+Date.now()}-sessionTrack` const t2 = `${trackConf.trackId}-${tag}:(+)-${+Date.now()}-sessionTrack` + // @ts-expect-error session.addTrackConf({ ...trackConf, @@ -197,12 +182,14 @@ const GroupByTagDialog = observer(function (props: { pileupDisplay: { displayId: `${t1}-LinearAlignmentsDisplay-LinearPileupDisplay`, type: 'LinearPileupDisplay', - filterBy: { - flagInclude: 16, - flagExclude: 1540, - }, + filterBy: negFlags, }, }, + { + displayId: `${t1}-LinearSNPCoverageDisplay`, + type: 'LinearSNPCoverageDisplay', + filterBy: negFlags, + }, ], }) // @ts-expect-error @@ -217,12 +204,14 @@ const GroupByTagDialog = observer(function (props: { pileupDisplay: { displayId: `${t2}-LinearAlignmentsDisplay-LinearPileupDisplay`, type: 'LinearPileupDisplay', - filterBy: { - flagInclude: 0, - flagExclude: 1556, - }, + filterBy: posFlags, }, }, + { + displayId: `${t2}-LinearSNPCoverageDisplay`, + type: 'LinearSNPCoverageDisplay', + filterBy: posFlags, + }, ], }) view.showTrack(t1) diff --git a/plugins/alignments/src/LinearReadArcsDisplay/configSchema.ts b/plugins/alignments/src/LinearReadArcsDisplay/configSchema.ts index 3ba8e453a2..e5b3ff90cd 100644 --- a/plugins/alignments/src/LinearReadArcsDisplay/configSchema.ts +++ b/plugins/alignments/src/LinearReadArcsDisplay/configSchema.ts @@ -1,7 +1,6 @@ import PluginManager from '@jbrowse/core/PluginManager' import { ConfigurationSchema } from '@jbrowse/core/configuration' import { linearBasicDisplayConfigSchemaFactory } from '@jbrowse/plugin-linear-genome-view' -import { types } from 'mobx-state-tree' import { defaultFilterFlags } from '../shared/util' /** diff --git a/plugins/alignments/src/LinearReadCloudDisplay/model.ts b/plugins/alignments/src/LinearReadCloudDisplay/model.ts index 68895b6854..48625055bb 100644 --- a/plugins/alignments/src/LinearReadCloudDisplay/model.ts +++ b/plugins/alignments/src/LinearReadCloudDisplay/model.ts @@ -19,7 +19,6 @@ import FilterListIcon from '@mui/icons-material/ClearAll' // locals import { ColorBy, FilterBy } from '../shared/types' import { ChainData } from '../shared/fetchChains' -import { defaultFilterFlags } from '../shared/util' // async const FilterByTagDialog = lazy( diff --git a/plugins/alignments/src/LinearSNPCoverageDisplay/configSchema.ts b/plugins/alignments/src/LinearSNPCoverageDisplay/configSchema.ts index 17db5c43f0..d873416ef7 100644 --- a/plugins/alignments/src/LinearSNPCoverageDisplay/configSchema.ts +++ b/plugins/alignments/src/LinearSNPCoverageDisplay/configSchema.ts @@ -2,6 +2,7 @@ import { ConfigurationSchema } from '@jbrowse/core/configuration' import { baseLinearDisplayConfigSchema } from '@jbrowse/plugin-linear-genome-view' import { types } from 'mobx-state-tree' import PluginManager from '@jbrowse/core/PluginManager' +import { defaultFilterFlags } from '../shared/util' /** * #config LinearSNPCoverageDisplay @@ -52,7 +53,8 @@ export default function SNPCoverageConfigFactory(pluginManager: PluginManager) { }, /** * #slot - */ inverted: { + */ + inverted: { type: 'boolean', description: 'draw upside down', defaultValue: false, @@ -73,6 +75,25 @@ export default function SNPCoverageConfigFactory(pluginManager: PluginManager) { 'SNPCoverageRenderer', )!.configSchema, }), + /** + * #slot + */ + colorBy: { + type: 'frozen', + description: 'color scheme to use', + defaultValue: { + type: 'normal', + }, + }, + + /** + * #slot + */ + filterBy: { + type: 'frozen', + description: 'default filters to use', + defaultValue: defaultFilterFlags, + }, }, { /** diff --git a/plugins/alignments/src/LinearSNPCoverageDisplay/model.ts b/plugins/alignments/src/LinearSNPCoverageDisplay/model.ts index 3a987b8c9c..1cfeb9f0d7 100644 --- a/plugins/alignments/src/LinearSNPCoverageDisplay/model.ts +++ b/plugins/alignments/src/LinearSNPCoverageDisplay/model.ts @@ -62,14 +62,11 @@ function stateModelFactory( /** * #property */ - filterBy: types.optional(types.frozen(), { - flagInclude: 0, - flagExclude: 1540, - }), + filterBySetting: types.frozen(), /** * #property */ - colorBy: types.frozen(), + colorBySetting: types.frozen(), /** * #property */ @@ -88,6 +85,21 @@ function stateModelFactory( */ modificationsReady: false, })) + .views(self => ({ + /** + * #getter + */ + get colorBy() { + return self.colorBySetting ?? getConf(self, 'colorBy') + }, + + /** + * #getter + */ + get filterBy() { + return self.filterBySetting ?? getConf(self, 'filterBy') + }, + })) .actions(self => ({ /** * #action @@ -99,7 +111,7 @@ function stateModelFactory( * #action */ setFilterBy(filter: FilterBy) { - self.filterBy = { + self.filterBySetting = { ...filter, } }, @@ -107,7 +119,7 @@ function stateModelFactory( * #action */ setColorScheme(colorBy?: ColorBy) { - self.colorBy = colorBy + self.colorBySetting = colorBy ? { ...colorBy, } diff --git a/plugins/alignments/src/shared/util.ts b/plugins/alignments/src/shared/util.ts index ea5b257549..86e7a73dc9 100644 --- a/plugins/alignments/src/shared/util.ts +++ b/plugins/alignments/src/shared/util.ts @@ -22,6 +22,14 @@ export const defaultFilterFlags = { flagInclude: 0, flagExclude: 1540, } +export const negFlags = { + flagInclude: 16, + flagExclude: 1540, +} +export const posFlags = { + flagInclude: 0, + flagExclude: 1556, +} export function cacheGetter(ctor: { prototype: T }, prop: keyof T): void { const desc = Object.getOwnPropertyDescriptor(ctor.prototype, prop)! diff --git a/test_data/volvox/config.json b/test_data/volvox/config.json index f03e884036..db228fdb93 100644 --- a/test_data/volvox/config.json +++ b/test_data/volvox/config.json @@ -330,7 +330,7 @@ { "type": "AlignmentsTrack", "trackId": "volvox_cram_pileup", - "name": "volvox-sorted.cram (contigA, LinearPileupDisplay, large height)", + "name": "volvox-sorted.cram (contigA, LinearPileupDisplay, large height, colorBy mappingQual)", "category": ["Integration test"], "metadata": { "description": "this is a metadata description", @@ -490,7 +490,7 @@ { "type": "AlignmentsTrack", "trackId": "volvox_alignments", - "name": "volvox-sorted.bam (ctgA, larger default height)", + "name": "volvox-sorted.bam (ctgA, larger default height, colorBy mappingQual)", "category": ["Integration test"], "assemblyNames": ["volvox", "volvox2"], "adapter": { From c471e933893f2f20dde04f96f65478c2603f1217 Mon Sep 17 00:00:00 2001 From: Colin Date: Thu, 21 Nov 2024 00:37:46 -0500 Subject: [PATCH 5/9] Update snaps --- .../AlignmentsFeatureDetail.tsx | 2 +- .../__snapshots__/jbrowseModel.test.ts.snap | 10 ++++++++-- ...loads-alignments-track-crai-404-1-snap.png | Bin 5624 -> 5788 bytes ...mation-pileup-force-load-to-see-1-snap.png | Bin 41868 -> 43893 bytes ...stimation-pileup-zoom-in-to-see-1-snap.png | Bin 30962 -> 32569 bytes 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/plugins/alignments/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx b/plugins/alignments/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx index 035de5da3a..afe1cc8e56 100644 --- a/plugins/alignments/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx +++ b/plugins/alignments/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx @@ -31,7 +31,7 @@ const AlignmentsFeatureDetails = observer(function (props: { key === 'next_segment_position' ? ( diff --git a/products/jbrowse-web/src/__snapshots__/jbrowseModel.test.ts.snap b/products/jbrowse-web/src/__snapshots__/jbrowseModel.test.ts.snap index c898893bdc..85ad15e756 100644 --- a/products/jbrowse-web/src/__snapshots__/jbrowseModel.test.ts.snap +++ b/products/jbrowse-web/src/__snapshots__/jbrowseModel.test.ts.snap @@ -714,6 +714,9 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` ], "displays": [ { + "colorBy": { + "type": "mappingQuality", + }, "displayId": "volvox_cram_pileup_pileup", "height": 400, "type": "LinearPileupDisplay", @@ -743,7 +746,7 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` "subkey": "wow", }, }, - "name": "volvox-sorted.cram (contigA, LinearPileupDisplay, large height)", + "name": "volvox-sorted.cram (contigA, LinearPileupDisplay, large height, colorBy mappingQual)", "trackId": "volvox_cram_pileup", "type": "AlignmentsTrack", }, @@ -997,6 +1000,9 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` "displayId": "volvox_alignments_alignments", "height": 400, "pileupDisplay": { + "colorBy": { + "type": "mappingQuality", + }, "displayId": "volvox_bam_altname_alignments_pileup", "type": "LinearPileupDisplay", }, @@ -1019,7 +1025,7 @@ exports[`JBrowse model creates with non-empty snapshot 1`] = ` "type": "LinearReadCloudDisplay", }, ], - "name": "volvox-sorted.bam (ctgA, larger default height)", + "name": "volvox-sorted.bam (ctgA, larger default height, colorBy mappingQual)", "trackId": "volvox_alignments", "type": "AlignmentsTrack", }, diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/reload-cram-test-tsx-reloads-alignments-track-crai-404-1-snap.png b/products/jbrowse-web/src/tests/__image_snapshots__/reload-cram-test-tsx-reloads-alignments-track-crai-404-1-snap.png index 394c38bf435fd415b632cd75425e64ffb415517a..87600d3e873717cbc2beedc3ea7306c21671c3ab 100644 GIT binary patch literal 5788 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 I%l!BM0vaS0{{R30 diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/stats-estimation-test-tsx-test-stats-estimation-pileup-force-load-to-see-1-snap.png b/products/jbrowse-web/src/tests/__image_snapshots__/stats-estimation-test-tsx-test-stats-estimation-pileup-force-load-to-see-1-snap.png index 91f9170dfbe0e7cb44f11319810746e420ff0d55..93beb8c760d79b07350650dc1f9704b8a96e196f 100644 GIT binary patch literal 43893 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 V{}&b4Z89DFeEiRJe)#FX{(m6_#KZsq diff --git a/products/jbrowse-web/src/tests/__image_snapshots__/stats-estimation-test-tsx-test-stats-estimation-pileup-zoom-in-to-see-1-snap.png b/products/jbrowse-web/src/tests/__image_snapshots__/stats-estimation-test-tsx-test-stats-estimation-pileup-zoom-in-to-see-1-snap.png index f8e4baf8d05b6f185ebf1592b41d1aff850c026b..2ee7ccbfd4976fbb211e792f8f4570d771fcaec1 100644 GIT binary patch literal 32569 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 Date: Thu, 21 Nov 2024 00:40:13 -0500 Subject: [PATCH 6/9] Misc --- products/jbrowse-web/src/tests/Alignments.test.tsx | 2 +- products/jbrowse-web/src/tests/ReadVsRef.test.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/products/jbrowse-web/src/tests/Alignments.test.tsx b/products/jbrowse-web/src/tests/Alignments.test.tsx index c40af48e36..4dfd30896f 100644 --- a/products/jbrowse-web/src/tests/Alignments.test.tsx +++ b/products/jbrowse-web/src/tests/Alignments.test.tsx @@ -33,7 +33,7 @@ test('opens an alignments track and clicks feature', async () => { expectCanvasMatch(await f1.findByTestId(pv('1..4000-0'), ...opts)) expectCanvasMatch(await f2.findByTestId(pv('1..4000-0'), ...opts)) - const track = await findAllByTestId('pileup-overlay') + const track = await findAllByTestId('pileup-overlay-normal') fireEvent.mouseMove(track[0]!, { clientX: 200, clientY: 20 }) fireEvent.click(track[0]!, { clientX: 200, clientY: 40 }) fireEvent.mouseDown(track[0]!, { clientX: 200, clientY: 20 }) diff --git a/products/jbrowse-web/src/tests/ReadVsRef.test.tsx b/products/jbrowse-web/src/tests/ReadVsRef.test.tsx index 310d123223..c7017e3d49 100644 --- a/products/jbrowse-web/src/tests/ReadVsRef.test.tsx +++ b/products/jbrowse-web/src/tests/ReadVsRef.test.tsx @@ -19,7 +19,7 @@ test('launch read vs ref panel', async () => { await findByTestId(hts('volvox_alignments_pileup_coverage'), {}, delay), ) - const track = await findAllByTestId('pileup-overlay', {}, delay) + const track = await findAllByTestId('pileup-overlay-normal', {}, delay) fireEvent.mouseMove(track[0]!, { clientX: 200, clientY: 20 }) fireEvent.click(track[0]!, { clientX: 200, clientY: 40 }) fireEvent.contextMenu(track[0]!, { clientX: 200, clientY: 20 }) @@ -43,7 +43,7 @@ test('launch read vs ref dotplot', async () => { await findByTestId(hts('volvox_alignments_pileup_coverage'), {}, delay), ) - const track = await findAllByTestId('pileup-overlay', {}, delay) + const track = await findAllByTestId('pileup-overlay-normal', {}, delay) fireEvent.mouseMove(track[0]!, { clientX: 200, clientY: 20 }) fireEvent.click(track[0]!, { clientX: 200, clientY: 40 }) fireEvent.contextMenu(track[0]!, { clientX: 200, clientY: 20 }) From 5205d2cbfa3f4cd77e4ec64fe642dde78c58a24d Mon Sep 17 00:00:00 2001 From: Colin Date: Thu, 21 Nov 2024 00:45:46 -0500 Subject: [PATCH 7/9] Normal --- plugins/alignments/src/LinearReadArcsDisplay/model.ts | 7 +------ products/jbrowse-web/src/tests/AlignmentsFilters.test.tsx | 2 +- products/jbrowse-web/src/tests/AlignmentsSort.test.tsx | 4 ++-- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/plugins/alignments/src/LinearReadArcsDisplay/model.ts b/plugins/alignments/src/LinearReadArcsDisplay/model.ts index f60b119108..7457997f62 100644 --- a/plugins/alignments/src/LinearReadArcsDisplay/model.ts +++ b/plugins/alignments/src/LinearReadArcsDisplay/model.ts @@ -52,11 +52,6 @@ function stateModelFactory(configSchema: AnyConfigurationSchemaType) { */ configuration: ConfigurationReference(configSchema), - /** - * #property - */ - filterBy: types.optional(types.frozen(), defaultFilterFlags), - /** * #property */ @@ -193,7 +188,7 @@ function stateModelFactory(configSchema: AnyConfigurationSchemaType) { * #action */ setFilterBy(filter: FilterBy) { - self.filterBy = { + self.filterBySetting = { ...filter, } }, diff --git a/products/jbrowse-web/src/tests/AlignmentsFilters.test.tsx b/products/jbrowse-web/src/tests/AlignmentsFilters.test.tsx index 6cece108d4..95cc3e6eb1 100644 --- a/products/jbrowse-web/src/tests/AlignmentsFilters.test.tsx +++ b/products/jbrowse-web/src/tests/AlignmentsFilters.test.tsx @@ -36,7 +36,7 @@ async function testFilterTrack( ) await user.type(await screen.findByPlaceholderText('Enter tag value'), value) await user.click(await screen.findByText('Submit')) - await screen.findAllByTestId(`pileup-overlay-${tag}`, ...opts) + await screen.findAllByTestId(`pileup-overlay-normal-${tag}`, ...opts) const f1 = within(await screen.findByTestId('Blockset-pileup')) expectCanvasMatch(await f1.findByTestId(pv(key), ...opts)) } diff --git a/products/jbrowse-web/src/tests/AlignmentsSort.test.tsx b/products/jbrowse-web/src/tests/AlignmentsSort.test.tsx index b243731423..f6666c3303 100644 --- a/products/jbrowse-web/src/tests/AlignmentsSort.test.tsx +++ b/products/jbrowse-web/src/tests/AlignmentsSort.test.tsx @@ -32,12 +32,12 @@ test('selects a sort, sort by base pair', async () => { await user.click(await screen.findByTestId('track_menu_icon', ...opts)) await user.click(await screen.findByText('Sort by...')) await user.click(await screen.findByText('Base pair')) - await screen.findAllByTestId('pileup-overlay-Base pair', ...opts) + await screen.findAllByTestId('pileup-overlay-Base pair-normal', ...opts) const f1 = within(await screen.findByTestId('Blockset-pileup')) expectCanvasMatch(await f1.findByTestId(pv('13196..13230-0'), ...opts)) await new Promise(resolve => setTimeout(resolve, 1000)) await user.click(await screen.findByTestId('zoom_out')) - await screen.findAllByTestId('pileup-overlay-Base pair', ...opts) + await screen.findAllByTestId('pileup-overlay-Base pair-normal', ...opts) const f2 = within(await screen.findByTestId('Blockset-pileup')) expectCanvasMatch(await f2.findByTestId(pv('13161..13230-0'), ...opts)) }, 35000) From 1602e74935ec8768cd45c4e2b5931822e81ebb8b Mon Sep 17 00:00:00 2001 From: Colin Date: Thu, 21 Nov 2024 01:05:55 -0500 Subject: [PATCH 8/9] Updates --- .../src/LinearReadArcsDisplay/configSchema.ts | 2 +- .../src/LinearReadCloudDisplay/configSchema.ts | 15 +++------------ 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/plugins/alignments/src/LinearReadArcsDisplay/configSchema.ts b/plugins/alignments/src/LinearReadArcsDisplay/configSchema.ts index e5b3ff90cd..99041894aa 100644 --- a/plugins/alignments/src/LinearReadArcsDisplay/configSchema.ts +++ b/plugins/alignments/src/LinearReadArcsDisplay/configSchema.ts @@ -43,7 +43,7 @@ function configSchemaF(pluginManager: PluginManager) { */ colorBy: { type: 'frozen', - defaultValue: { type: 'normal' }, + defaultValue: { type: 'insertSizeAndOrientation' }, }, /** * #slot diff --git a/plugins/alignments/src/LinearReadCloudDisplay/configSchema.ts b/plugins/alignments/src/LinearReadCloudDisplay/configSchema.ts index 89d47a7b82..18d8fe9d4a 100644 --- a/plugins/alignments/src/LinearReadCloudDisplay/configSchema.ts +++ b/plugins/alignments/src/LinearReadCloudDisplay/configSchema.ts @@ -30,18 +30,9 @@ function configSchemaF(pluginManager: PluginManager) { /** * #slot */ - colorScheme: { - type: 'stringEnum', - model: types.enumeration('colorScheme', [ - 'strand', - 'normal', - 'insertSize', - 'insertSizeAndOrientation', - 'mappingQuality', - 'tag', - ]), - description: 'color scheme to use', - defaultValue: 'normal', + colorBy: { + type: 'frozen', + defaultValue: { type: 'insertSizeAndOrientation' }, }, }, { From c4c7c5b3b9b2cc15a4e1472ea620707843d58f61 Mon Sep 17 00:00:00 2001 From: Colin Date: Thu, 21 Nov 2024 10:35:31 -0500 Subject: [PATCH 9/9] Misc --- .../assemblyManager/assemblyConfigSchema.ts | 17 ++++--- .../core/assemblyManager/assemblyManager.ts | 13 +++--- .../src/RootModel/BaseRootModel.ts | 15 +++++++ .../__snapshots__/index.test.tsx.snap | 5 +-- .../src/LinearReadArcsDisplay/model.ts | 1 - .../LinearReadCloudDisplay/configSchema.ts | 1 - .../src/AssemblyManager/AssemblyManager.tsx | 2 +- .../src/createModel/createModel.ts | 44 +++++++++++++------ 8 files changed, 68 insertions(+), 30 deletions(-) diff --git a/packages/core/assemblyManager/assemblyConfigSchema.ts b/packages/core/assemblyManager/assemblyConfigSchema.ts index a5e78d0e2a..0392fb5343 100644 --- a/packages/core/assemblyManager/assemblyConfigSchema.ts +++ b/packages/core/assemblyManager/assemblyConfigSchema.ts @@ -54,10 +54,13 @@ function assemblyConfigSchema(pluginManager: PluginManager) { { preProcessSnapshot: snap => { // allow refNameAliases to be unspecified - if (!snap.adapter) { - return { adapter: { type: 'RefNameAliasAdapter' } } - } - return snap + return !snap.adapter + ? { + adapter: { + type: 'RefNameAliasAdapter', + }, + } + : snap }, }, ), @@ -75,7 +78,11 @@ function assemblyConfigSchema(pluginManager: PluginManager) { preProcessSnapshot: snap => { // allow cytoBand to be unspecified return !snap.adapter - ? { adapter: { type: 'CytobandAdapter' } } + ? { + adapter: { + type: 'CytobandAdapter', + }, + } : snap }, }, diff --git a/packages/core/assemblyManager/assemblyManager.ts b/packages/core/assemblyManager/assemblyManager.ts index 1e2d3bafdd..e7d669bf46 100644 --- a/packages/core/assemblyManager/assemblyManager.ts +++ b/packages/core/assemblyManager/assemblyManager.ts @@ -32,6 +32,9 @@ function assemblyManagerFactory(conf: IAnyType, pm: PluginManager) { assemblies: types.array(assemblyFactory(conf, pm)), }) .views(self => ({ + /** + * #getter + */ get assemblyNameMap() { const obj = {} as Record for (const assembly of self.assemblies) { @@ -59,12 +62,10 @@ function assemblyManagerFactory(conf: IAnyType, pm: PluginManager) { /** * #getter - * looks at jbrowse.assemblies, session.sessionAssemblies, and - * session.temporaryAssemblies to load from + * combined jbrowse.assemblies, session.sessionAssemblies, and + * session.temporaryAssemblies */ get assemblyList() { - // name is the explicit identifier and can be accessed without getConf, - // hence the union with {name:string} const { jbrowse: { assemblies }, session: { sessionAssemblies = [], temporaryAssemblies = [] } = {}, @@ -83,8 +84,8 @@ function assemblyManagerFactory(conf: IAnyType, pm: PluginManager) { .views(self => ({ /** * #method - * use this method instead of assemblyManager.get(assemblyName) - * to get an assembly with regions loaded + * use this method instead of assemblyManager.get(assemblyName) to get an + * assembly with regions loaded */ async waitForAssembly(assemblyName: string) { if (!assemblyName) { diff --git a/packages/product-core/src/RootModel/BaseRootModel.ts b/packages/product-core/src/RootModel/BaseRootModel.ts index 942d84a945..146bddb5c7 100644 --- a/packages/product-core/src/RootModel/BaseRootModel.ts +++ b/packages/product-core/src/RootModel/BaseRootModel.ts @@ -59,6 +59,9 @@ export function BaseRootModelFactory({ ), }) .volatile(self => ({ + /** + * #volatile + */ rpcManager: new RpcManager( pluginManager, self.jbrowse.configuration.rpc, @@ -67,9 +70,21 @@ export function BaseRootModelFactory({ }, ), + /** + * #volatile + */ adminMode: false, + /** + * #volatile + */ error: undefined as unknown, + /** + * #volatile + */ textSearchManager: new TextSearchManager(pluginManager), + /** + * #volatile + */ pluginManager, })) .actions(self => ({ diff --git a/plugins/alignments/src/AlignmentsFeatureDetail/__snapshots__/index.test.tsx.snap b/plugins/alignments/src/AlignmentsFeatureDetail/__snapshots__/index.test.tsx.snap index 763d3e4bf0..3a1b24dd13 100644 --- a/plugins/alignments/src/AlignmentsFeatureDetail/__snapshots__/index.test.tsx.snap +++ b/plugins/alignments/src/AlignmentsFeatureDetail/__snapshots__/index.test.tsx.snap @@ -203,9 +203,8 @@ exports[`open up a widget 1`] = ` class="css-1m8nxnb-field" >
MQ
diff --git a/plugins/alignments/src/LinearReadArcsDisplay/model.ts b/plugins/alignments/src/LinearReadArcsDisplay/model.ts index 7457997f62..44e924db85 100644 --- a/plugins/alignments/src/LinearReadArcsDisplay/model.ts +++ b/plugins/alignments/src/LinearReadArcsDisplay/model.ts @@ -19,7 +19,6 @@ import FilterListIcon from '@mui/icons-material/ClearAll' // locals import { ColorBy, FilterBy } from '../shared/types' import { ChainData } from '../shared/fetchChains' -import { defaultFilterFlags } from '../shared/util' // lazies const FilterByTagDialog = lazy( diff --git a/plugins/alignments/src/LinearReadCloudDisplay/configSchema.ts b/plugins/alignments/src/LinearReadCloudDisplay/configSchema.ts index 18d8fe9d4a..aeff91290f 100644 --- a/plugins/alignments/src/LinearReadCloudDisplay/configSchema.ts +++ b/plugins/alignments/src/LinearReadCloudDisplay/configSchema.ts @@ -1,7 +1,6 @@ import PluginManager from '@jbrowse/core/PluginManager' import { ConfigurationSchema } from '@jbrowse/core/configuration' import { linearBasicDisplayConfigSchemaFactory } from '@jbrowse/plugin-linear-genome-view' -import { types } from 'mobx-state-tree' /** * #config LinearReadCloudDisplay diff --git a/plugins/data-management/src/AssemblyManager/AssemblyManager.tsx b/plugins/data-management/src/AssemblyManager/AssemblyManager.tsx index bd28ca5681..82ce758e25 100644 --- a/plugins/data-management/src/AssemblyManager/AssemblyManager.tsx +++ b/plugins/data-management/src/AssemblyManager/AssemblyManager.tsx @@ -29,10 +29,10 @@ const AssemblyManager = observer(function ({ return ( { onClose(false) }} - title="Assembly manager" > {showAssemblyTable ? ( diff --git a/products/jbrowse-react-linear-genome-view/src/createModel/createModel.ts b/products/jbrowse-react-linear-genome-view/src/createModel/createModel.ts index 130ca83227..2d0fa84a3d 100644 --- a/products/jbrowse-react-linear-genome-view/src/createModel/createModel.ts +++ b/products/jbrowse-react-linear-genome-view/src/createModel/createModel.ts @@ -32,8 +32,7 @@ export default function createModel( ) { const pluginManager = new PluginManager( [...corePlugins, ...runtimePlugins].map(P => new P()), - ) - pluginManager.createPluggableElements() + ).createPluggableElements() const Session = createSessionModel(pluginManager) const assemblyConfig = assemblyConfigSchemaFactory(pluginManager) const AssemblyManager = assemblyManagerFactory(assemblyConfig, pluginManager) @@ -63,17 +62,38 @@ export default function createModel( ), }) .volatile(self => ({ + /** + * #volatile + */ error: undefined as unknown, + /** + * #volatile + */ rpcManager: new RpcManager(pluginManager, self.config.configuration.rpc, { WebWorkerRpcDriver: { makeWorkerInstance, }, MainThreadRpcDriver: {}, }), + /** + * #volatile + */ hydrateFn, + /** + * #volatile + */ createRootFn, + /** + * #volatile + */ textSearchManager: new TextSearchManager(pluginManager), + /** + * #volatile + */ adminMode: false, + /** + * #volatile + */ version, })) .actions(self => ({ @@ -87,9 +107,10 @@ export default function createModel( * #action */ renameCurrentSession(sessionName: string) { - const snapshot = JSON.parse(JSON.stringify(getSnapshot(self.session))) - snapshot.name = sessionName - this.setSession(snapshot) + this.setSession({ + ...JSON.parse(JSON.stringify(getSnapshot(self.session))), + name: sessionName, + }) }, /** * #action @@ -100,21 +121,18 @@ export default function createModel( /** * #action */ - addInternetAccount( - internetAccount: SnapshotIn<(typeof self.internetAccounts)[0]>, - ) { - self.internetAccounts.push(internetAccount) + addInternetAccount(acct: SnapshotIn<(typeof self.internetAccounts)[0]>) { + self.internetAccounts.push(acct) }, /** * #action */ findAppropriateInternetAccount(location: UriLocation) { - // find the existing account selected from menu const selectedId = location.internetAccountId if (selectedId) { - const selectedAccount = self.internetAccounts.find(account => { - return account.internetAccountId === selectedId - }) + const selectedAccount = self.internetAccounts.find( + a => a.internetAccountId === selectedId, + ) if (selectedAccount) { return selectedAccount }