@platforma-sdk/ui-vue 1.41.17 → 1.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +36 -71
- package/.turbo/turbo-type-check.log +1 -1
- package/CHANGELOG.md +18 -0
- package/dist/components/PlAnnotations/components/PlAnnotationsModal.vue2.js +3 -3
- package/dist/components/PlMultiSequenceAlignment/Legend.vue.d.ts +2 -2
- package/dist/components/PlMultiSequenceAlignment/Legend.vue.d.ts.map +1 -1
- package/dist/components/PlMultiSequenceAlignment/Legend.vue2.js +11 -11
- package/dist/components/PlMultiSequenceAlignment/Legend.vue3.js +8 -8
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.d.ts +12 -6
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.d.ts.map +1 -1
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js +80 -65
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js.map +1 -1
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js +14 -12
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js.map +1 -1
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.d.ts +36 -1
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.d.ts.map +1 -1
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js +146 -111
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js.map +1 -1
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue.d.ts +2 -0
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue.d.ts.map +1 -1
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue2.js +71 -68
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue2.js.map +1 -1
- package/dist/components/PlMultiSequenceAlignment/chemical-properties.d.ts +42 -6
- package/dist/components/PlMultiSequenceAlignment/chemical-properties.d.ts.map +1 -1
- package/dist/components/PlMultiSequenceAlignment/chemical-properties.js +96 -130
- package/dist/components/PlMultiSequenceAlignment/chemical-properties.js.map +1 -1
- package/dist/components/PlMultiSequenceAlignment/data.d.ts +3 -9
- package/dist/components/PlMultiSequenceAlignment/data.d.ts.map +1 -1
- package/dist/components/PlMultiSequenceAlignment/data.js +198 -212
- package/dist/components/PlMultiSequenceAlignment/data.js.map +1 -1
- package/dist/components/PlMultiSequenceAlignment/markup.d.ts +7 -5
- package/dist/components/PlMultiSequenceAlignment/markup.d.ts.map +1 -1
- package/dist/components/PlMultiSequenceAlignment/markup.js +47 -26
- package/dist/components/PlMultiSequenceAlignment/markup.js.map +1 -1
- package/dist/components/PlMultiSequenceAlignment/types.d.ts +1 -1
- package/dist/components/PlMultiSequenceAlignment/types.d.ts.map +1 -1
- package/dist/lib/ui/uikit/dist/components/DataTable/TableComponent.vue.js +2 -4
- package/dist/lib/ui/uikit/dist/components/DataTable/TableComponent.vue.js.map +1 -1
- package/dist/lib/ui/uikit/dist/components/DataTable/index.js +2 -2
- package/dist/lib/ui/uikit/dist/components/PlChartHistogram/createGridlines.js +6 -8
- package/dist/lib/ui/uikit/dist/components/PlChartHistogram/createGridlines.js.map +1 -1
- package/dist/lib/ui/uikit/dist/components/PlChartHistogram/createLabels.js.map +1 -1
- package/dist/lib/ui/uikit/dist/components/PlChartHistogram/createSvgContainer.js +5 -7
- package/dist/lib/ui/uikit/dist/components/PlChartHistogram/createSvgContainer.js.map +1 -1
- package/dist/lib/ui/uikit/dist/components/PlChartHistogram/drawBins.js +3 -5
- package/dist/lib/ui/uikit/dist/components/PlChartHistogram/drawBins.js.map +1 -1
- package/dist/lib/ui/uikit/dist/components/PlChartHistogram/histogram.js +19 -21
- package/dist/lib/ui/uikit/dist/components/PlChartHistogram/histogram.js.map +1 -1
- package/dist/lib/ui/uikit/dist/components/PlChartHistogram/normalizeBins.js.map +1 -1
- package/dist/lib/ui/uikit/dist/components/PlSlideModal/PlPureSlideModal.vue.js +2 -4
- package/dist/lib/ui/uikit/dist/components/PlSlideModal/PlPureSlideModal.vue.js.map +1 -1
- package/dist/lib/ui/uikit/dist/index.js +78 -80
- package/dist/lib/ui/uikit/dist/index.js.map +1 -1
- package/dist/lib/ui/uikit/dist/lib/model/common/dist/index.js.map +1 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/rgb.js +7 -7
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/rgb.js.map +1 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/string.js +9 -9
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/string.js.map +1 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-selection@3.0.0/node_modules/d3-selection/src/selection/index.js +51 -55
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-selection@3.0.0/node_modules/d3-selection/src/selection/index.js.map +1 -1
- package/dist/lib/ui/uikit/dist/sdk/model/dist/index.js +1 -1
- package/dist/node_modules/.pnpm/@vueuse_core@13.3.0_vue@3.5.13_typescript@5.6.3_/node_modules/@vueuse/core/index.js +111 -165
- package/dist/node_modules/.pnpm/@vueuse_core@13.3.0_vue@3.5.13_typescript@5.6.3_/node_modules/@vueuse/core/index.js.map +1 -1
- package/dist/node_modules/.pnpm/@vueuse_shared@13.3.0_vue@3.5.13_typescript@5.6.3_/node_modules/@vueuse/shared/index.js +1 -1
- package/dist/sdk/model/dist/index.js +1 -1
- package/package.json +6 -6
- package/src/components/PlMultiSequenceAlignment/Legend.vue +4 -3
- package/src/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue +66 -46
- package/src/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue +85 -34
- package/src/components/PlMultiSequenceAlignment/README.md +10 -8
- package/src/components/PlMultiSequenceAlignment/Toolbar.vue +4 -1
- package/src/components/PlMultiSequenceAlignment/chemical-properties.ts +154 -161
- package/src/components/PlMultiSequenceAlignment/data.ts +65 -85
- package/src/components/PlMultiSequenceAlignment/markup.ts +47 -15
- package/src/components/PlMultiSequenceAlignment/types.ts +1 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-dispatch@3.0.1/node_modules/d3-dispatch/src/dispatch.js +0 -65
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-dispatch@3.0.1/node_modules/d3-dispatch/src/dispatch.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-ease@3.0.1/node_modules/d3-ease/src/cubic.js +0 -7
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-ease@3.0.1/node_modules/d3-ease/src/cubic.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/transform/decompose.js +0 -24
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/transform/decompose.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/transform/index.js +0 -38
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/transform/index.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/transform/parse.js +0 -14
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-interpolate@3.0.1/node_modules/d3-interpolate/src/transform/parse.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-timer@3.0.1/node_modules/d3-timer/src/timeout.js +0 -11
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-timer@3.0.1/node_modules/d3-timer/src/timeout.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-timer@3.0.1/node_modules/d3-timer/src/timer.js +0 -63
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-timer@3.0.1/node_modules/d3-timer/src/timer.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/interrupt.js +0 -19
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/interrupt.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/index.js +0 -6
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/index.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/interrupt.js +0 -10
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/interrupt.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/transition.js +0 -29
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/transition.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/attr.js +0 -50
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/attr.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/attrTween.js +0 -39
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/attrTween.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/delay.js +0 -19
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/delay.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/duration.js +0 -19
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/duration.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/ease.js +0 -15
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/ease.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/easeVarying.js +0 -16
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/easeVarying.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/end.js +0 -17
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/end.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/filter.js +0 -13
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/filter.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/index.js +0 -66
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/index.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/interpolate.js +0 -12
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/interpolate.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/merge.js +0 -14
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/merge.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/on.js +0 -22
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/on.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/remove.js +0 -14
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/remove.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/schedule.js +0 -86
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/schedule.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/select.js +0 -15
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/select.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/selectAll.js +0 -19
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/selectAll.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/selection.js +0 -9
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/selection.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/style.js +0 -46
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/style.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/styleTween.js +0 -24
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/styleTween.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/text.js +0 -19
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/text.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/textTween.js +0 -24
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/textTween.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/transition.js +0 -20
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/transition.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/tween.js +0 -57
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/transition/tween.js.map +0 -1
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-zoom@3.0.0/node_modules/d3-zoom/src/transform.js +0 -44
- package/dist/lib/ui/uikit/dist/node_modules/.pnpm/d3-zoom@3.0.0/node_modules/d3-zoom/src/transform.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.js","sources":["../../../src/components/PlMultiSequenceAlignment/data.ts"],"sourcesContent":["import { isJsonEqual } from '@milaboratories/helpers';\nimport type { ListOptionNormalized } from '@milaboratories/uikit';\nimport {\n type CalculateTableDataRequest,\n type CanonicalizedJson,\n canonicalizeJson,\n createRowSelectionColumn,\n ensureError,\n getAxisId,\n getRawPlatformaInstance,\n isLabelColumn,\n isLinkerColumn,\n type JoinEntry,\n matchAxisId,\n parseJson,\n type PColumnIdAndSpec,\n type PFrameHandle,\n type PlMultiSequenceAlignmentColorSchemeOption,\n type PlMultiSequenceAlignmentSettings,\n type PlSelectionModel,\n type PObjectId,\n type PTableColumnId,\n type PTableSorting,\n pTableValue,\n} from '@platforma-sdk/model';\nimport { ref, watch } from 'vue';\nimport {\n chemicalPropertiesColorMap,\n colorizeSequencesByChemicalProperties,\n} from './chemical-properties';\nimport {\n colorizeSequencesByMarkup,\n type Markup,\n markupAlignedSequence,\n markupColors,\n parseMarkup,\n} from './markup';\nimport { multiSequenceAlignment } from './multi-sequence-alignment';\nimport { getResidueCounts } from './residue-counts';\nimport type { ColorMap, ResidueCounts } from './types';\n\nconst getPFrameDriver = () => getRawPlatformaInstance().pFrameDriver;\n\nexport const sequenceLimit = 1000;\n\nexport const useSequenceColumnsOptions = refreshOnDeepChange(\n getSequenceColumnsOptions,\n);\n\nexport const useLabelColumnsOptions = refreshOnDeepChange(\n getLabelColumnsOptions,\n);\n\nexport const useMarkupColumnsOptions = refreshOnDeepChange(\n getMarkupColumnsOptions,\n);\n\nexport const useMultipleAlignmentData = refreshOnDeepChange(\n getMultipleAlignmentData,\n);\n\nasync function getSequenceColumnsOptions({\n pFrame,\n sequenceColumnPredicate,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnPredicate: (column: PColumnIdAndSpec) => boolean;\n}): Promise<OptionsWithDefaults<PObjectId> | undefined> {\n if (!pFrame) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const options = columns\n .filter((column) => sequenceColumnPredicate(column))\n .map(({ spec, columnId }) => ({\n label: spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n value: columnId,\n }));\n const defaults = options.map(({ value }) => value);\n return { options, defaults };\n}\n\nasync function getLabelColumnsOptions({\n pFrame,\n sequenceColumnIds,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<OptionsWithDefaults<PTableColumnId> | undefined> {\n if (!pFrame || !sequenceColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const optionMap = new Map<CanonicalizedJson<PTableColumnId>, string>();\n\n const sequenceColumnsAxes = new Map(sequenceColumnIds.flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${id}\\`).`);\n }\n return column.spec.axesSpec\n .map((spec) => [canonicalizeJson(getAxisId(spec)), spec]);\n }));\n\n for (const [axisIdJson, axisSpec] of sequenceColumnsAxes.entries()) {\n const axisId = parseJson(axisIdJson);\n const labelColumn = columns.find(({ spec }) =>\n isLabelColumn(spec) && matchAxisId(axisId, getAxisId(spec.axesSpec[0])),\n );\n optionMap.set(\n labelColumn\n ? canonicalizeJson({ type: 'column', id: labelColumn.columnId })\n : canonicalizeJson({ type: 'axis', id: axisId }),\n labelColumn?.spec.annotations?.['pl7.app/label']\n ?? axisSpec.annotations?.['pl7.app/label']\n ?? 'Unlabelled axis',\n );\n }\n\n const { hits: compatibleColumns } = await pFrameDriver.findColumns(pFrame, {\n columnFilter: {},\n compatibleWith: Array.from(\n sequenceColumnsAxes.keys(),\n (axisIdJson) => parseJson(axisIdJson),\n ),\n strictlyCompatible: false,\n });\n\n for (const { columnId, spec } of compatibleColumns) {\n const columnIdJson = canonicalizeJson({ type: 'column', id: columnId });\n if (optionMap.has(columnIdJson)) continue;\n optionMap.set(\n columnIdJson,\n spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n );\n }\n\n const options = Array.from(optionMap).map(\n ([value, label]) => ({ label, value: parseJson(value) }),\n );\n\n const defaults = options\n .filter(({ value }) => {\n if (value.type === 'axis') return true;\n const column = columns.find(({ columnId }) => columnId === value.id);\n return column && isLabelColumn(column.spec);\n })\n .map(({ value }) => value);\n return { options, defaults };\n}\n\nasync function getMarkupColumnsOptions({\n pFrame,\n sequenceColumnIds,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<ListOptionNormalized<PObjectId>[] | undefined> {\n if (!pFrame || sequenceColumnIds?.length !== 1) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const sequenceColumn = columns.find((column) =>\n column.columnId === sequenceColumnIds[0],\n );\n if (!sequenceColumn) {\n throw new Error(\n `Couldn't find sequence column (ID: \\`${sequenceColumnIds[0]}\\`).`,\n );\n }\n return columns\n .filter((column) =>\n column.spec.annotations?.['pl7.app/sequence/isAnnotation'] === 'true'\n && isJsonEqual(sequenceColumn.spec.axesSpec, column.spec.axesSpec)\n && Object.entries(sequenceColumn.spec.domain ?? {}).every((\n [key, value],\n ) => column.spec.domain?.[key] === value),\n ).map(({ columnId, spec }) => ({\n value: columnId,\n label: spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n }));\n}\n\nasync function getMultipleAlignmentData({\n pframe,\n sequenceColumnIds,\n labelColumnIds,\n markupColumnId,\n selection,\n colorScheme,\n alignmentParams,\n}: {\n pframe: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n labelColumnIds: PTableColumnId[] | undefined;\n markupColumnId: PObjectId | undefined;\n selection: PlSelectionModel | undefined;\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n alignmentParams: PlMultiSequenceAlignmentSettings['alignmentParams'];\n}): Promise<MultipleAlignmentData | undefined> {\n if (!pframe || !sequenceColumnIds?.length || !labelColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pframe);\n const linkerColumns = columns.filter((column) => isLinkerColumn(column.spec));\n\n const filterColumn = createRowSelectionColumn({ selection });\n\n // inner join of sequence columns\n let primaryEntry: JoinEntry<PObjectId> = {\n type: 'inner',\n entries: sequenceColumnIds.map((column) => ({\n type: 'column',\n column,\n })),\n };\n\n // if we have linkers, left join them\n if (linkerColumns.length > 0) {\n primaryEntry = {\n type: 'outer',\n primary: primaryEntry,\n secondary: linkerColumns.map(({ columnId }) => ({\n type: 'column',\n column: columnId,\n })),\n };\n }\n\n // inner join with filters\n if (filterColumn) {\n primaryEntry = {\n type: 'inner',\n entries: [\n primaryEntry,\n {\n type: 'inlineColumn',\n column: filterColumn,\n },\n ],\n };\n }\n\n // left join with labels\n const secondaryEntry: JoinEntry<PObjectId>[] = labelColumnIds\n .flatMap((column) => {\n if (column.type !== 'column') return [];\n return { type: 'column', column: column.id };\n });\n\n // and markup\n if (markupColumnId) {\n secondaryEntry.push({ type: 'column', column: markupColumnId });\n }\n\n const sorting: PTableSorting[] = Array.from(\n new Set(sequenceColumnIds.flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: ${id})`);\n }\n return column.spec.axesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)));\n })),\n )\n .sort()\n .map((id) => ({\n column: { type: 'axis', id: parseJson(id) },\n ascending: true,\n naAndAbsentAreLeastValues: true,\n }));\n\n const request: CalculateTableDataRequest<PObjectId> = {\n src: {\n type: 'outer',\n primary: primaryEntry,\n secondary: secondaryEntry,\n },\n filters: [],\n sorting,\n };\n\n const table = await pFrameDriver.calculateTableData(\n pframe,\n JSON.parse(JSON.stringify(request)),\n {\n offset: 0,\n // +1 is a hack to check whether the selection is over the limit\n length: sequenceLimit + 1,\n },\n );\n\n let rowCount = table?.[0].data.data.length ?? 0;\n let exceedsLimit = false;\n if (rowCount > sequenceLimit) {\n rowCount = sequenceLimit;\n exceedsLimit = true;\n }\n\n const sequenceColumns = sequenceColumnIds.map((columnId) => {\n const column = table.find(({ spec }) => spec.id === columnId);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${columnId}\\`).`);\n }\n return column;\n });\n\n const labelColumns = labelColumnIds.map((labelColumn) => {\n const column = table.find(({ spec }) => {\n if (labelColumn.type === 'axis' && spec.type === 'axis') {\n return isJsonEqual(labelColumn.id, spec.id);\n }\n if (labelColumn.type === 'column' && spec.type === 'column') {\n return labelColumn.id === spec.id;\n }\n });\n if (!column) {\n throw new Error(`Couldn't find label column (ID: \\`${labelColumn}\\`).`);\n }\n return column;\n });\n\n const markupColumn = markupColumnId\n && table.find(({ spec }) => spec.id === markupColumnId);\n\n const alignedSequences = await Promise.all(\n sequenceColumns.map((column) =>\n multiSequenceAlignment(\n Array.from(\n { length: rowCount },\n (_, row) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString()\n ?? '',\n ),\n alignmentParams,\n ),\n ),\n );\n\n const sequences = Array.from(\n { length: rowCount },\n (_, row) => alignedSequences.map((column) => column[row]),\n );\n\n const sequenceNames = sequenceColumns.map((column) =>\n column.spec.spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n );\n\n const labels = Array.from(\n { length: rowCount },\n (_, row) =>\n labelColumns.map((column) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString() ?? '',\n ),\n );\n\n const concatenatedSequences = sequences.map((row) => row.join(' '));\n const residueCounts = getResidueCounts(concatenatedSequences);\n\n const result: MultipleAlignmentData = {\n sequences: concatenatedSequences,\n sequenceNames,\n labelsRows: labels,\n exceedsLimit,\n residueCounts,\n };\n\n if (markupColumn) {\n const labels = JSON.parse(\n markupColumn.spec.spec.annotations\n ?.['pl7.app/sequence/annotation/mapping'] ?? '{}',\n );\n const data = Array.from(\n { length: rowCount },\n (_, row) => {\n const markup = parseMarkup(\n pTableValue(markupColumn.data, row, { na: '', absent: '' })\n ?.toString()\n ?? '',\n );\n return markupAlignedSequence(sequences[row][0], markup);\n },\n );\n result.markup = { labels, data };\n }\n\n if (colorScheme.type === 'chemical-properties') {\n const colorMap = chemicalPropertiesColorMap;\n result.highlightImage = {\n blob: await colorizeSequencesByChemicalProperties({\n sequences: concatenatedSequences,\n residueCounts,\n colorMap,\n }),\n colorMap,\n };\n } else if (colorScheme.type === 'markup') {\n const colorMap = Object.fromEntries(\n Object.entries(\n result.markup?.labels ?? {},\n ).map(([id, label], index) => [\n id,\n { label, color: markupColors[index % markupColors.length] },\n ]),\n );\n result.highlightImage = {\n blob: await colorizeSequencesByMarkup({\n markupRows: result.markup?.data ?? [],\n colorMap,\n columnCount: concatenatedSequences.at(0)?.length ?? 0,\n }),\n colorMap,\n };\n }\n\n return result;\n}\n\nfunction refreshOnDeepChange<T, P>(cb: (params: P) => Promise<T>) {\n const data = ref<T>();\n const isLoading = ref(true);\n const error = ref<Error>();\n let requestId: symbol;\n return (paramsGetter: () => P) => {\n watch(paramsGetter, async (params, prevParams) => {\n if (isJsonEqual(params, prevParams)) return;\n const currentRequestId = requestId = Symbol();\n try {\n error.value = undefined;\n isLoading.value = true;\n const result = await cb(params);\n if (currentRequestId === requestId) {\n data.value = result;\n }\n } catch (err) {\n console.error(err);\n if (currentRequestId === requestId) {\n error.value = ensureError(err);\n }\n } finally {\n if (currentRequestId === requestId) {\n isLoading.value = false;\n }\n }\n }, { immediate: true });\n return { data, isLoading, error };\n };\n}\n\ntype MultipleAlignmentData = {\n sequences: string[];\n sequenceNames: string[];\n labelsRows: string[][];\n residueCounts: ResidueCounts;\n markup?: {\n labels: Record<string, string>;\n data: Markup[];\n };\n highlightImage?: {\n blob: Blob;\n colorMap: ColorMap;\n };\n exceedsLimit: boolean;\n};\n\ntype OptionsWithDefaults<T> = {\n options: ListOptionNormalized<T>[];\n defaults: T[];\n};\n"],"names":["getPFrameDriver","getRawPlatformaInstance","sequenceLimit","useSequenceColumnsOptions","refreshOnDeepChange","getSequenceColumnsOptions","useLabelColumnsOptions","getLabelColumnsOptions","useMarkupColumnsOptions","getMarkupColumnsOptions","useMultipleAlignmentData","getMultipleAlignmentData","pFrame","sequenceColumnPredicate","options","column","spec","columnId","_a","defaults","value","sequenceColumnIds","pFrameDriver","columns","optionMap","sequenceColumnsAxes","id","canonicalizeJson","getAxisId","axisIdJson","axisSpec","axisId","parseJson","labelColumn","isLabelColumn","matchAxisId","_b","compatibleColumns","columnIdJson","_c","label","sequenceColumn","isJsonEqual","key","pframe","labelColumnIds","markupColumnId","selection","colorScheme","alignmentParams","linkerColumns","isLinkerColumn","filterColumn","createRowSelectionColumn","primaryEntry","secondaryEntry","sorting","request","table","rowCount","exceedsLimit","sequenceColumns","labelColumns","markupColumn","alignedSequences","multiSequenceAlignment","_","row","pTableValue","sequences","sequenceNames","labels","concatenatedSequences","residueCounts","getResidueCounts","result","data","markup","parseMarkup","markupAlignedSequence","colorMap","chemicalPropertiesColorMap","colorizeSequencesByChemicalProperties","index","markupColors","colorizeSequencesByMarkup","_d","cb","ref","isLoading","error","requestId","paramsGetter","watch","params","prevParams","currentRequestId","err","ensureError"],"mappings":";;;;;;;;AAyCA,MAAMA,IAAkB,MAAMC,EAAA,EAA0B,cAE3CC,IAAgB,KAEhBC,KAA4BC;AAAA,EACvCC;AACF,GAEaC,KAAyBF;AAAA,EACpCG;AACF,GAEaC,KAA0BJ;AAAA,EACrCK;AACF,GAEaC,KAA2BN;AAAA,EACtCO;AACF;AAEA,eAAeN,GAA0B;AAAA,EACvC,QAAAO;AAAA,EACA,yBAAAC;AACF,GAGwD;AACtD,MAAI,CAACD,EAAQ;AAIb,QAAME,KADU,MADKd,EAAgB,EACF,YAAYY,CAAM,GAElD,OAAO,CAACG,MAAWF,EAAwBE,CAAM,CAAC,EAClD,IAAI,CAAC,EAAE,MAAAC,GAAM,UAAAC,QAAgB;;AAAA;AAAA,MAC5B,SAAOC,IAAAF,EAAK,gBAAL,gBAAAE,EAAmB,qBAAoB;AAAA,MAC9C,OAAOD;AAAA,IAAA;AAAA,GACP,GACEE,IAAWL,EAAQ,IAAI,CAAC,EAAE,OAAAM,QAAYA,CAAK;AAC1C,SAAA,EAAE,SAAAN,GAAS,UAAAK,EAAS;AAC7B;AAEA,eAAeZ,GAAuB;AAAA,EACpC,QAAAK;AAAA,EACA,mBAAAS;AACF,GAG6D;;AACvD,MAAA,CAACT,KAAU,CAACS,EAAmB;AAEnC,QAAMC,IAAetB,EAAgB,GAC/BuB,IAAU,MAAMD,EAAa,YAAYV,CAAM,GAC/CY,wBAAgB,IAA+C,GAE/DC,IAAsB,IAAI,IAAIJ,EAAkB,QAAQ,CAACK,MAAO;AAC9D,UAAAX,IAASQ,EAAQ,KAAK,CAAC,EAAE,UAAAN,EAAS,MAAMA,MAAaS,CAAE;AAC7D,QAAI,CAACX;AACH,YAAM,IAAI,MAAM,wCAAwCW,CAAE,MAAM;AAElE,WAAOX,EAAO,KAAK,SAChB,IAAI,CAACC,MAAS,CAACW,EAAiBC,EAAUZ,CAAI,CAAC,GAAGA,CAAI,CAAC;AAAA,EAAA,CAC3D,CAAC;AAEF,aAAW,CAACa,GAAYC,CAAQ,KAAKL,EAAoB,WAAW;AAC5D,UAAAM,IAASC,EAAUH,CAAU,GAC7BI,IAAcV,EAAQ;AAAA,MAAK,CAAC,EAAE,MAAAP,EAAK,MACvCkB,EAAclB,CAAI,KAAKmB,GAAYJ,GAAQH,EAAUZ,EAAK,SAAS,CAAC,CAAC,CAAC;AAAA,IACxE;AACU,IAAAQ,EAAA;AAAA,MACRS,IACIN,EAAiB,EAAE,MAAM,UAAU,IAAIM,EAAY,SAAU,CAAA,IAC7DN,EAAiB,EAAE,MAAM,QAAQ,IAAII,GAAQ;AAAA,QACjDb,IAAAe,KAAA,gBAAAA,EAAa,KAAK,gBAAlB,gBAAAf,EAAgC,uBAC7BkB,IAAAN,EAAS,gBAAT,gBAAAM,EAAuB,qBACvB;AAAA,IACL;AAAA,EAAA;AAGF,QAAM,EAAE,MAAMC,EAAA,IAAsB,MAAMf,EAAa,YAAYV,GAAQ;AAAA,IACzE,cAAc,CAAC;AAAA,IACf,gBAAgB,MAAM;AAAA,MACpBa,EAAoB,KAAK;AAAA,MACzB,CAACI,MAAeG,EAAUH,CAAU;AAAA,IACtC;AAAA,IACA,oBAAoB;AAAA,EAAA,CACrB;AAED,aAAW,EAAE,UAAAZ,GAAU,MAAAD,EAAK,KAAKqB,GAAmB;AAClD,UAAMC,IAAeX,EAAiB,EAAE,MAAM,UAAU,IAAIV,GAAU;AAClE,IAAAO,EAAU,IAAIc,CAAY,KACpBd,EAAA;AAAA,MACRc;AAAA,QACAC,IAAAvB,EAAK,gBAAL,gBAAAuB,EAAmB,qBAAoB;AAAA,IACzC;AAAA,EAAA;AAGF,QAAMzB,IAAU,MAAM,KAAKU,CAAS,EAAE;AAAA,IACpC,CAAC,CAACJ,GAAOoB,CAAK,OAAO,EAAE,OAAAA,GAAO,OAAOR,EAAUZ,CAAK,EAAE;AAAA,EACxD,GAEMD,IAAWL,EACd,OAAO,CAAC,EAAE,OAAAM,QAAY;AACjB,QAAAA,EAAM,SAAS,OAAe,QAAA;AAC5B,UAAAL,IAASQ,EAAQ,KAAK,CAAC,EAAE,UAAAN,QAAeA,MAAaG,EAAM,EAAE;AAC5D,WAAAL,KAAUmB,EAAcnB,EAAO,IAAI;AAAA,EAC3C,CAAA,EACA,IAAI,CAAC,EAAE,OAAAK,EAAA,MAAYA,CAAK;AACpB,SAAA,EAAE,SAAAN,GAAS,UAAAK,EAAS;AAC7B;AAEA,eAAeV,GAAwB;AAAA,EACrC,QAAAG;AAAA,EACA,mBAAAS;AACF,GAG2D;AACzD,MAAI,CAACT,MAAUS,KAAA,gBAAAA,EAAmB,YAAW,EAAG;AAGhD,QAAME,IAAU,MADKvB,EAAgB,EACF,YAAYY,CAAM,GAC/C6B,IAAiBlB,EAAQ;AAAA,IAAK,CAACR,MACnCA,EAAO,aAAaM,EAAkB,CAAC;AAAA,EACzC;AACA,MAAI,CAACoB;AACH,UAAM,IAAI;AAAA,MACR,wCAAwCpB,EAAkB,CAAC,CAAC;AAAA,IAC9D;AAEF,SAAOE,EACJ;AAAA,IAAO,CAACR,MACP;;AAAA,eAAAG,IAAAH,EAAO,KAAK,gBAAZ,gBAAAG,EAA0B,sCAAqC,UAC5DwB,EAAYD,EAAe,KAAK,UAAU1B,EAAO,KAAK,QAAQ,KAC9D,OAAO,QAAQ0B,EAAe,KAAK,UAAU,CAAA,CAAE,EAAE,MAAM,CACxD,CAACE,GAAKvB,CAAK,MACR;;AAAA,iBAAAF,IAAAH,EAAO,KAAK,WAAZ,gBAAAG,EAAqByB,QAASvB;AAAA,OAAK;AAAA;AAAA,IACxC,IAAI,CAAC,EAAE,UAAAH,GAAU,MAAAD,QAAY;;AAAA;AAAA,MAC7B,OAAOC;AAAA,MACP,SAAOC,IAAAF,EAAK,gBAAL,gBAAAE,EAAmB,qBAAoB;AAAA,IAAA;AAAA,GAC9C;AACN;AAEA,eAAeP,GAAyB;AAAA,EACtC,QAAAiC;AAAA,EACA,mBAAAvB;AAAA,EACA,gBAAAwB;AAAA,EACA,gBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,iBAAAC;AACF,GAQ+C;;AAC7C,MAAI,CAACL,KAAU,EAACvB,KAAA,QAAAA,EAAmB,WAAU,CAACwB,EAAgB;AAE9D,QAAMvB,IAAetB,EAAgB,GAC/BuB,IAAU,MAAMD,EAAa,YAAYsB,CAAM,GAC/CM,IAAgB3B,EAAQ,OAAO,CAACR,MAAWoC,EAAepC,EAAO,IAAI,CAAC,GAEtEqC,IAAeC,EAAyB,EAAE,WAAAN,GAAW;AAG3D,MAAIO,IAAqC;AAAA,IACvC,MAAM;AAAA,IACN,SAASjC,EAAkB,IAAI,CAACN,OAAY;AAAA,MAC1C,MAAM;AAAA,MACN,QAAAA;AAAA,IAAA,EACA;AAAA,EACJ;AAGI,EAAAmC,EAAc,SAAS,MACVI,IAAA;AAAA,IACb,MAAM;AAAA,IACN,SAASA;AAAA,IACT,WAAWJ,EAAc,IAAI,CAAC,EAAE,UAAAjC,SAAgB;AAAA,MAC9C,MAAM;AAAA,MACN,QAAQA;AAAA,IAAA,EACR;AAAA,EACJ,IAIEmC,MACaE,IAAA;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,MACPA;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,QAAQF;AAAA,MAAA;AAAA,IACV;AAAA,EAEJ;AAIF,QAAMG,IAAyCV,EAC5C,QAAQ,CAAC9B,MACJA,EAAO,SAAS,WAAiB,CAAC,IAC/B,EAAE,MAAM,UAAU,QAAQA,EAAO,GAAG,CAC5C;AAGH,EAAI+B,KACFS,EAAe,KAAK,EAAE,MAAM,UAAU,QAAQT,GAAgB;AAGhE,QAAMU,IAA2B,MAAM;AAAA,IACrC,IAAI,IAAInC,EAAkB,QAAQ,CAACK,MAAO;AAClC,YAAAX,IAASQ,EAAQ,KAAK,CAAC,EAAE,UAAAN,EAAS,MAAMA,MAAaS,CAAE;AAC7D,UAAI,CAACX;AACH,cAAM,IAAI,MAAM,sCAAsCW,CAAE,GAAG;AAEtD,aAAAX,EAAO,KAAK,SAChB,IAAI,CAACC,MAASW,EAAiBC,EAAUZ,CAAI,CAAC,CAAC;AAAA,IAAA,CACnD,CAAC;AAAA,EAED,EAAA,KACA,EAAA,IAAI,CAACU,OAAQ;AAAA,IACZ,QAAQ,EAAE,MAAM,QAAQ,IAAIM,EAAUN,CAAE,EAAE;AAAA,IAC1C,WAAW;AAAA,IACX,2BAA2B;AAAA,EAAA,EAC3B,GAEE+B,IAAgD;AAAA,IACpD,KAAK;AAAA,MACH,MAAM;AAAA,MACN,SAASH;AAAA,MACT,WAAWC;AAAA,IACb;AAAA,IACA,SAAS,CAAC;AAAA,IACV,SAAAC;AAAA,EACF,GAEME,IAAQ,MAAMpC,EAAa;AAAA,IAC/BsB;AAAA,IACA,KAAK,MAAM,KAAK,UAAUa,CAAO,CAAC;AAAA,IAClC;AAAA,MACE,QAAQ;AAAA;AAAA,MAER,QAAQvD,IAAgB;AAAA,IAAA;AAAA,EAE5B;AAEA,MAAIyD,KAAWD,KAAA,gBAAAA,EAAQ,GAAG,KAAK,KAAK,WAAU,GAC1CE,IAAe;AACnB,EAAID,IAAWzD,MACFyD,IAAAzD,GACI0D,IAAA;AAGjB,QAAMC,IAAkBxC,EAAkB,IAAI,CAACJ,MAAa;AACpD,UAAAF,IAAS2C,EAAM,KAAK,CAAC,EAAE,MAAA1C,QAAWA,EAAK,OAAOC,CAAQ;AAC5D,QAAI,CAACF;AACH,YAAM,IAAI,MAAM,wCAAwCE,CAAQ,MAAM;AAEjE,WAAAF;AAAA,EAAA,CACR,GAEK+C,IAAejB,EAAe,IAAI,CAACZ,MAAgB;AACvD,UAAMlB,IAAS2C,EAAM,KAAK,CAAC,EAAE,MAAA1C,QAAW;AACtC,UAAIiB,EAAY,SAAS,UAAUjB,EAAK,SAAS;AAC/C,eAAO0B,EAAYT,EAAY,IAAIjB,EAAK,EAAE;AAE5C,UAAIiB,EAAY,SAAS,YAAYjB,EAAK,SAAS;AAC1C,eAAAiB,EAAY,OAAOjB,EAAK;AAAA,IACjC,CACD;AACD,QAAI,CAACD;AACH,YAAM,IAAI,MAAM,qCAAqCkB,CAAW,MAAM;AAEjE,WAAAlB;AAAA,EAAA,CACR,GAEKgD,IAAejB,KAChBY,EAAM,KAAK,CAAC,EAAE,MAAA1C,QAAWA,EAAK,OAAO8B,CAAc,GAElDkB,IAAmB,MAAM,QAAQ;AAAA,IACrCH,EAAgB;AAAA,MAAI,CAAC9C,MACnBkD;AAAA,QACE,MAAM;AAAA,UACJ,EAAE,QAAQN,EAAS;AAAA,UACnB,CAACO,GAAGC,MACF;;AAAAC,qBAAAA,IAAAA,EAAYrD,EAAO,MAAMoD,GAAK,EAAE,IAAI,IAAI,QAAQ,GAAA,CAAI,MAApDC,gBAAAA,EAAuD,eACpD;AAAA;AAAA,QACP;AAAA,QACAnB;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ,GAEMoB,IAAY,MAAM;AAAA,IACtB,EAAE,QAAQV,EAAS;AAAA,IACnB,CAACO,GAAGC,MAAQH,EAAiB,IAAI,CAACjD,MAAWA,EAAOoD,CAAG,CAAC;AAAA,EAC1D,GAEMG,IAAgBT,EAAgB;AAAA,IAAI,CAAC9C,MACzC;;AAAA,eAAAG,IAAAH,EAAO,KAAK,KAAK,gBAAjB,gBAAAG,EAA+B,qBAAoB;AAAA;AAAA,EACrD,GAEMqD,IAAS,MAAM;AAAA,IACnB,EAAE,QAAQZ,EAAS;AAAA,IACnB,CAACO,GAAGC,MACFL,EAAa;AAAA,MAAI,CAAC/C,MAAA;;AAChBqD,iBAAAA,IAAAA,EAAYrD,EAAO,MAAMoD,GAAK,EAAE,IAAI,IAAI,QAAQ,IAAI,MAApDC,gBAAAA,EAAuD,eAAc;AAAA;AAAA,IAAA;AAAA,EAE3E,GAEMI,IAAwBH,EAAU,IAAI,CAACF,MAAQA,EAAI,KAAK,GAAG,CAAC,GAC5DM,IAAgBC,GAAiBF,CAAqB,GAEtDG,IAAgC;AAAA,IACpC,WAAWH;AAAA,IACX,eAAAF;AAAA,IACA,YAAYC;AAAA,IACZ,cAAAX;AAAA,IACA,eAAAa;AAAA,EACF;AAEA,MAAIV,GAAc;AAChB,UAAMQ,IAAS,KAAK;AAAA,QAClBrD,IAAA6C,EAAa,KAAK,KAAK,gBAAvB,gBAAA7C,EACK,2CAA0C;AAAA,IACjD,GACM0D,IAAO,MAAM;AAAA,MACjB,EAAE,QAAQjB,EAAS;AAAA,MACnB,CAACO,GAAGC,MAAQ;;AACV,cAAMU,IAASC;AAAA,YACbV,IAAAA,EAAYL,EAAa,MAAMI,GAAK,EAAE,IAAI,IAAI,QAAQ,IAAI,MAA1DC,gBAAAA,EACI,eACC;AAAA,QACP;AACA,eAAOW,GAAsBV,EAAUF,CAAG,EAAE,CAAC,GAAGU,CAAM;AAAA,MAAA;AAAA,IAE1D;AACA,IAAAF,EAAO,SAAS,EAAE,QAAAJ,GAAQ,MAAAK,EAAK;AAAA,EAAA;AAG7B,MAAA5B,EAAY,SAAS,uBAAuB;AAC9C,UAAMgC,IAAWC;AACjB,IAAAN,EAAO,iBAAiB;AAAA,MACtB,MAAM,MAAMO,GAAsC;AAAA,QAChD,WAAWV;AAAA,QACX,eAAAC;AAAA,QACA,UAAAO;AAAA,MAAA,CACD;AAAA,MACD,UAAAA;AAAA,IACF;AAAA,EAAA,WACShC,EAAY,SAAS,UAAU;AACxC,UAAMgC,IAAW,OAAO;AAAA,MACtB,OAAO;AAAA,UACL5C,IAAAuC,EAAO,WAAP,gBAAAvC,EAAe,WAAU,CAAA;AAAA,QACzB,IAAI,CAAC,CAACV,GAAIc,CAAK,GAAG2C,MAAU;AAAA,QAC5BzD;AAAA,QACA,EAAE,OAAAc,GAAO,OAAO4C,EAAaD,IAAQC,EAAa,MAAM,EAAE;AAAA,MAC3D,CAAA;AAAA,IACH;AACA,IAAAT,EAAO,iBAAiB;AAAA,MACtB,MAAM,MAAMU,GAA0B;AAAA,QACpC,cAAY9C,IAAAoC,EAAO,WAAP,gBAAApC,EAAe,SAAQ,CAAC;AAAA,QACpC,UAAAyC;AAAA,QACA,eAAaM,IAAAd,EAAsB,GAAG,CAAC,MAA1B,gBAAAc,EAA6B,WAAU;AAAA,MAAA,CACrD;AAAA,MACD,UAAAN;AAAA,IACF;AAAA,EAAA;AAGK,SAAAL;AACT;AAEA,SAASvE,EAA0BmF,GAA+B;AAChE,QAAMX,IAAOY,EAAO,GACdC,IAAYD,EAAI,EAAI,GACpBE,IAAQF,EAAW;AACrB,MAAAG;AACJ,SAAO,CAACC,OACAC,EAAAD,GAAc,OAAOE,GAAQC,MAAe;AAC5C,QAAArD,EAAYoD,GAAQC,CAAU,EAAG;AAC/B,UAAAC,IAAmBL,IAAY,OAAO;AACxC,QAAA;AACF,MAAAD,EAAM,QAAQ,QACdD,EAAU,QAAQ;AACZ,YAAAd,IAAS,MAAMY,EAAGO,CAAM;AAC9B,MAAIE,MAAqBL,MACvBf,EAAK,QAAQD;AAAA,aAERsB,GAAK;AACZ,cAAQ,MAAMA,CAAG,GACbD,MAAqBL,MACjBD,EAAA,QAAQQ,GAAYD,CAAG;AAAA,IAC/B,UACA;AACA,MAAID,MAAqBL,MACvBF,EAAU,QAAQ;AAAA,IACpB;AAAA,EACF,GACC,EAAE,WAAW,IAAM,GACf,EAAE,MAAAb,GAAM,WAAAa,GAAW,OAAAC,EAAM;AAEpC;"}
|
|
1
|
+
{"version":3,"file":"data.js","sources":["../../../src/components/PlMultiSequenceAlignment/data.ts"],"sourcesContent":["import { isJsonEqual } from '@milaboratories/helpers';\nimport type { ListOptionNormalized } from '@milaboratories/uikit';\nimport {\n type CalculateTableDataRequest,\n type CanonicalizedJson,\n canonicalizeJson,\n createRowSelectionColumn,\n ensureError,\n getAxisId,\n getRawPlatformaInstance,\n isLabelColumn,\n isLinkerColumn,\n type JoinEntry,\n matchAxisId,\n parseJson,\n type PColumnIdAndSpec,\n type PFrameHandle,\n type PlMultiSequenceAlignmentColorSchemeOption,\n type PlMultiSequenceAlignmentSettings,\n type PlSelectionModel,\n type PObjectId,\n type PTableColumnId,\n type PTableSorting,\n pTableValue,\n} from '@platforma-sdk/model';\nimport { ref, watch } from 'vue';\nimport { highlightByChemicalProperties } from './chemical-properties';\nimport {\n highlightByMarkup,\n markupAlignedSequence,\n parseMarkup,\n} from './markup';\nimport { multiSequenceAlignment } from './multi-sequence-alignment';\nimport { getResidueCounts } from './residue-counts';\nimport type { HighlightLegend, ResidueCounts } from './types';\n\nconst getPFrameDriver = () => getRawPlatformaInstance().pFrameDriver;\n\nexport const sequenceLimit = 1000;\n\nexport const useSequenceColumnsOptions = refreshOnDeepChange(\n getSequenceColumnsOptions,\n);\n\nexport const useLabelColumnsOptions = refreshOnDeepChange(\n getLabelColumnsOptions,\n);\n\nexport const useMarkupColumnsOptions = refreshOnDeepChange(\n getMarkupColumnsOptions,\n);\n\nexport const useMultipleAlignmentData = refreshOnDeepChange(\n getMultipleAlignmentData,\n);\n\nasync function getSequenceColumnsOptions({\n pFrame,\n sequenceColumnPredicate,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnPredicate: (column: PColumnIdAndSpec) => boolean;\n}): Promise<OptionsWithDefaults<PObjectId> | undefined> {\n if (!pFrame) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const options = columns.values()\n .filter((column) => sequenceColumnPredicate(column))\n .map(({ spec, columnId }) => ({\n label: spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n value: columnId,\n }))\n .toArray();\n const defaults = options.map(({ value }) => value);\n return { options, defaults };\n}\n\nasync function getLabelColumnsOptions({\n pFrame,\n sequenceColumnIds,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<OptionsWithDefaults<PTableColumnId> | undefined> {\n if (!pFrame || !sequenceColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const optionMap = new Map<CanonicalizedJson<PTableColumnId>, string>();\n\n const sequenceColumnsAxes = new Map(\n sequenceColumnIds.values().flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${id}\\`).`);\n }\n return column.spec.axesSpec.values()\n .map((spec) => [canonicalizeJson(getAxisId(spec)), spec]);\n }),\n );\n\n for (const [axisIdJson, axisSpec] of sequenceColumnsAxes.entries()) {\n const axisId = parseJson(axisIdJson);\n const labelColumn = columns.find(({ spec }) =>\n isLabelColumn(spec) && matchAxisId(axisId, getAxisId(spec.axesSpec[0])),\n );\n optionMap.set(\n labelColumn\n ? canonicalizeJson({ type: 'column', id: labelColumn.columnId })\n : canonicalizeJson({ type: 'axis', id: axisId }),\n labelColumn?.spec.annotations?.['pl7.app/label']\n ?? axisSpec.annotations?.['pl7.app/label']\n ?? 'Unlabelled axis',\n );\n }\n\n const { hits: compatibleColumns } = await pFrameDriver.findColumns(pFrame, {\n columnFilter: {},\n compatibleWith: sequenceColumnsAxes.keys()\n .map((axisIdJson) => parseJson(axisIdJson))\n .toArray(),\n strictlyCompatible: false,\n });\n\n for (const { columnId, spec } of compatibleColumns) {\n const columnIdJson = canonicalizeJson({ type: 'column', id: columnId });\n if (optionMap.has(columnIdJson)) continue;\n optionMap.set(\n columnIdJson,\n spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n );\n }\n\n const options = optionMap.entries()\n .map(([value, label]) => ({ label, value: parseJson(value) }))\n .toArray();\n\n const defaults = options.values()\n .filter(({ value }) => {\n if (value.type === 'axis') return true;\n const column = columns.find(({ columnId }) => columnId === value.id);\n return column && isLabelColumn(column.spec);\n })\n .map(({ value }) => value)\n .toArray();\n return { options, defaults };\n}\n\nasync function getMarkupColumnsOptions({\n pFrame,\n sequenceColumnIds,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<ListOptionNormalized<PObjectId>[] | undefined> {\n if (!pFrame || sequenceColumnIds?.length !== 1) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const sequenceColumn = columns.find((column) =>\n column.columnId === sequenceColumnIds[0],\n );\n if (!sequenceColumn) {\n throw new Error(\n `Couldn't find sequence column (ID: \\`${sequenceColumnIds[0]}\\`).`,\n );\n }\n return columns.values()\n .filter((column) =>\n column.spec.annotations?.['pl7.app/sequence/isAnnotation'] === 'true'\n && isJsonEqual(sequenceColumn.spec.axesSpec, column.spec.axesSpec)\n && Object.entries(sequenceColumn.spec.domain ?? {}).every((\n [key, value],\n ) => column.spec.domain?.[key] === value),\n ).map(({ columnId, spec }) => ({\n value: columnId,\n label: spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n }))\n .toArray();\n}\n\nasync function getMultipleAlignmentData({\n pframe,\n sequenceColumnIds,\n labelColumnIds,\n selection,\n colorScheme,\n alignmentParams,\n}: {\n pframe: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n labelColumnIds: PTableColumnId[] | undefined;\n selection: PlSelectionModel | undefined;\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n alignmentParams: PlMultiSequenceAlignmentSettings['alignmentParams'];\n}): Promise<MultipleAlignmentData | undefined> {\n if (!pframe || !sequenceColumnIds?.length || !labelColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pframe);\n const linkerColumns = columns.filter((column) => isLinkerColumn(column.spec));\n\n const filterColumn = createRowSelectionColumn({ selection });\n\n // inner join of sequence columns\n let primaryEntry: JoinEntry<PObjectId> = {\n type: 'inner',\n entries: sequenceColumnIds.map((column) => ({\n type: 'column',\n column,\n })),\n };\n\n // if we have linkers, left join them\n if (linkerColumns.length > 0) {\n primaryEntry = {\n type: 'outer',\n primary: primaryEntry,\n secondary: linkerColumns.map(({ columnId }) => ({\n type: 'column',\n column: columnId,\n })),\n };\n }\n\n // inner join with filters\n if (filterColumn) {\n primaryEntry = {\n type: 'inner',\n entries: [\n primaryEntry,\n {\n type: 'inlineColumn',\n column: filterColumn,\n },\n ],\n };\n }\n\n // left join with labels\n const secondaryEntry: JoinEntry<PObjectId>[] = labelColumnIds\n .flatMap((column) => {\n if (column.type !== 'column') return [];\n return { type: 'column', column: column.id };\n });\n\n // and markup\n if (colorScheme.type === 'markup') {\n secondaryEntry.push({ type: 'column', column: colorScheme.columnId });\n }\n\n const sorting: PTableSorting[] = Array.from(\n new Set(\n sequenceColumnIds.values().flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: ${id})`);\n }\n return column.spec.axesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)));\n }),\n ),\n )\n .sort()\n .map((id) => ({\n column: { type: 'axis', id: parseJson(id) },\n ascending: true,\n naAndAbsentAreLeastValues: true,\n }));\n\n const request: CalculateTableDataRequest<PObjectId> = {\n src: {\n type: 'outer',\n primary: primaryEntry,\n secondary: secondaryEntry,\n },\n filters: [],\n sorting,\n };\n\n const table = await pFrameDriver.calculateTableData(\n pframe,\n JSON.parse(JSON.stringify(request)),\n {\n offset: 0,\n // +1 is a hack to check whether the selection is over the limit\n length: sequenceLimit + 1,\n },\n );\n\n let rowCount = table?.[0].data.data.length ?? 0;\n let exceedsLimit = false;\n if (rowCount > sequenceLimit) {\n rowCount = sequenceLimit;\n exceedsLimit = true;\n }\n\n const sequenceColumns = sequenceColumnIds.map((columnId) => {\n const column = table.find(({ spec }) => spec.id === columnId);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${columnId}\\`).`);\n }\n return column;\n });\n\n const labelColumns = labelColumnIds.map((labelColumn) => {\n const column = table.find(({ spec }) => {\n if (labelColumn.type === 'axis' && spec.type === 'axis') {\n return isJsonEqual(labelColumn.id, spec.id);\n }\n if (labelColumn.type === 'column' && spec.type === 'column') {\n return labelColumn.id === spec.id;\n }\n });\n if (!column) {\n throw new Error(`Couldn't find label column (ID: \\`${labelColumn}\\`).`);\n }\n return column;\n });\n\n const alignedSequences = await Promise.all(\n sequenceColumns.map((column) =>\n multiSequenceAlignment(\n Array.from(\n { length: rowCount },\n (_, row) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString()\n ?? '',\n ),\n alignmentParams,\n ),\n ),\n );\n\n const sequences = Array.from(\n { length: rowCount },\n (_, row) => alignedSequences.map((column) => column[row]),\n );\n\n const sequenceNames = sequenceColumns.map((column) =>\n column.spec.spec.annotations?.['pl7.app/label'] ?? 'Unlabelled column',\n );\n\n const labels = Array.from(\n { length: rowCount },\n (_, row) =>\n labelColumns.map((column) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString() ?? '',\n ),\n );\n\n const concatenatedSequences = sequences.map((row) => row.join(' '));\n const residueCounts = getResidueCounts(concatenatedSequences);\n\n const result: MultipleAlignmentData = {\n sequences: concatenatedSequences,\n sequenceNames,\n labelRows: labels,\n exceedsLimit,\n residueCounts,\n };\n\n if (colorScheme.type === 'chemical-properties') {\n result.highlightImage = highlightByChemicalProperties({\n sequences: concatenatedSequences,\n residueCounts,\n });\n } else if (colorScheme.type === 'markup') {\n const markupColumn = table.find(({ spec }) =>\n spec.id === colorScheme.columnId,\n );\n if (!markupColumn) {\n throw new Error(\n `Couldn't find markup column (ID: \\`${colorScheme.columnId}\\`).`,\n );\n }\n const markupRows = Array.from(\n { length: rowCount },\n (_, row) => {\n const markup = parseMarkup(\n pTableValue(markupColumn.data, row, { na: '', absent: '' })\n ?.toString()\n ?? '',\n );\n return markupAlignedSequence(sequences[row][0], markup);\n },\n );\n const labels: Record<string, string> = JSON.parse(\n markupColumn.spec.spec.annotations\n ?.['pl7.app/sequence/annotation/mapping'] ?? '{}',\n );\n result.highlightImage = highlightByMarkup({\n markupRows,\n columnCount: concatenatedSequences.at(0)?.length ?? 0,\n labels,\n });\n }\n\n return result;\n}\n\nfunction refreshOnDeepChange<T, P>(cb: (params: P) => Promise<T>) {\n const data = ref<T>();\n const isLoading = ref(true);\n const error = ref<Error>();\n let requestId: symbol;\n return (paramsGetter: () => P) => {\n watch(paramsGetter, async (params, prevParams) => {\n if (isJsonEqual(params, prevParams)) return;\n const currentRequestId = requestId = Symbol();\n try {\n error.value = undefined;\n isLoading.value = true;\n const result = await cb(params);\n if (currentRequestId === requestId) {\n data.value = result;\n }\n } catch (err) {\n console.error(err);\n if (currentRequestId === requestId) {\n error.value = ensureError(err);\n }\n } finally {\n if (currentRequestId === requestId) {\n isLoading.value = false;\n }\n }\n }, { immediate: true });\n return { data, isLoading, error };\n };\n}\n\ntype MultipleAlignmentData = {\n sequences: string[];\n sequenceNames: string[];\n labelRows: string[][];\n residueCounts: ResidueCounts;\n highlightImage?: {\n blob: Blob;\n legend: HighlightLegend;\n };\n exceedsLimit: boolean;\n};\n\ntype OptionsWithDefaults<T> = {\n options: ListOptionNormalized<T>[];\n defaults: T[];\n};\n"],"names":["getPFrameDriver","getRawPlatformaInstance","sequenceLimit","useSequenceColumnsOptions","refreshOnDeepChange","getSequenceColumnsOptions","useLabelColumnsOptions","getLabelColumnsOptions","useMarkupColumnsOptions","getMarkupColumnsOptions","useMultipleAlignmentData","getMultipleAlignmentData","pFrame","sequenceColumnPredicate","options","column","spec","columnId","_a","defaults","value","sequenceColumnIds","pFrameDriver","columns","optionMap","sequenceColumnsAxes","id","canonicalizeJson","getAxisId","axisIdJson","axisSpec","axisId","parseJson","labelColumn","isLabelColumn","matchAxisId","_b","compatibleColumns","columnIdJson","_c","label","sequenceColumn","isJsonEqual","key","pframe","labelColumnIds","selection","colorScheme","alignmentParams","linkerColumns","isLinkerColumn","filterColumn","createRowSelectionColumn","primaryEntry","secondaryEntry","sorting","request","table","rowCount","exceedsLimit","sequenceColumns","labelColumns","alignedSequences","multiSequenceAlignment","_","row","pTableValue","sequences","sequenceNames","labels","concatenatedSequences","residueCounts","getResidueCounts","result","highlightByChemicalProperties","markupColumn","markupRows","markup","parseMarkup","markupAlignedSequence","highlightByMarkup","cb","data","ref","isLoading","error","requestId","paramsGetter","watch","params","prevParams","currentRequestId","err","ensureError"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { HighlightLegend } from './types';
|
|
2
2
|
export type Markup = {
|
|
3
3
|
id: string;
|
|
4
4
|
start: number;
|
|
@@ -6,10 +6,12 @@ export type Markup = {
|
|
|
6
6
|
}[];
|
|
7
7
|
export declare function parseMarkup(row: string): Markup;
|
|
8
8
|
export declare function markupAlignedSequence(alignedSequence: string, markup: Markup): Markup;
|
|
9
|
-
export declare function
|
|
9
|
+
export declare function highlightByMarkup({ markupRows, columnCount, labels }: {
|
|
10
10
|
markupRows: Markup[];
|
|
11
11
|
columnCount: number;
|
|
12
|
-
|
|
13
|
-
}):
|
|
14
|
-
|
|
12
|
+
labels: Record<string, string>;
|
|
13
|
+
}): {
|
|
14
|
+
blob: Blob;
|
|
15
|
+
legend: HighlightLegend;
|
|
16
|
+
};
|
|
15
17
|
//# sourceMappingURL=markup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markup.d.ts","sourceRoot":"","sources":["../../../src/components/PlMultiSequenceAlignment/markup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"markup.d.ts","sourceRoot":"","sources":["../../../src/components/PlMultiSequenceAlignment/markup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,MAAM,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC;AAErE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmB/C;AAED,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,GACb,MAAM,CAkBR;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC,GACA;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CA4CzC"}
|
|
@@ -1,40 +1,62 @@
|
|
|
1
|
-
function
|
|
2
|
-
return Array.from(
|
|
1
|
+
function E(o) {
|
|
2
|
+
return Array.from(o.matchAll(
|
|
3
3
|
/(?<id>[^:]*):(?<start>[0-9A-Za-z]*)(?:\+(?<length>[0-9A-Za-z]*))?\|?/g
|
|
4
|
-
)).map((
|
|
5
|
-
const
|
|
4
|
+
)).map((l) => {
|
|
5
|
+
const r = l.groups, n = Number.parseInt(r.start, 36), t = r.length ? Number.parseInt(r.length, 36) : 0;
|
|
6
6
|
return {
|
|
7
|
-
id:
|
|
8
|
-
start:
|
|
7
|
+
id: r.id,
|
|
8
|
+
start: n,
|
|
9
9
|
length: t
|
|
10
10
|
};
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
|
-
function
|
|
14
|
-
const
|
|
15
|
-
(t,
|
|
13
|
+
function f(o, l) {
|
|
14
|
+
const r = o.split("").reduce(
|
|
15
|
+
(t, a, e) => (a !== "-" && t.push(e), t),
|
|
16
16
|
[]
|
|
17
17
|
);
|
|
18
|
-
return
|
|
19
|
-
const
|
|
18
|
+
return l.map((t) => {
|
|
19
|
+
const a = r[t.start], e = r[t.start + t.length - 1] + 1;
|
|
20
20
|
return {
|
|
21
21
|
id: t.id,
|
|
22
|
-
start:
|
|
23
|
-
length:
|
|
22
|
+
start: a,
|
|
23
|
+
length: e - a
|
|
24
24
|
};
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
|
-
function
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
a && (t.fillStyle = a, t.fillRect(c.start, F, c.length, 1));
|
|
27
|
+
function C({ markupRows: o, columnCount: l, labels: r }) {
|
|
28
|
+
const n = /* @__PURE__ */ new Map();
|
|
29
|
+
for (const [e, F] of o.entries())
|
|
30
|
+
for (const { id: s, start: u, length: c } of F) {
|
|
31
|
+
let i = n.get(s);
|
|
32
|
+
i || n.set(s, i = []), i.push({ row: e, start: u, length: c });
|
|
34
33
|
}
|
|
35
|
-
|
|
34
|
+
const t = Object.fromEntries(
|
|
35
|
+
Object.entries(r).filter(([e]) => n.has(e)).map(([e, F], s) => [
|
|
36
|
+
e,
|
|
37
|
+
{
|
|
38
|
+
label: F,
|
|
39
|
+
color: g[s % g.length]
|
|
40
|
+
}
|
|
41
|
+
])
|
|
42
|
+
);
|
|
43
|
+
return { blob: new Blob(
|
|
44
|
+
function* () {
|
|
45
|
+
yield `<svg xmlns="http://www.w3.org/2000/svg" viewBox="${`0 0 ${l} ${o.length * 2}`}" stroke-width="2" preserveAspectRatio="none">`;
|
|
46
|
+
for (const [F, s] of n) {
|
|
47
|
+
const { color: u } = t[F];
|
|
48
|
+
yield `<path stroke="${u}" d="`;
|
|
49
|
+
let c = 0, i = 0;
|
|
50
|
+
for (const { row: d, start: p, length: h } of s)
|
|
51
|
+
yield `m${p - c},${d * 2 + 1 - i}h${h}`, c = p + h, i = d * 2 + 1;
|
|
52
|
+
yield '"/>';
|
|
53
|
+
}
|
|
54
|
+
yield "</svg>";
|
|
55
|
+
}().toArray(),
|
|
56
|
+
{ type: "image/svg+xml" }
|
|
57
|
+
), legend: t };
|
|
36
58
|
}
|
|
37
|
-
const
|
|
59
|
+
const g = [
|
|
38
60
|
"#E5F2FF",
|
|
39
61
|
"#FFE8E8",
|
|
40
62
|
"#F0EBFF",
|
|
@@ -53,9 +75,8 @@ const C = [
|
|
|
53
75
|
"#DEEEEF"
|
|
54
76
|
];
|
|
55
77
|
export {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
l as parseMarkup
|
|
78
|
+
C as highlightByMarkup,
|
|
79
|
+
f as markupAlignedSequence,
|
|
80
|
+
E as parseMarkup
|
|
60
81
|
};
|
|
61
82
|
//# sourceMappingURL=markup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markup.js","sources":["../../../src/components/PlMultiSequenceAlignment/markup.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"markup.js","sources":["../../../src/components/PlMultiSequenceAlignment/markup.ts"],"sourcesContent":["import type { HighlightLegend } from './types';\n\nexport type Markup = { id: string; start: number; length: number }[];\n\nexport function parseMarkup(row: string): Markup {\n return Array.from(row.matchAll(\n /(?<id>[^:]*):(?<start>[0-9A-Za-z]*)(?:\\+(?<length>[0-9A-Za-z]*))?\\|?/g,\n )).map((match) => {\n const matchGroups = match.groups as {\n id: string;\n start: string;\n length: string | undefined;\n };\n const start = Number.parseInt(matchGroups.start, 36);\n const length = matchGroups.length\n ? Number.parseInt(matchGroups.length, 36)\n : 0;\n return {\n id: matchGroups.id,\n start,\n length,\n };\n });\n}\n\nexport function markupAlignedSequence(\n alignedSequence: string,\n markup: Markup,\n): Markup {\n const indexMap = alignedSequence.split('').reduce<number[]>(\n (acc, char, index) => {\n if (char !== '-') acc.push(index);\n return acc;\n },\n [],\n );\n const adjusted = markup.map((segment) => {\n const start = indexMap[segment.start];\n const end = indexMap[segment.start + segment.length - 1] + 1;\n return {\n id: segment.id,\n start: start,\n length: end - start,\n };\n });\n return adjusted;\n}\n\nexport function highlightByMarkup(\n { markupRows, columnCount, labels }: {\n markupRows: Markup[];\n columnCount: number;\n labels: Record<string, string>;\n },\n): { blob: Blob; legend: HighlightLegend } {\n const linesById: Map<string, {\n row: number;\n start: number;\n length: number;\n }[]> = new Map();\n for (const [row, markup] of markupRows.entries()) {\n for (const { id, start, length } of markup) {\n let bucket = linesById.get(id);\n if (!bucket) linesById.set(id, bucket = []);\n bucket.push({ row, start, length });\n }\n }\n const legend: HighlightLegend = Object.fromEntries(\n Object.entries(labels)\n .filter(([id]) => linesById.has(id))\n .map(([id, label], index) => [\n id,\n {\n label,\n color: markupColors[index % markupColors.length],\n },\n ]),\n );\n const blob = new Blob(\n (function*() {\n const viewBox = `0 0 ${columnCount} ${markupRows.length * 2}`;\n yield `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${viewBox}\" stroke-width=\"2\" preserveAspectRatio=\"none\">`;\n for (const [id, lines] of linesById) {\n const { color } = legend[id];\n yield `<path stroke=\"${color}\" d=\"`;\n let x = 0, y = 0;\n for (const { row, start, length } of lines) {\n yield `m${start - x},${row * 2 + 1 - y}h${length}`;\n x = start + length;\n y = row * 2 + 1;\n }\n yield '\"/>';\n }\n yield '</svg>';\n })().toArray(),\n { type: 'image/svg+xml' },\n );\n return { blob, legend };\n}\n\nconst markupColors = [\n '#E5F2FF',\n '#FFE8E8',\n '#F0EBFF',\n '#FFFFE3',\n '#E5F7E5',\n '#FEEAFE',\n '#FDEED6',\n '#E8FDFE',\n '#CCDFF2',\n '#F2CCCD',\n '#D5CCF2',\n '#F2F2CC',\n '#CCF2CC',\n '#F2CCF2',\n '#EFDDBF',\n '#DEEEEF',\n];\n\nif (import.meta.vitest) {\n const { test, expect } = import.meta.vitest;\n test('annotateAlignedRow', () => {\n const alignedSequence\n = 'EVRLVESGGALVQPGGSLRLSCVAASGFTFINNWVTWVRQAPGKGLEWVANIKEDGSQKYYVDSVKGRFTISRDNAEKSVYLQMSSLRVDDTAVYYCAR------------GRAV----D---QWGQGTLVTVSS';\n // 0 10 20 30 40 50 60 70 80 90 100 110 120 130\n // EVRLVESGGALVQPGGSLRLSCVAASGFTFINNWVTWVRQAPGKGLEWVANIKEDGSQKYYVDSVKGRFTISRDNAEKSVYLQMSSLRVDDTAVYYCARGRAVDQWGQGTLVTVSS\n const markup = [\n { id: '1', start: 0, length: 99 },\n { id: '2', start: 99, length: 3 },\n { id: '3', start: 102, length: 14 },\n ];\n const alignedMarkup = markupAlignedSequence(alignedSequence, markup);\n expect(alignedMarkup).toEqual([\n { id: '1', start: 0, length: 99 },\n { id: '2', start: 111, length: 3 },\n { id: '3', start: 114, length: 21 },\n ]);\n });\n}\n"],"names":["parseMarkup","row","match","matchGroups","start","length","markupAlignedSequence","alignedSequence","markup","indexMap","acc","char","index","segment","end","highlightByMarkup","markupRows","columnCount","labels","linesById","id","bucket","legend","label","markupColors","lines","color","x","y"],"mappings":"AAIO,SAASA,EAAYC,GAAqB;AACxC,SAAA,MAAM,KAAKA,EAAI;AAAA,IACpB;AAAA,EAAA,CACD,EAAE,IAAI,CAACC,MAAU;AAChB,UAAMC,IAAcD,EAAM,QAKpBE,IAAQ,OAAO,SAASD,EAAY,OAAO,EAAE,GAC7CE,IAASF,EAAY,SACvB,OAAO,SAASA,EAAY,QAAQ,EAAE,IACtC;AACG,WAAA;AAAA,MACL,IAAIA,EAAY;AAAA,MAChB,OAAAC;AAAA,MACA,QAAAC;AAAA,IACF;AAAA,EAAA,CACD;AACH;AAEgB,SAAAC,EACdC,GACAC,GACQ;AACR,QAAMC,IAAWF,EAAgB,MAAM,EAAE,EAAE;AAAA,IACzC,CAACG,GAAKC,GAAMC,OACND,MAAS,OAASD,EAAA,KAAKE,CAAK,GACzBF;AAAA,IAET,CAAA;AAAA,EACF;AAUO,SATUF,EAAO,IAAI,CAACK,MAAY;AACjC,UAAAT,IAAQK,EAASI,EAAQ,KAAK,GAC9BC,IAAML,EAASI,EAAQ,QAAQA,EAAQ,SAAS,CAAC,IAAI;AACpD,WAAA;AAAA,MACL,IAAIA,EAAQ;AAAA,MACZ,OAAAT;AAAA,MACA,QAAQU,IAAMV;AAAA,IAChB;AAAA,EAAA,CACD;AAEH;AAEO,SAASW,EACd,EAAE,YAAAC,GAAY,aAAAC,GAAa,QAAAC,KAKc;AACnC,QAAAC,wBAIK,IAAI;AACf,aAAW,CAAClB,GAAKO,CAAM,KAAKQ,EAAW;AACrC,eAAW,EAAE,IAAAI,GAAI,OAAAhB,GAAO,QAAAC,EAAA,KAAYG,GAAQ;AACtC,UAAAa,IAASF,EAAU,IAAIC,CAAE;AAC7B,MAAKC,KAAQF,EAAU,IAAIC,GAAIC,IAAS,EAAE,GAC1CA,EAAO,KAAK,EAAE,KAAApB,GAAK,OAAAG,GAAO,QAAAC,GAAQ;AAAA,IAAA;AAGtC,QAAMiB,IAA0B,OAAO;AAAA,IACrC,OAAO,QAAQJ,CAAM,EAClB,OAAO,CAAC,CAACE,CAAE,MAAMD,EAAU,IAAIC,CAAE,CAAC,EAClC,IAAI,CAAC,CAACA,GAAIG,CAAK,GAAGX,MAAU;AAAA,MAC3BQ;AAAA,MACA;AAAA,QACE,OAAAG;AAAA,QACA,OAAOC,EAAaZ,IAAQY,EAAa,MAAM;AAAA,MAAA;AAAA,IAElD,CAAA;AAAA,EACL;AAoBO,SAAA,EAAE,MAnBI,IAAI;AAAA,IACd,aAAY;AAEX,YAAM,oDADU,OAAOP,CAAW,IAAID,EAAW,SAAS,CAAC,EACM;AACjE,iBAAW,CAACI,GAAIK,CAAK,KAAKN,GAAW;AACnC,cAAM,EAAE,OAAAO,EAAA,IAAUJ,EAAOF,CAAE;AAC3B,cAAM,iBAAiBM,CAAK;AACxB,YAAAC,IAAI,GAAGC,IAAI;AACf,mBAAW,EAAE,KAAA3B,GAAK,OAAAG,GAAO,QAAAC,EAAA,KAAYoB;AAC7B,gBAAA,IAAIrB,IAAQuB,CAAC,IAAI1B,IAAM,IAAI,IAAI2B,CAAC,IAAIvB,CAAM,IAChDsB,IAAIvB,IAAQC,GACZuB,IAAI3B,IAAM,IAAI;AAEV,cAAA;AAAA,MAAA;AAEF,YAAA;AAAA,IACR,EAAA,EAAK,QAAQ;AAAA,IACb,EAAE,MAAM,gBAAgB;AAAA,EAC1B,GACe,QAAAqB,EAAO;AACxB;AAEA,MAAME,IAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/PlMultiSequenceAlignment/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/PlMultiSequenceAlignment/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE/E,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC"}
|
|
@@ -17,8 +17,6 @@ import "../../global/resizeObserver.js";
|
|
|
17
17
|
import "../../layout/PlBlockPage/PlBlockPageTitleTeleportId.js";
|
|
18
18
|
import "../PlSvg/registry.js";
|
|
19
19
|
import "../../sdk/model/dist/index.js";
|
|
20
|
-
import "../../node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/index.js";
|
|
21
|
-
import "../../node_modules/.pnpm/d3-zoom@3.0.0/node_modules/d3-zoom/src/transform.js";
|
|
22
20
|
import "../../colors/color.js";
|
|
23
21
|
import "../../colors/gradient.js";
|
|
24
22
|
(function() {
|
|
@@ -75,7 +73,7 @@ import "../../colors/gradient.js";
|
|
|
75
73
|
const q = { class: "command-menu__container" }, _ = {
|
|
76
74
|
key: 0,
|
|
77
75
|
class: "table-body__no-data"
|
|
78
|
-
}, $ = { class: "carets" },
|
|
76
|
+
}, $ = { class: "carets" }, MA = /* @__PURE__ */ H({
|
|
79
77
|
__name: "TableComponent",
|
|
80
78
|
props: {
|
|
81
79
|
settings: {}
|
|
@@ -172,6 +170,6 @@ const q = { class: "command-menu__container" }, _ = {
|
|
|
172
170
|
}
|
|
173
171
|
});
|
|
174
172
|
export {
|
|
175
|
-
|
|
173
|
+
MA as default
|
|
176
174
|
};
|
|
177
175
|
//# sourceMappingURL=TableComponent.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableComponent.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TableComponent.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import a from "./TableComponent.vue.js";
|
|
2
2
|
import { h as s, computed as o, unref as n, reactive as f } from "vue";
|
|
3
3
|
import { RawData as m } from "./adapters/RawData.js";
|
|
4
|
-
import { AsyncData as
|
|
4
|
+
import { AsyncData as d } from "./adapters/AsyncData.js";
|
|
5
5
|
function y(t) {
|
|
6
6
|
return Object.freeze(t);
|
|
7
7
|
}
|
|
@@ -28,7 +28,7 @@ function v(t, r) {
|
|
|
28
28
|
return o(() => s(a, c));
|
|
29
29
|
}
|
|
30
30
|
export {
|
|
31
|
-
|
|
31
|
+
d as AsyncData,
|
|
32
32
|
a as Component,
|
|
33
33
|
D as factory,
|
|
34
34
|
u as rawDataSettings,
|
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
import "../../node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/index.js";
|
|
2
|
-
import "../../node_modules/.pnpm/d3-zoom@3.0.0/node_modules/d3-zoom/src/transform.js";
|
|
3
1
|
import c from "../../node_modules/.pnpm/d3-selection@3.0.0/node_modules/d3-selection/src/selectAll.js";
|
|
4
2
|
import { axisLeft as f, axisBottom as l } from "../../node_modules/.pnpm/d3-axis@3.0.0/node_modules/d3-axis/src/axis.js";
|
|
5
|
-
function
|
|
6
|
-
const { width:
|
|
7
|
-
function
|
|
3
|
+
function d(t, i, r, s) {
|
|
4
|
+
const { width: n, height: a } = i;
|
|
5
|
+
function e() {
|
|
8
6
|
return f(r.y).ticks(6);
|
|
9
7
|
}
|
|
10
|
-
function
|
|
8
|
+
function o() {
|
|
11
9
|
return s(l(r.x));
|
|
12
10
|
}
|
|
13
|
-
t.append("g").attr("class", "grid").attr("font-family", "'Manrope', sans-serif").call(
|
|
11
|
+
t.append("g").attr("class", "grid").attr("font-family", "'Manrope', sans-serif").call(e().tickSize(-n).tickFormat(() => "")), t.append("g").attr("class", "grid").attr("font-family", "'Manrope', sans-serif").attr("transform", `translate(0,${a})`).call(o().tickSize(-a).tickFormat(() => "")), c(".grid line").style("stroke", "#E1E3EB").style("opacity", 0.7);
|
|
14
12
|
}
|
|
15
13
|
export {
|
|
16
|
-
|
|
14
|
+
d as createGridlines
|
|
17
15
|
};
|
|
18
16
|
//# sourceMappingURL=createGridlines.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createGridlines.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/createGridlines.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"createGridlines.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/createGridlines.ts"],"sourcesContent":["import type { ChartOptions, Scales } from './types';\nimport type { Selection } from 'd3-selection';\nimport type { Axis } from 'd3-axis';\nimport type { NumberValue } from 'd3-scale';\nimport { selectAll } from 'd3-selection';\nimport { axisBottom, axisLeft } from 'd3-axis';\n\nexport function createGridlines(\n svg: Selection<SVGGElement, unknown, null, undefined>,\n options: ChartOptions,\n scales: Scales,\n xTicks: (d: Axis<NumberValue>) => Axis<NumberValue>,\n) {\n const { width, height } = options;\n\n function makeYGridlines() {\n return axisLeft(scales.y) // Use the y-scale for horizontal gridlines\n .ticks(6); // Adjust the number of gridlines\n }\n\n function makeXGridlines() {\n return xTicks(axisBottom(scales.x));\n }\n // Append horizontal gridlines\n svg.append('g')\n .attr('class', 'grid') // Add a class for styling\n .attr('font-family', '\\'Manrope\\', sans-serif') // Doesn't work\n .call(makeYGridlines()\n .tickSize(-width) // Extend gridlines across the chart width\n .tickFormat(() => '')); // Remove tick labels\n\n // Append vertical gridlines\n svg.append('g')\n .attr('class', 'grid') // Add a class for styling\n .attr('font-family', '\\'Manrope\\', sans-serif')\n .attr('transform', `translate(0,${height})`) // Position at the bottom of the chart\n .call(makeXGridlines()\n .tickSize(-height) // Extend gridlines across the chart height\n .tickFormat(() => '')); // Remove tick labels\n\n // Style the gridlines using CSS (or inline styles)\n selectAll('.grid line')\n .style('stroke', '#E1E3EB') // Light gray gridlines\n // .style('stroke-dasharray', '2,2') // Dashed gridlines\n .style('opacity', 0.7); // Slightly transparent\n}\n"],"names":["createGridlines","svg","options","scales","xTicks","width","height","makeYGridlines","axisLeft","makeXGridlines","axisBottom","selectAll"],"mappings":";;AAOO,SAASA,EACdC,GACAC,GACAC,GACAC,GACA;AACM,QAAA,EAAE,OAAAC,GAAO,QAAAC,EAAWJ,IAAAA;AAE1B,WAASK,IAAiB;AACxB,WAAOC,EAASL,EAAO,CAAC,EACrB,MAAM,CAAC;AAAA,EAAA;AAGZ,WAASM,IAAiB;AACxB,WAAOL,EAAOM,EAAWP,EAAO,CAAC,CAAC;AAAA,EAAA;AAGhCF,IAAA,OAAO,GAAG,EACX,KAAK,SAAS,MAAM,EACpB,KAAK,eAAe,uBAAyB,EAC7C,KAAKM,EACH,EAAA,SAAS,CAACF,CAAK,EACf,WAAW,MAAM,EAAE,CAAC,GAGrBJ,EAAA,OAAO,GAAG,EACX,KAAK,SAAS,MAAM,EACpB,KAAK,eAAe,uBAAyB,EAC7C,KAAK,aAAa,eAAeK,CAAM,GAAG,EAC1C,KAAKG,EAAA,EACH,SAAS,CAACH,CAAM,EAChB,WAAW,MAAM,EAAE,CAAC,GAGfK,EAAA,YAAY,EACnB,MAAM,UAAU,SAAS,EAEzB,MAAM,WAAW,GAAG;AACzB;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createLabels.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/createLabels.ts"],"sourcesContent":["import type
|
|
1
|
+
{"version":3,"file":"createLabels.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/createLabels.ts"],"sourcesContent":["import type { Selection } from 'd3-selection';\nimport type { ChartOptions } from './types';\n\nexport function createLabels(\n svg: Selection<SVGGElement, unknown, null, undefined>,\n options: ChartOptions,\n) {\n const { height, width, margin, xAxisLabel, yAxisLabel, compact } = options;\n\n if (compact) {\n return;\n }\n\n // X-axis label\n svg.append('text')\n .attr('class', 'x-axis-label')\n .attr('font-weight', 500)\n .attr('text-anchor', 'middle') // Center the text\n .attr('x', width / 2) // Center horizontally\n .attr('y', height + margin.bottom - 5) // Position below the X-axis\n .text(xAxisLabel ?? 'Value Range'); // Set your custom label text\n\n // Y-axis label\n svg.append('text')\n .attr('class', 'y-axis-label')\n .attr('font-weight', 500)\n .attr('text-anchor', 'middle') // Center the text\n .attr('x', -height / 2) // Center vertically (rotated axis)\n .attr('y', -margin.left + 15) // Position to the left of the Y-axis\n .attr('transform', 'rotate(-90)') // Rotate text 90 degrees counter-clockwise\n .text(yAxisLabel ?? 'Frequency'); // Set your custom label text\n}\n"],"names":["createLabels","svg","options","height","width","margin","xAxisLabel","yAxisLabel","compact"],"mappings":"AAGgB,SAAAA,EACdC,GACAC,GACA;AACA,QAAM,EAAE,QAAAC,GAAQ,OAAAC,GAAO,QAAAC,GAAQ,YAAAC,GAAY,YAAAC,GAAY,SAAAC,EAAYN,IAAAA;AAE/DM,EAAAA,MAKJP,EAAI,OAAO,MAAM,EACd,KAAK,SAAS,cAAc,EAC5B,KAAK,eAAe,GAAG,EACvB,KAAK,eAAe,QAAQ,EAC5B,KAAK,KAAKG,IAAQ,CAAC,EACnB,KAAK,KAAKD,IAASE,EAAO,SAAS,CAAC,EACpC,KAAKC,KAAc,aAAa,GAGnCL,EAAI,OAAO,MAAM,EACd,KAAK,SAAS,cAAc,EAC5B,KAAK,eAAe,GAAG,EACvB,KAAK,eAAe,QAAQ,EAC5B,KAAK,KAAK,CAACE,IAAS,CAAC,EACrB,KAAK,KAAK,CAACE,EAAO,OAAO,EAAE,EAC3B,KAAK,aAAa,aAAa,EAC/B,KAAKE,KAAc,WAAW;AACnC;"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import "../../node_modules/.pnpm/d3-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const { width: o, height: e, margin: t, compact: a } = i;
|
|
6
|
-
return r.replaceChildren(), a && (r.style.height = e + "px", r.style.lineHeight = e + "px"), n(r).append("svg").attr("width", o + t.left + t.right).attr("height", e + t.top + t.bottom).append("g").attr("transform", `translate(${t.left},${t.top})`);
|
|
1
|
+
import h from "../../node_modules/.pnpm/d3-selection@3.0.0/node_modules/d3-selection/src/select.js";
|
|
2
|
+
function p(r, a) {
|
|
3
|
+
const { width: n, height: e, margin: t, compact: i } = a;
|
|
4
|
+
return r.replaceChildren(), i && (r.style.height = e + "px", r.style.lineHeight = e + "px"), h(r).append("svg").attr("width", n + t.left + t.right).attr("height", e + t.top + t.bottom).append("g").attr("transform", `translate(${t.left},${t.top})`);
|
|
7
5
|
}
|
|
8
6
|
export {
|
|
9
|
-
|
|
7
|
+
p as createSvgContainer
|
|
10
8
|
};
|
|
11
9
|
//# sourceMappingURL=createSvgContainer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSvgContainer.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/createSvgContainer.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"createSvgContainer.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/createSvgContainer.ts"],"sourcesContent":["import type { ChartOptions } from './types';\nimport { select } from 'd3-selection';\n\nexport function createSvgContainer(el: HTMLElement, options: ChartOptions) {\n const { width, height, margin, compact } = options;\n\n el.replaceChildren();\n\n if (compact) {\n el.style.height = height + 'px';\n el.style.lineHeight = height + 'px';\n }\n\n const svg = select(el) // Append the SVG element to the body\n .append('svg')\n .attr('width', width + margin.left + margin.right) // Set the total width\n .attr('height', height + margin.top + margin.bottom) // Set the total height\n .append('g') // Append a group to handle margins\n .attr('transform', `translate(${margin.left},${margin.top})`);\n\n return svg;\n}\n"],"names":["createSvgContainer","el","options","width","height","margin","compact","select"],"mappings":";AAGgB,SAAAA,EAAmBC,GAAiBC,GAAuB;AACnE,QAAA,EAAE,OAAAC,GAAO,QAAAC,GAAQ,QAAAC,GAAQ,SAAAC,EAAAA,IAAYJ;AAE3CD,SAAAA,EAAG,mBAECK,MACCL,EAAA,MAAM,SAASG,IAAS,MACxBH,EAAA,MAAM,aAAaG,IAAS,OAGrBG,EAAON,CAAE,EAClB,OAAO,KAAK,EACZ,KAAK,SAASE,IAAQE,EAAO,OAAOA,EAAO,KAAK,EAChD,KAAK,UAAUD,IAASC,EAAO,MAAMA,EAAO,MAAM,EAClD,OAAO,GAAG,EACV,KAAK,aAAa,aAAaA,EAAO,IAAI,IAAIA,EAAO,GAAG,GAAG;AAGhE;"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import "../../node_modules/.pnpm/d3-transition@3.0.1_d3-selection@3.0.0/node_modules/d3-transition/src/selection/index.js";
|
|
2
|
-
import "../../node_modules/.pnpm/d3-zoom@3.0.0/node_modules/d3-zoom/src/transform.js";
|
|
3
1
|
import c from "../../node_modules/.pnpm/d3-selection@3.0.0/node_modules/d3-selection/src/select.js";
|
|
4
|
-
function
|
|
5
|
-
const { height: p } =
|
|
2
|
+
function f(l, n, a, r) {
|
|
3
|
+
const { height: p } = a, { x: e, y: s } = r, i = c("body").append("div").attr("class", "svg-tooltip").style("position", "absolute").style("visibility", "hidden"), x = function(t, o) {
|
|
6
4
|
i.style("visibility", "visible").text(`count: ${o.length}
|
|
7
5
|
x0: ${o.x0}
|
|
8
6
|
x1: ${o.x1}`);
|
|
@@ -16,6 +14,6 @@ x1: ${o.x1}`);
|
|
|
16
14
|
`);
|
|
17
15
|
}
|
|
18
16
|
export {
|
|
19
|
-
|
|
17
|
+
f as drawBins
|
|
20
18
|
};
|
|
21
19
|
//# sourceMappingURL=drawBins.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drawBins.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/drawBins.ts"],"sourcesContent":["import type { BinLike, ChartOptions, Scales, SVG } from './types';\nimport
|
|
1
|
+
{"version":3,"file":"drawBins.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/drawBins.ts"],"sourcesContent":["import type { BinLike, ChartOptions, Scales, SVG } from './types';\nimport { select } from 'd3-selection';\n\nexport function drawBins(\n svg: SVG,\n bins: BinLike[],\n dimension: ChartOptions,\n scales: Scales,\n) {\n const { height } = dimension;\n\n const { x, y } = scales;\n\n const tooltip = select('body')\n .append('div')\n .attr('class', 'svg-tooltip')\n .style('position', 'absolute')\n .style('visibility', 'hidden');\n\n // Three function that change the tooltip when user hover / move / leave a cell\n const mouseover = function (_event: MouseEvent, d: BinLike) {\n tooltip\n .style('visibility', 'visible')\n .text(`count: ${d.length}\\nx0: ${d.x0}\\nx1: ${d.x1}`);\n };\n\n const mousemove = function (event: MouseEvent) {\n tooltip\n .style('top', event.pageY - 10 + 'px')\n .style('left', event.pageX + 10 + 'px');\n };\n\n const mouseout = function () {\n tooltip.style('visibility', 'hidden');\n };\n\n // Add rectangles for the histogram bars\n svg.selectAll('rect')\n .data(bins)\n .enter()\n .append('rect')\n .attr('x', (d) => x(d.x0!)) // Position the bar based on the bin start\n .attr('y', (d) => y(d.length)) // Height based on bin count\n .attr('width', (d) => x(d.x1!) - x(d.x0!)) // Bar width based on logarithmic intervals\n .attr('height', (d) => height - y(d.length)) // Invert height to fit SVG coordinate system\n .style('fill', '#929BAD')\n .attr('stroke', '#fff') // Border color\n .attr('stroke-opacity', 0.2)\n .attr('stroke-width', 0.5)\n .on('mouseover', mouseover)\n .on('mousemove', mousemove)\n .on('mouseout', mouseout)\n .append('title').text((d) => `[${d.x0}, ${d.x1}]\\n` + d.length + '\\n'); // Set bar color\n}\n"],"names":["drawBins","svg","bins","dimension","scales","height","x","y","tooltip","select","mouseover","_event","d","mousemove","event","mouseout"],"mappings":";AAGO,SAASA,EACdC,GACAC,GACAC,GACAC,GACA;AACM,QAAA,EAAE,QAAAC,EAAWF,IAAAA,GAEb,EAAE,GAAAG,GAAG,GAAAC,EAAAA,IAAMH,GAEXI,IAAUC,EAAO,MAAM,EAC1B,OAAO,KAAK,EACZ,KAAK,SAAS,aAAa,EAC3B,MAAM,YAAY,UAAU,EAC5B,MAAM,cAAc,QAAQ,GAGzBC,IAAY,SAAUC,GAAoBC,GAAY;AAC1DJ,IAAAA,EACG,MAAM,cAAc,SAAS,EAC7B,KAAK,UAAUI,EAAE,MAAM;AAAA,MAASA,EAAE,EAAE;AAAA,MAASA,EAAE,EAAE,EAAE;AAAA,EAAA,GAGlDC,IAAY,SAAUC,GAAmB;AAC7CN,IAAAA,EACG,MAAM,OAAOM,EAAM,QAAQ,KAAK,IAAI,EACpC,MAAM,QAAQA,EAAM,QAAQ,KAAK,IAAI;AAAA,EAC1C,GAEMC,IAAW,WAAY;AACnBP,IAAAA,EAAA,MAAM,cAAc,QAAQ;AAAA,EACtC;AAGAP,EAAAA,EAAI,UAAU,MAAM,EACjB,KAAKC,CAAI,EACT,MACA,EAAA,OAAO,MAAM,EACb,KAAK,KAAK,CAACU,MAAMN,EAAEM,EAAE,EAAG,CAAC,EACzB,KAAK,KAAK,CAACA,MAAML,EAAEK,EAAE,MAAM,CAAC,EAC5B,KAAK,SAAS,CAACA,MAAMN,EAAEM,EAAE,EAAG,IAAIN,EAAEM,EAAE,EAAG,CAAC,EACxC,KAAK,UAAU,CAACA,MAAMP,IAASE,EAAEK,EAAE,MAAM,CAAC,EAC1C,MAAM,QAAQ,SAAS,EACvB,KAAK,UAAU,MAAM,EACrB,KAAK,kBAAkB,GAAG,EAC1B,KAAK,gBAAgB,GAAG,EACxB,GAAG,aAAaF,CAAS,EACzB,GAAG,aAAaG,CAAS,EACzB,GAAG,YAAYE,CAAQ,EACvB,OAAO,OAAO,EAAE,KAAK,CAACH,MAAM,IAAIA,EAAE,EAAE,KAAKA,EAAE,EAAE;AAAA,IAAQA,EAAE,SAAS;AAAA,CAAI;AACzE;"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import "
|
|
3
|
-
import {
|
|
4
|
-
import { drawBins as y } from "./drawBins.js";
|
|
5
|
-
import { createGridlines as $ } from "./createGridlines.js";
|
|
1
|
+
import { createSvgContainer as $ } from "./createSvgContainer.js";
|
|
2
|
+
import { drawBins as x } from "./drawBins.js";
|
|
3
|
+
import { createGridlines as y } from "./createGridlines.js";
|
|
6
4
|
import { logspace as b } from "./logspace.js";
|
|
7
5
|
import { createLabels as k } from "./createLabels.js";
|
|
8
6
|
import { drawThreshold as u } from "./drawThreshold.js";
|
|
@@ -10,30 +8,30 @@ import { normalizeBins as z } from "./normalizeBins.js";
|
|
|
10
8
|
import w from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/min.js";
|
|
11
9
|
import p from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/max.js";
|
|
12
10
|
import F from "../../node_modules/.pnpm/d3-scale@4.0.2/node_modules/d3-scale/src/symlog.js";
|
|
11
|
+
import { axisBottom as B, axisLeft as S } from "../../node_modules/.pnpm/d3-axis@3.0.0/node_modules/d3-axis/src/axis.js";
|
|
13
12
|
import q from "../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/bin.js";
|
|
14
13
|
import C from "../../node_modules/.pnpm/d3-scale@4.0.2/node_modules/d3-scale/src/linear.js";
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
$(o, i, { x: t, y: n }, (a) => a.ticks(6)), y(o, m, i, { x: t, y: n }), u(o, { x: t, y: n }, i), L(o, l).call(B(t).tickSize(0)), M(o).call(S(n).tickSize(0)), k(o, i);
|
|
14
|
+
const L = (t, i) => t.append("g").style("font-size", "14px").style("font-weight", "500").attr("transform", `translate(0,${i})`), M = (t) => t.append("g").style("font-size", "14px").style("font-weight", "500"), V = (t, i) => C().domain([0, p(t, (r) => r.length)]).range([i, 0]);
|
|
15
|
+
function O(t, i, r) {
|
|
16
|
+
const { width: h, height: l, nBins: s = 10 } = i, o = $(t, i), f = w(r), c = p(r), a = C().domain([f, c]).range([0, h]), m = z(q().domain(a.domain()).thresholds(a.ticks(s))(r)), n = V(m, l);
|
|
17
|
+
y(o, i, { x: a, y: n }, (e) => e.ticks(6)), x(o, m, i, { x: a, y: n }), u(o, { x: a, y: n }, i), L(o, l).call(B(a).tickSize(0)), M(o).call(S(n).tickSize(0)), k(o, i);
|
|
20
18
|
}
|
|
21
|
-
function
|
|
22
|
-
const { width: h, height: l, nBins: s = 10 } = i, o =
|
|
19
|
+
function P(t, i, r) {
|
|
20
|
+
const { width: h, height: l, nBins: s = 10 } = i, o = $(t, i), f = w(r), c = p(r), a = F().domain([f, c]).range([0, h]).nice(), m = (g) => {
|
|
23
21
|
const H = [];
|
|
24
22
|
for (let d = 0; d <= g; d++)
|
|
25
|
-
H.push(Number(
|
|
23
|
+
H.push(Number(a.invert(h * (d / g)).toFixed(2)));
|
|
26
24
|
return H;
|
|
27
|
-
}, n = z(q().domain(
|
|
28
|
-
|
|
25
|
+
}, n = z(q().domain(a.domain()).thresholds(m(s))(r)), e = V(n, l), v = b(0, Math.ceil(Math.log10(c)), 6);
|
|
26
|
+
y(o, i, { x: a, y: e }, (g) => g.tickValues(v)), x(o, n, i, { x: a, y: e }), u(o, { x: a, y: e }, i), L(o, l).call(B(a).tickValues(v).tickSize(0)), M(o).call(S(e).tickSize(0)), k(o, i);
|
|
29
27
|
}
|
|
30
|
-
function
|
|
31
|
-
const { width: h, height: l } = i, s =
|
|
32
|
-
|
|
28
|
+
function W(t, i, r) {
|
|
29
|
+
const { width: h, height: l } = i, s = $(t, i), o = z(r), f = w(o, (e) => e.x0), c = p(o, (e) => e.x1), a = F().domain([f, c]).range([0, h]).nice(), m = V(o, l), n = b(0, Math.ceil(Math.log10(c)), 6);
|
|
30
|
+
y(s, i, { x: a, y: m }, (e) => e.tickValues(n)), x(s, o, i, { x: a, y: m }), u(s, { x: a, y: m }, i), L(s, l).call(B(a).tickValues(n).tickSize(0)), M(s).call(S(m).tickSize(0)), k(s, i);
|
|
33
31
|
}
|
|
34
32
|
export {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
W as createHistogramFromBins,
|
|
34
|
+
O as createHistogramLinear,
|
|
35
|
+
P as createHistogramLog
|
|
38
36
|
};
|
|
39
37
|
//# sourceMappingURL=histogram.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"histogram.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/histogram.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"histogram.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlChartHistogram/histogram.ts"],"sourcesContent":["import { createSvgContainer } from './createSvgContainer';\nimport { drawBins } from './drawBins';\nimport { createGridlines } from './createGridlines';\nimport { logspace } from './logspace';\nimport { createLabels } from './createLabels';\nimport type { AnyBin, BinLike, ChartOptions } from './types';\nimport { drawThreshold } from './drawThreshold';\nimport { normalizeBins } from './normalizeBins';\nimport type { Selection } from 'd3-selection';\nimport { bin, max as d3max, min as d3min } from 'd3-array';\nimport { scaleLinear, scaleSymlog } from 'd3-scale';\nimport { axisBottom, axisLeft } from 'd3-axis';\n\nconst gx = (svg: Selection<SVGGElement, unknown, null, undefined>, height: number) => {\n return svg.append('g')\n .style('font-size', '14px')\n .style('font-weight', '500')\n .attr('transform', `translate(0,${height})`);\n};\n\nconst gy = (svg: Selection<SVGGElement, unknown, null, undefined>) => {\n return svg.append('g')\n .style('font-size', '14px')\n .style('font-weight', '500');\n};\n\nconst createYScale = (bins: BinLike[], height: number) => {\n return scaleLinear()\n .domain([0, d3max(bins, (d) => d.length)!]) // Max bin count for the domain\n .range([height, 0]); // Map to chart height (invert to match SVG coordinates)\n};\n\nexport function createHistogramLinear(el: HTMLElement, options: ChartOptions, data: number[]) {\n const { width, height, nBins = 10 } = options;\n\n const svg = createSvgContainer(el, options);\n\n const min = d3min(data) as number;\n const max = d3max(data) as number;\n\n const x = scaleLinear()\n .domain([min, max])\n .range([0, width]);\n\n const bins: BinLike[] = normalizeBins(bin()\n .domain(x.domain() as [number, number]) // Set the input domain to match the x-scale\n .thresholds(x.ticks(nBins))(data)); // Apply the data to create bins\n\n const y = createYScale(bins, height);\n\n createGridlines(svg, options, { x, y }, (x) => x.ticks(6));\n\n drawBins(svg, bins, options, { x, y });\n\n drawThreshold(svg, { x, y }, options);\n\n gx(svg, height).call(axisBottom(x).tickSize(0));\n\n gy(svg).call(axisLeft(y).tickSize(0));\n\n createLabels(svg, options);\n}\n\nexport function createHistogramLog(el: HTMLElement, options: ChartOptions, data: number[]) {\n const { width, height, nBins = 10 } = options;\n\n const svg = createSvgContainer(el, options);\n\n const min = d3min(data) as number;\n const max = d3max(data) as number;\n\n const x = scaleSymlog()\n .domain([min, max]) // Input range (min and max values of the data)\n .range([0, width])\n .nice() // Output range (width of the chart)\n ;\n\n const createThresholds = (n: number) => {\n const res = [];\n\n for (let i = 0; i <= n; i++) {\n res.push(Number(x.invert(width * (i / n)).toFixed(2)));\n }\n\n return res;\n };\n\n const bins = normalizeBins(bin()\n .domain(x.domain() as [number, number]) // Set the input domain to match the x-scale\n .thresholds(createThresholds(nBins))(data)); // Apply the data to create bins\n\n const y = createYScale(bins, height);\n\n const tickValues = logspace(0, Math.ceil(Math.log10(max)), 6);\n\n createGridlines(svg, options, { x, y }, (x) => x.tickValues(tickValues));\n\n drawBins(svg, bins, options, { x, y });\n\n drawThreshold(svg, { x, y }, options);\n\n gx(svg, height).call(axisBottom(x).tickValues(tickValues).tickSize(0));\n\n gy(svg).call(axisLeft(y).tickSize(0));\n\n createLabels(svg, options);\n}\n\nexport function createHistogramFromBins(el: HTMLElement, options: ChartOptions, _bins: AnyBin[]) {\n const { width, height } = options;\n\n const svg = createSvgContainer(el, options);\n\n const bins = normalizeBins(_bins);\n\n const min = d3min(bins, (b) => b.x0) as number;\n const max = d3max(bins, (b) => b.x1) as number;\n\n const x = scaleSymlog()\n .domain([min, max])\n .range([0, width])\n .nice();\n\n const y = createYScale(bins, height);\n\n const tickValues = logspace(0, Math.ceil(Math.log10(max)), 6);\n\n createGridlines(svg, options, { x, y }, (x) => x.tickValues(tickValues));\n\n drawBins(svg, bins, options, { x, y });\n\n drawThreshold(svg, { x, y }, options);\n\n gx(svg, height).call(axisBottom(x).tickValues(tickValues).tickSize(0));\n\n gy(svg).call(axisLeft(y).tickSize(0));\n\n createLabels(svg, options);\n}\n"],"names":["gx","svg","height","gy","createYScale","bins","scaleLinear","d3max","d","createHistogramLinear","el","options","data","width","nBins","createSvgContainer","min","d3min","max","x","normalizeBins","bin","y","createGridlines","drawBins","drawThreshold","axisBottom","axisLeft","createLabels","createHistogramLog","scaleSymlog","createThresholds","n","res","i","tickValues","logspace","createHistogramFromBins","_bins","b"],"mappings":"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"}
|