{"version":3,"file":"fHXDTZC-.js","sources":["../../../../views/tool/views/mouse-pheno-predict/childrens/middle/src/composable.ts","../../../../views/tool/views/mouse-pheno-predict/childrens/middle/index.vue","../../../../views/tool/views/mouse-pheno-predict/childrens/model/components/preview/src/dispost.ts","../../../../views/tool/views/mouse-pheno-predict/childrens/model/components/preview/src/composable.ts","../../../../views/tool/views/mouse-pheno-predict/childrens/model/components/preview/index.vue","../../../../views/tool/views/mouse-pheno-predict/childrens/model/components/gene/src/composable.ts","../../../../views/tool/views/mouse-pheno-predict/childrens/model/components/gene/index.vue","../../../../views/tool/views/mouse-pheno-predict/childrens/model/components/protein/src/options.ts","../../../../views/tool/views/mouse-pheno-predict/childrens/model/components/protein/src/composable.ts","../../../../views/tool/views/mouse-pheno-predict/childrens/model/components/protein/index.vue","../../../../views/tool/views/mouse-pheno-predict/childrens/model/components/transcript/src/composable.ts","../../../../views/tool/views/mouse-pheno-predict/childrens/model/components/transcript/index.vue","../../../../views/tool/views/mouse-pheno-predict/childrens/model/src/composable.ts","../../../../views/tool/views/mouse-pheno-predict/childrens/model/index.vue","../../../../views/tool/views/mouse-pheno-predict/index.vue"],"sourcesContent":["import type { SearchGeneModal } from \"@/components/windows\";\n\nexport const useComposable = () => {\n //* 响应式变量\n const refs = {\n keyword: ref(\"\"),\n modal: ref>(),\n };\n\n //* 函数列表\n const methods = {\n //* 基因窗口选择回调\n change: (data: any) => routerPush({ name: \"MousePhenoPredict\", query: { id: data?.id || \"\" } }),\n //* 搜索事件回调\n search: () => {\n refs.modal.value?.open(refs.keyword.value);\n },\n };\n\n return { refs, methods };\n};\n","\n\n\n\n\n","//* 概况图\n//- 2. 绘制逻辑\n//* 1. Exon尺寸 40 ~ 320, 默认比例 2:1\n//* 2. Intron尺寸 40, 固定40尺寸, 动态比例\n\n//* 详细图\n//- 2. 绘制逻辑\n//* 2.1 Exon尺寸 40 ~ 320, 默认比例 2:1\n//* 2.2 Intron尺寸 25 ~ 80, 最小25最大80尺寸, 动态比例\n//* 2.2.1 小于100bp时长度为25 ~ 50, 默认比例 2:1\n//* 2.2.2 大于100bp时长度固定80, 取前后100bp以2:1比例绘制, 其余按动态比例的bp:30绘制\n\n//* 新增内容\n//- 1. 基于基因长度补充Mrna前后的Intron\n\n/* eslint-disable no-dupe-class-members */\nexport class disposeData {\n data: any[] = [];\n dictionaries: any[] = [];\n\n cds;\n size;\n view;\n exons;\n length;\n\n constructor(data: any, view = {}) {\n this.view = view; //? 视图参数\n this.cds = data.cds || []; //? cds数据\n this.size = 0; //? 绘制图像实际尺寸\n this.data = []; //? 实例化class后的预处理数据\n this.exons = data.exons || []; //? exon数据\n this.length = data.length || 0; //? 基因长度\n this.dictionaries = []; //? 绘图字典, 用于坐标计算与绘图\n\n //- 1. 数据分类生成Exon, Intron字典集\n this.#disposeClassify();\n }\n\n //* 数据分类生成Exon, Intron字典集\n #disposeClassify() {\n //- 1. 初始化配置数据\n const config = { cdsPos: 1, eggPos: 1, eggDiff: 0 };\n\n //- 2. 遍历Exons生成Exon, Intron字典集\n this.data = [];\n this.exons.forEach((exon: number[], index: number) => {\n const size = exon[1] - exon[0] + 1;\n const front = this.exons[index - 1] || [];\n const frontEnd = front?.[1] || 0;\n //- 2.1 判断Exon之前是否存在一段Intron\n if (exon[0] - frontEnd > 1) {\n this.data.push({ start: frontEnd + 1, end: exon[0] - 1, size: exon[0] - frontEnd - 2, type: \"intron\" });\n }\n\n //- 2.2 添加Exon数据, 并处理cds数据生成强关联的蛋白数据与cds数据\n this.data.push(this.#disposeExon({ start: exon[0], end: exon[1], size: size, type: \"exon\", name: `E${index + 1}` }, config));\n });\n\n //- 2.3 判断尾部是否存在一段Intron\n const queen = this.data.slice(-1)[0] || {};\n if (queen && queen.end < this.length) {\n this.data.push({ start: queen.end + 1, end: this.length, size: this.length - queen.end, type: \"intron\" });\n }\n }\n\n //* 将cds和exon数据进行强关联, 并计算出蛋白的坐标\n #disposeExon(data: any, config: any) {\n //- 1. 完全相信后端CDS坐标没问题, 有问题找后端\n for (let i in this.cds) {\n const value = this.cds[i];\n if (data.start <= value[0]) {\n //- 1.1 Exon起始坐标在CDS左侧\n if (data.end >= value[0] && value[1] >= data.end) {\n //- 1.1.1 Exon终点坐标在CDS内部\n data.cds = { end: data.end, start: value[0], size: data.end - value[0] + 1 };\n } else if (data.end >= value[1]) {\n //- 1.1.2 Exon终点坐标在CDS右侧\n data.cds = { end: value[1], start: value[0], size: value[1] - value[0] + 1 };\n }\n } else if (data.start <= value[1]) {\n //- 1.2 Exon起始坐标在CDS内部\n if (data.end >= value[0] && value[1] >= data.end) {\n //- 1.2.1 Exon终点坐标在CDS内部\n data.cds = { end: data.end, start: data.start, size: data.end - data.start + 1 };\n } else if (data.end >= value[1]) {\n //- 1.2.2 Exon终点坐标在CDS右侧\n data.cds = { start: data.start, end: value[1], size: value[1] - data.start + 1 };\n }\n }\n\n //- 2. 判断是否存在CDS区域, 存在则计算CDS相对坐标, 蛋白相对坐标并返回数据\n if (data.cds) {\n const diff = data.cds.size - config.eggDiff;\n data.cds.rEnd = config.cdsPos + data.cds.size - 1;\n data.cds.rStart = config.cdsPos;\n data.eggWhite = { start: config.eggPos, end: config.eggPos + Math.ceil(diff / 3) - 1 };\n config.cdsPos = config.cdsPos + data.cds.size;\n config.eggPos = config.eggPos + Math.ceil(diff / 3);\n if (diff % 3 != 0) {\n config.eggDiff = 3 - (diff % 3);\n }\n\n return data;\n }\n }\n\n return data;\n }\n\n //* 概括图绘图数据计算函数\n disposeOverviewData() {\n //- 1. 初始化数据\n this.size = 0;\n this.dictionaries = [];\n const config = { offset: 0 };\n\n //- 2. 遍历预处理数据生成绘图数据\n this.data.forEach((value) => {\n switch (value.type) {\n case \"intron\": {\n this.size += 64;\n this.dictionaries.push(Object.assign(value, { width: 64, ratio: 64 / value.size, offset: config.offset }));\n config.offset += 64;\n break;\n }\n\n case \"exon\": {\n const width = value.size * 0.5;\n const result = Object.assign(value, { width: width, ratio: 0.5, offset: config.offset });\n if (width < 40) {\n result.width = 40;\n result.ratio = 40 / value.size;\n } else if (width > 320) {\n result.width = 320;\n result.ratio = 320 / value.size;\n }\n\n this.dictionaries.push(result);\n this.size += result.width;\n config.offset += result.width;\n break;\n }\n }\n });\n }\n\n //* 详细图绘图数据计算函数\n disposeDetailsData() {\n //- 1. 初始化数据\n this.size = 0;\n this.dictionaries = [];\n const config = { offset: 0 };\n\n //- 2. 遍历预处理数据生成绘图数据\n this.data.forEach((value) => {\n switch (value.type) {\n case \"intron\": {\n const result = Object.assign(value, { ratio: 0.5, offset: config.offset });\n if (value.size <= 100) {\n result.width = value.size * 0.5;\n if (result.width < 25) {\n result.width = 25;\n result.ratio = 25 / value.size;\n }\n } else {\n result.omit = 30 / (value.size - 100);\n result.width = 80;\n }\n\n this.dictionaries.push(result);\n this.size += result.width;\n config.offset += result.width;\n break;\n }\n\n case \"exon\": {\n const width = value.size * 0.5;\n const result = Object.assign(value, { width: width, ratio: 0.5, offset: config.offset });\n if (width < 40) {\n result.width = 40;\n result.ratio = 40 / value.size;\n } else if (width > 320) {\n result.width = 320;\n result.ratio = 320 / value.size;\n }\n\n this.dictionaries.push(result);\n this.size += result.width;\n config.offset += result.width;\n break;\n }\n }\n });\n }\n\n //* 坐标转换函数\n disposePos(site: number, option: any) {\n //- 数据初始化\n option = option || { align: \"left\" };\n //- return数据初始化\n const result = { offset: 0, data: null, site: 0 };\n //- 遍历dictionaries获取坐标\n for (let i = 0, l = this.dictionaries.length; i < l; i++) {\n const value = this.dictionaries[i];\n if (site <= value.end && site >= value.start) {\n result.data = value;\n result.site = site;\n\n //- Intron省略计算处理\n if (value.omit) {\n //- 获取当前偏移\n result.offset = value.offset;\n\n //- 左侧横线区域计算\n if (site - value.start < 50) {\n result.offset += (site - value.start) * value.ratio;\n } else {\n result.offset += 25;\n }\n\n //- 中间省略与右侧横线区域计算\n if (site - value.start > 50) {\n if (value.end - site >= 50) {\n result.offset += (site - value.start) * value.omit;\n } else {\n result.offset += 30 + (site - value.end + 51) * value.ratio;\n }\n }\n } else {\n result.offset = value.offset + (site - value.start) * value.ratio;\n }\n\n //- 边界检测\n if (result.site < value.start) result.site = value.start;\n if (result.site > value.end) result.site = value.end;\n\n switch (option.align) {\n case \"right\": {\n result.offset += value.ratio;\n break;\n }\n\n case \"center\": {\n result.offset += value.ratio / 2;\n break;\n }\n }\n\n return result;\n }\n }\n\n return result;\n }\n}\n","import Konva from \"konva\";\nimport type { PreViewBarOption } from \"../index\";\nimport type { UiTooltipFunction } from \"various-ui\";\n\nimport { disposeData } from \"./dispost\";\n\nexport const useComposable = () => {\n //* 获取i18n\n const i18n = useI18n();\n\n //* 响应式变量\n const refs = {\n mode: ref(\"overview\"),\n\n mainNode: ref(),\n tooltipNode: ref>(),\n\n mrna: ref(),\n main: ref(),\n stage: ref(),\n mutation: ref(),\n\n info: ref(),\n offset: ref(0),\n content: ref(),\n drawing: ref(),\n };\n\n //* Bar配置项\n const bar = reactive({ el: undefined, size: 0, ratio: 0 });\n\n //* 函数列表\n const methods = {\n //* 初始化函数\n init: function (data: any) {\n refs.drawing.value = new disposeData(data, { width: refs.mainNode.value?.clientWidth || 0 });\n methods.draw(\"overview\");\n },\n\n //* 绘制函数\n draw: function (mode: string) {\n if (!refs.mainNode.value) return;\n\n //- 1. 初始化舞台与场景\n if (refs.stage.value) {\n refs.offset.value = 0;\n refs.main.value?.destroyChildren();\n } else {\n refs.stage.value = new Konva.Stage({ container: refs.mainNode.value, width: refs.drawing.value.view.width, height: 131 });\n refs.main.value = new Konva.Layer();\n }\n\n if (!refs.main.value || !refs.stage.value) return;\n\n //- 2. 根据绘制的模式进行不同的数据处理\n switch (mode) {\n case \"overview\":\n refs.mode.value = \"overview\";\n refs.drawing.value.disposeOverviewData();\n break;\n case \"details\":\n refs.mode.value = \"details\";\n refs.drawing.value.disposeDetailsData();\n break;\n }\n\n //- 3. 绘制Mrna\n refs.mrna.value = new Konva.Group();\n refs.content.value = new Konva.Group();\n refs.drawing.value.dictionaries.forEach((value: any) => {\n switch (value.type) {\n case \"intron\":\n return methods.drawIntron(value);\n case \"exon\":\n return methods.drawExon(value);\n }\n });\n\n //- 4. 绘制滚动条\n methods.drawScrollBar();\n\n //- 5. 初始化突变信息\n refs.mutation.value = new Konva.Group();\n\n //- 将场景添加入舞台中\n refs.mrna.value.add(refs.mutation.value);\n refs.mrna.value.add(refs.content.value);\n refs.main.value.add(refs.mrna.value);\n refs.stage.value.add(refs.main.value);\n },\n\n //* 绘制Exon\n drawExon: function (value: any) {\n //- 1. 生成容器\n const container = new Konva.Group();\n\n //- 2. 绘制线框\n container.add(\n new Konva.Rect({\n x: value.offset + 0.5,\n y: 60.5,\n width: value.width - 1,\n height: 23,\n stroke: \"#999999\",\n strokeWidth: 1,\n cornerRadius: 2,\n })\n );\n\n //- 3. 绘制CDS区域\n if (value.cds) {\n //- 2.1 初始化数据\n const end = refs.drawing.value.disposePos(value.cds.end, { align: \"right\" });\n const start = refs.drawing.value.disposePos(value.cds.start);\n const radius = [0, 0, 0, 0];\n //- 2.2 判断CDS左侧是否需要圆角\n if (value.cds.start == value.start) {\n radius[0] = 2;\n radius[3] = 2;\n }\n //- 2.2 判断CDS右侧是否需要圆角\n if (value.cds.end == value.end) {\n radius[1] = 2;\n radius[2] = 2;\n }\n //- 2.3 绘制\n container.add(\n new Konva.Rect({ x: start.offset, y: 60, width: end.offset - start.offset, height: 24, fill: \"#00C7C8\", cornerRadius: radius })\n );\n }\n\n //- 4. 绘制文本\n const content = new Konva.Text({\n x: value.offset + value.width / 2,\n y: 66,\n fontFamily: \"Noto Sans CJK Regular\",\n fontSize: 14,\n fill: \"#4a4a4a\",\n text: value.name,\n });\n\n refs.content.value.add(content.offsetX(content.getTextWidth() / 2));\n\n container.on(\"mouseenter\", (ev) => {\n refs.info.value = value;\n refs.tooltipNode.value?.show(\"start\", {\n pageX: ev.evt.x,\n pageY: ev.evt.y,\n initialization: true\n });\n });\n\n container.on(\"mousemove\", (ev) => {\n refs.tooltipNode.value?.show(\"start\", {\n pageX: ev.evt.x,\n pageY: ev.evt.y,\n initialization: true\n });\n });\n\n container.on(\"mouseleave\", (ev) => {\n refs.tooltipNode.value?.hidden();\n });\n\n //- 6. 将容器添加进场景中\n refs.mrna.value?.add(container);\n },\n\n //* 绘制Intron\n drawIntron: function (value: any) {\n if (value.omit) {\n refs.mrna.value?.add(new Konva.Rect({ x: value.offset, y: 71, width: 25, height: 2, fill: \"#4a4a4a\" }));\n refs.mrna.value?.add(new Konva.Rect({ x: value.offset + 31, y: 71, width: 2, height: 2, fill: \"#4a4a4a\", rotation: 2 }));\n refs.mrna.value?.add(new Konva.Rect({ x: value.offset + 39, y: 71, width: 2, height: 2, fill: \"#4a4a4a\", rotation: 2 }));\n refs.mrna.value?.add(new Konva.Rect({ x: value.offset + 47, y: 71, width: 2, height: 2, fill: \"#4a4a4a\", rotation: 2 }));\n refs.mrna.value?.add(new Konva.Rect({ x: value.offset + 55, y: 71, width: 25, height: 2, fill: \"#4a4a4a\" }));\n } else {\n refs.mrna.value?.add(new Konva.Rect({ x: value.offset, y: 71, width: value.width, height: 2, fill: \"#4a4a4a\" }));\n }\n },\n\n //* 绘制滚动条\n drawScrollBar: function () {\n if (refs.drawing.value.size > refs.drawing.value.view.width) {\n //- 1. 计算Bar尺寸\n bar.ratio = (refs.drawing.value.view.width - 2) / refs.drawing.value.size;\n bar.size = bar.ratio * refs.drawing.value.view.width;\n\n //- 2. 绘制滚动条背景框\n const wireframe = new Konva.Rect({ x: 0, y: 112, width: refs.drawing.value.view.width, height: 16, fill: \"#F4F4F4\" });\n\n //- 3. 绘制Bar\n bar.el = new Konva.Rect({\n x: 1,\n y: 110,\n width: bar.size,\n height: 20,\n fill: \"#fff\",\n stroke: \"#999999\",\n strokeWidth: 1,\n fillAfterStrokeEnabled: true,\n });\n\n //- 4. 悬浮鼠标样式修改\n bar.el.on(\"mouseenter\", (ev: any) => {\n ev.evt.target.style.cursor = \"pointer\";\n bar.el?.stroke(\"#666666\");\n });\n bar.el.on(\"mouseleave\", (ev: any) => {\n ev.evt.target.style.cursor = \"auto\";\n bar.el?.stroke(\"#999999\");\n });\n\n //- 5. Bar拖动反馈\n bar.el.on(\"mousedown\", (ev: any) => {\n const clientX = ev.evt.clientX;\n const offsetX = refs.offset.value;\n //- 鼠标移动反馈事件, 边界检测\n document.onmousemove = (ev) => {\n //- 偏移记录\n refs.offset.value = methods.BoundaryDetection(offsetX + ev.clientX - clientX);\n //- 触发移动反馈事件\n bar.el?.offsetX(-refs.offset.value);\n refs.mrna.value?.offsetX(refs.offset.value / bar.ratio);\n };\n //- 鼠标松开反馈事件, 左右端20%的区域触发Mrna偏移, 偏移边界检测\n document.onmouseup = () => {\n //- 清空事件\n document.onmouseup = null;\n document.onmousemove = null;\n };\n });\n\n refs.main.value?.add(wireframe);\n refs.main.value?.add(bar.el as Konva.Rect);\n } else {\n bar.el = undefined;\n bar.size = 0;\n bar.ratio = 0;\n }\n },\n\n //* 绘制预测点\n drawPos: function (data: any) {\n //- 1. 检测是否为详情图\n if (refs.mode.value == \"overview\") {\n methods.draw(\"details\");\n }\n\n //- 2. 旧数据清除与添加\n refs.mutation.value?.destroyChildren();\n\n //- 3. 获取start与end的位置\n const end = refs.drawing.value.disposePos(data.end, { align: \"right\" });\n const start = refs.drawing.value.disposePos(data.start);\n\n //- 4. 存在Bar时才进行偏移定位\n if (bar.el) {\n let offset = 0;\n if (start.offset < refs.drawing.value.view.width / 2) {\n refs.offset.value = 0;\n } else if (start.offset > refs.drawing.value.size - refs.drawing.value.view.width / 2) {\n offset = refs.drawing.value.size - refs.drawing.value.view.width;\n refs.offset.value = offset * bar.ratio;\n } else {\n offset = start.offset - refs.drawing.value.view.width / 2;\n refs.offset.value = offset * bar.ratio;\n }\n\n bar.el.offsetX(-refs.offset.value);\n refs.mrna.value?.offsetX(offset);\n }\n\n //- 5. 绘制预测点位\n //- 5.1 数据初始化\n const ref = data.ref ? (data.ref.length > 10 ? `${data.ref.slice(0, 3)}···${data.ref.slice(-3)}` : data.ref) : \"--\";\n const alt = data.alt ? (data.alt.length > 10 ? `${data.alt.slice(0, 3)}···${data.alt.slice(-3)}` : data.alt) : \"del\";\n const config = {\n content: [`${i18n.t(\"BioTools.Mutation\")}: ${ref}${alt == \"del\" ? \"\" : ` > ${alt}`}`],\n offset: start.offset + (end.offset - start.offset) / 2,\n size: 0,\n };\n if (ref.length > 10 || alt.length > 10) {\n if (alt === \"del\") {\n config.content.push(`${ref.length}bp`);\n } else {\n config.content.push(` (${ref.length}bp > ${alt.length}bp)`);\n }\n }\n\n //- 5.2 绘制线条区域\n refs.mutation.value?.add(\n new Konva.Rect({ x: start.offset, y: 32, width: 1, height: start.data.type == \"intron\" ? 40 : 28, fill: \"#ce2424\" })\n );\n refs.mutation.value?.add(\n new Konva.Rect({ x: end.offset - 1, y: 32, width: 1, height: end.data.type == \"intron\" ? 40 : 28, fill: \"#ce2424\" })\n );\n\n //- 5.3 初始化文本\n const mutation = new Konva.Text({\n y: 0,\n height: 32,\n fontFamily: \"Noto Sans CJK Regular\",\n fontSize: 14,\n fill: \"#ffffff\",\n align: \"center\",\n verticalAlign: \"middle\",\n text: config.content.join(\"\"),\n });\n\n //- 5.4 计算文本偏移位置\n config.size = mutation.getTextWidth() + 32;\n if (config.size < end.offset - start.offset + 16) {\n config.size = end.offset - start.offset + 16;\n }\n\n //- 5.5 处理边界问题并绘制突变信息\n mutation.width(config.size);\n if (config.offset - config.size / 2 < 0) {\n refs.mutation.value?.add(new Konva.Rect({ x: 0, y: 0, width: config.size, height: 32, fill: \"#ce2424\", cornerRadius: 2 }));\n refs.mutation.value?.add(mutation.x(0));\n } else if (config.offset + config.size > refs.drawing.value.size) {\n const offsetX = refs.drawing.value.size - config.size;\n refs.mutation.value?.add(new Konva.Rect({ x: offsetX, y: 0, width: config.size, height: 32, fill: \"#ce2424\", cornerRadius: 2 }));\n refs.mutation.value?.add(mutation.x(offsetX));\n } else {\n const offsetX = config.offset - config.size / 2;\n refs.mutation.value?.add(new Konva.Rect({ x: offsetX, y: 0, width: config.size, height: 32, fill: \"#ce2424\", cornerRadius: 2 }));\n refs.mutation.value?.add(mutation.x(offsetX));\n }\n\n //- 6. 计算预测点位经过的Exon并绘制预测区域\n refs.drawing.value.dictionaries.map((value: any) => {\n if (value.type == \"exon\") {\n if (data.start <= value.end && data.start >= value.start) {\n if (data.end <= value.end && data.end >= value.start) {\n const start = refs.drawing.value.disposePos(data.start);\n const end = refs.drawing.value.disposePos(data.end, { align: \"right\" });\n refs.mutation.value?.add(\n new Konva.Rect({ x: start.offset, y: 60, width: end.offset - start.offset, height: 24, fill: \"#FFD40B\" })\n );\n } else {\n const start = (data.start - value.start) * value.ratio;\n refs.mutation.value?.add(\n new Konva.Rect({\n x: value.offset + start,\n y: 60,\n width: value.width - start,\n height: 24,\n cornerRadius: [0, 2, 2, 0],\n fill: \"#FFD40B\",\n })\n );\n }\n }\n\n if (data.end <= value.end && data.end >= value.start && data.start <= value.start) {\n refs.mutation.value?.add(\n new Konva.Rect({\n x: value.offset,\n y: 60,\n width: (data.end - value.start + 1) * value.ratio,\n height: 24,\n cornerRadius: [2, 0, 0, 2],\n fill: \"#FFD40B\",\n })\n );\n }\n\n if (data.start <= value.start && data.end >= value.end) {\n refs.mutation.value?.add(\n new Konva.Rect({ x: value.offset, y: 60, width: value.width, height: 24, cornerRadius: 2, fill: \"#FFD40B\" })\n );\n }\n }\n });\n\n refs.mutation.value?.on(\"mouseenter\", (ev: any) => {\n refs.info.value = data;\n refs.tooltipNode.value?.show(\"start\", {\n pageX: ev.evt.x,\n pageY: ev.evt.y,\n initialization: true\n });\n });\n\n refs.mutation.value?.on(\"mousemove\", (ev: any) => {\n refs.tooltipNode.value?.show(\"start\", {\n pageX: ev.evt.x,\n pageY: ev.evt.y,\n initialization: true\n });\n });\n\n refs.mutation.value?.on(\"mouseleave\", (ev: any) => {\n refs.tooltipNode.value?.hidden();\n });\n },\n\n //* 边界检测函数\n BoundaryDetection: function (offset: number): number {\n //- 1. 检测左侧贴边\n //- 1.1. 当mrna未进行偏移时最小值为0\n if (offset < 0) {\n return 0;\n } else if (offset + bar.size > refs.drawing.value.view.width - 2) {\n return refs.drawing.value.view.width - bar.size - 2;\n }\n\n //- 偏移记录\n return offset;\n },\n };\n\n return { refs, methods };\n};\n","\n\n\n\n\n\n\n","import type { UiForm, UiInput, UiTypes } from \"various-ui\";\n\nexport const useComposable = (emit: { (event: \"redraw\", data: any): void }) => {\n //* 获取I18n\n const i18n = useI18n();\n\n //* 响应式变量\n const refs = {\n show: ref(false),\n\n dictionaries: ref({}), //? 字典\n candidate: ref([]), //? 候选项\n original: ref({}), //? 原始数据\n\n cPlaceholder: { start: i18n.t(\"BioTools.StartSite\"), end: i18n.t(\"BioTools.EndSite\") },\n };\n\n //* 表单数据\n const data = reactive({\n ref: \"\",\n alt: \"\",\n coordinate: <{ start?: number; end?: number }>{},\n });\n\n //* 节点\n const nodes = {\n alt: ref>(),\n form: ref>(),\n };\n\n //* 表单校验规则\n const rules: { [name: string]: UiTypes.verifyRule[] } = {\n coordinate: [\n {\n trigger: \"change\",\n verify: (data: any) => {\n const seqLen = refs.dictionaries.value?.sequence?.length || 0;\n const start = Number(data.coordinate.start);\n const end = Number(data.coordinate.end);\n /**当start, end为0或者不存在时 */\n if (!start || !end) {\n return { verify: false, message: i18n.t(\"CoordinateMustBeLargerThan0\") };\n } /**当起始坐标超出范围时 */ else if (start < 1 || start > seqLen) {\n return {\n verify: false,\n message: i18n.t(\"BioTools.PositionVerify\", { type: i18n.t(\"BioTools.Start\"), start: 1, end: seqLen }),\n };\n } /**当终止坐标超出范围时 */ else if (end < 1 || end > seqLen) {\n return {\n verify: false,\n message: i18n.t(\"BioTools.PositionVerify\", { type: i18n.t(\"BioTools.End\"), start: 1, end: seqLen }),\n };\n } /**当起始大于结束时 */ else if (start > end) {\n return { verify: false, message: i18n.t(\"Placeholder.StartExceedEnd\") };\n } /**当片段大于20bp时 */ else if (end - start + 1 > 50) {\n return { verify: false, message: i18n.t(\"BioTools.MrnaVerify1\", { length: 50 }) };\n } else {\n return { verify: true, message: \"\" };\n }\n },\n },\n ],\n ref: [\n {\n trigger: \"verify\",\n verify: (data: any) => {\n if (data.ref) return { verify: true, message: \"\" };\n else {\n return { verify: false, message: \"Please provide the coordinate\" };\n }\n },\n },\n ],\n alt: [\n {\n trigger: \"verify\",\n verify: (data: any) => {\n if (data.alt && !/^([a|A|t|T|c|C|g|G]*)$/.test(data.alt)) {\n return { verify: false, message: \"only alphabet 'ATCG' are allowed\" };\n } else {\n return { verify: true, message: \"\" };\n }\n },\n },\n ],\n };\n\n //* 函数列表\n const methods = {\n //* 初始化函数\n init: (origin: any, dictionaries: any) => {\n //* 重置表单\n nodes.form.value?.reset();\n\n //* 数据初始化\n data.ref = \"\";\n data.alt = \"\";\n data.coordinate.end = undefined;\n data.coordinate.start = undefined;\n\n //* 数据缓存\n refs.original.value = origin || {};\n refs.dictionaries.value = dictionaries || {};\n },\n\n //* 焦点获取函数\n focus: () => {\n if (refs.show.value) return;\n else {\n requestAnimationFrame(() => nodes.alt.value?.focus());\n }\n },\n\n //* 切换数据\n changeData: function (origin: any) {\n //* 重置表单\n nodes.form.value?.reset();\n\n //* 初始化基础数据\n const end = origin?.range?.[1] || \"\";\n const start = origin?.range?.[0] || \"\";\n const ref = refs.dictionaries.value.sequence.slice(start - 1, end);\n\n //* 初始化表单数据\n refs.candidate.value = [];\n data.coordinate.end = end;\n data.coordinate.start = start;\n data.ref = ref;\n data.alt = origin.alt;\n\n //* 检测点位是否合规\n nodes.form.value?.validator((valid: boolean) => {\n //* 校验失败, 退出\n if (!valid) return;\n //* 存在候选菜单\n if (origin?.codons?.length) {\n //* 生成Codons候选菜单\n //* 遍历生成候选列表并计算最接近的alt\n let altNumber = 0;\n origin.codons.forEach((alt: string) => {\n //* 补充候选列表\n refs.candidate.value.push({ label: alt, value: alt });\n //* 临时计数变量\n let number = 0;\n //* 剪接字符列表\n const chars = alt?.split(\"\") || [];\n //* 遍历计数\n for (let i = 0; i < chars.length; i++) {\n if (ref == alt || !ref.charAt(i) || !alt.charAt(i)) return;\n if (ref.charAt(i) == alt.charAt(i)) number++;\n }\n //* 检测是否大于上个数\n if (number > altNumber) {\n data.alt = alt;\n }\n });\n\n //* 检测是否存在alt\n if (!data.alt) {\n data.alt = refs.candidate.value?.[0]?.value || \"\";\n }\n }\n\n //* 触发预览图更新\n emit(\"redraw\", { start: data.coordinate.start, end: data.coordinate.end, alt: data.alt, ref: data.ref });\n });\n },\n\n //* 切换预测位点\n changeCoordinate: function () {\n const hanlder = (valid: boolean) => {\n const start = Number(data.coordinate.start) || 0;\n const end = Number(data.coordinate.end) || 0;\n if (valid) {\n data.ref = refs.dictionaries.value.sequence.slice(start - 1, end);\n emit(\"redraw\", {\n start: start,\n end: end,\n alt: data.alt && /^([A|T|C|G]*)$/.test(data.alt) ? data.alt : \"\",\n ref: data.ref,\n });\n nodes.form.value?.validator(() => {}, [\"ref\"]);\n } else {\n data.ref = \"\";\n }\n };\n\n nodes.form.value?.validator(hanlder, [\"coordinate\"]);\n },\n\n //* 切换Alteration\n changeAlt: function () {\n const hanlder = (valid: boolean) => {\n if (valid) {\n emit(\"redraw\", { start: data.coordinate.start, end: data.coordinate.end, alt: data.alt, ref: data.ref });\n }\n };\n\n data.alt = data.alt.toUpperCase();\n if (data.coordinate.start && data.coordinate.end) {\n nodes.form.value?.validator(hanlder, [\"coordinate\", \"alt\"]);\n } else {\n nodes.form.value?.validator(() => {}, [\"alt\"]);\n }\n },\n\n //* 表单提交事件\n submit: function (callBack: (data: any) => void) {\n nodes.form.value?.validator((valid: boolean) => {\n valid && callBack && callBack({ alt: data.alt, ref: data.ref, gene_pos: data.coordinate.start });\n });\n },\n };\n\n return { refs, data, nodes, rules, methods };\n};\n","\n\n\n\n\n","export const naa: { label: string; value: string; shortnanme?: string }[] = [\n { label: \"A (Ala)\", value: \"A\", shortnanme: \"Ala\" },\n { label: \"R (Arg)\", value: \"R\", shortnanme: \"Arg\" },\n { label: \"N (Asn)\", value: \"N\", shortnanme: \"Asn\" },\n { label: \"D (Asp)\", value: \"D\", shortnanme: \"Asp\" },\n { label: \"C (Cys)\", value: \"C\", shortnanme: \"Cys\" },\n { label: \"Q (Gln)\", value: \"Q\", shortnanme: \"Gln\" },\n { label: \"E (Glu)\", value: \"E\", shortnanme: \"Glu\" },\n { label: \"G (Gly)\", value: \"G\", shortnanme: \"Gly\" },\n { label: \"H (His)\", value: \"H\", shortnanme: \"His\" },\n { label: \"I (Ile)\", value: \"I\", shortnanme: \"Ile\" },\n { label: \"L (Leu)\", value: \"L\", shortnanme: \"Leu\" },\n { label: \"K (Lys)\", value: \"K\", shortnanme: \"Lys\" },\n { label: \"M (Met)\", value: \"M\", shortnanme: \"Met\" },\n { label: \"F (Phe)\", value: \"F\", shortnanme: \"Phe\" },\n { label: \"P (Pro)\", value: \"P\", shortnanme: \"Pro\" },\n { label: \"S (Ser)\", value: \"S\", shortnanme: \"Ser\" },\n { label: \"T (Thr)\", value: \"T\", shortnanme: \"Thr\" },\n { label: \"W (Trp)\", value: \"W\", shortnanme: \"Trp\" },\n { label: \"Y (Tyr)\", value: \"Y\", shortnanme: \"Tyr\" },\n { label: \"V (Val)\", value: \"V\", shortnanme: \"Val\" },\n { label: \"* (TERM)\", value: \"*\" },\n];\n\nexport const codons: { [name: string]: { label: string; value: string; codon: string[]; fullname: string; shortnanme: string } } = {\n \"A\": { label: \"Ala\", value: \"A\", codon: [\"GCT\", \"GCC\", \"GCA\", \"GCG\"], fullname: \"Alanine\", shortnanme: \"Ala\" },\n \"R\": { label: \"Arg\", value: \"R\", codon: [\"CGT\", \"CGC\", \"CGA\", \"CGG\", \"AGA\", \"AGG\"], fullname: \"Arginine\", shortnanme: \"Arg\" },\n \"N\": { label: \"Asn\", value: \"N\", codon: [\"AAT\", \"AAC\"], fullname: \"Asparagine\", shortnanme: \"Asn\" },\n \"D\": { label: \"Asp\", value: \"D\", codon: [\"GAT\", \"GAC\"], fullname: \"Aspartic acid\", shortnanme: \"Asp\" },\n \"C\": { label: \"Cys\", value: \"C\", codon: [\"TGT\", \"TGC\"], fullname: \"Cysteine\", shortnanme: \"Cys\" },\n \"Q\": { label: \"Gln\", value: \"Q\", codon: [\"CAA\", \"CAG\"], fullname: \"Glutamine\", shortnanme: \"Gln\" },\n \"E\": { label: \"Glu\", value: \"E\", codon: [\"GAA\", \"GAG\"], fullname: \"Glutamic acid\", shortnanme: \"Glu\" },\n \"G\": { label: \"Gly\", value: \"G\", codon: [\"GGT\", \"GGC\", \"GGA\", \"GGG\"], fullname: \"Glycine\", shortnanme: \"Gly\" },\n \"H\": { label: \"His\", value: \"H\", codon: [\"CAT\", \"CAC\"], fullname: \"Histidine\", shortnanme: \"His\" },\n \"I\": { label: \"Ile\", value: \"I\", codon: [\"ATT\", \"ATC\", \"ATA\"], fullname: \"Isoleucine\", shortnanme: \"Ile\" },\n \"L\": { label: \"Leu\", value: \"L\", codon: [\"CTT\", \"CTC\", \"CTA\", \"CTG\", \"TTA\", \"TTG\"], fullname: \"Leucine\", shortnanme: \"Leu\" },\n \"K\": { label: \"Lys\", value: \"K\", codon: [\"AAA\", \"AAG\"], fullname: \"Lysine\", shortnanme: \"Lys\" },\n \"M\": { label: \"Met\", value: \"M\", codon: [\"ATG\"], fullname: \"Methionine\", shortnanme: \"Met\" },\n \"F\": { label: \"Phe\", value: \"F\", codon: [\"TTT\", \"TTC\"], fullname: \"Phenylalanine\", shortnanme: \"Phe\" },\n \"P\": { label: \"Pro\", value: \"P\", codon: [\"CCT\", \"CCC\", \"CCA\", \"CCG\"], fullname: \"Proline\", shortnanme: \"Pro\" },\n \"S\": { label: \"Ser\", value: \"S\", codon: [\"TCT\", \"TCC\", \"TCA\", \"TCG\", \"AGT\", \"AGC\"], fullname: \"Serine\", shortnanme: \"Ser\" },\n \"T\": { label: \"Thr\", value: \"T\", codon: [\"ACT\", \"ACC\", \"ACA\", \"ACG\"], fullname: \"Threonine\", shortnanme: \"Thr\" },\n \"W\": { label: \"Trp\", value: \"W\", codon: [\"TGG\"], fullname: \"Tryptophan\", shortnanme: \"Trp\" },\n \"Y\": { label: \"Tyr\", value: \"Y\", codon: [\"TAT\", \"TAC\"], fullname: \"Tyrosine\", shortnanme: \"Tyr\" },\n \"*\": { label: \"TERM\", value: \"*\", codon: [\"TAA\", \"TAG\", \"TGA\"], fullname: \"Termination codon\", shortnanme: \"TERM\" },\n \"V\": { label: \"Val\", value: \"V\", codon: [\"GTT\", \"GTC\", \"GTA\", \"GTG\"], fullname: \"Valine\", shortnanme: \"Val\" },\n};\n\nexport const codonDict: { [name: string]: string } = {\n TTT: \"F\",\n TTC: \"F\",\n TTA: \"L\",\n TTG: \"L\",\n CTT: \"L\",\n CTC: \"L\",\n CTA: \"L\",\n CTG: \"L\",\n AGT: \"S\",\n AGC: \"S\",\n TCT: \"S\",\n TCC: \"S\",\n TCA: \"S\",\n TCG: \"S\",\n TAT: \"Y\",\n TAC: \"Y\",\n TGT: \"C\",\n TGC: \"C\",\n CCT: \"P\",\n CCC: \"P\",\n CCA: \"P\",\n CCG: \"P\",\n CAT: \"H\",\n CAC: \"H\",\n CAA: \"Q\",\n CAG: \"Q\",\n AGA: \"R\",\n AGG: \"R\",\n CGT: \"R\",\n CGC: \"R\",\n CGA: \"R\",\n CGG: \"R\",\n ATT: \"I\",\n ATC: \"I\",\n ATA: \"I\",\n ACT: \"T\",\n ACC: \"T\",\n ACA: \"T\",\n ACG: \"T\",\n AAT: \"N\",\n AAC: \"N\",\n AAA: \"K\",\n AAG: \"K\",\n GTT: \"V\",\n GTC: \"V\",\n GTA: \"V\",\n GTG: \"V\",\n GCT: \"A\",\n GCC: \"A\",\n GCA: \"A\",\n GCG: \"A\",\n GAT: \"D\",\n GAC: \"D\",\n GAA: \"E\",\n GAG: \"E\",\n GGT: \"G\",\n GGC: \"G\",\n GGA: \"G\",\n GGG: \"G\",\n TGG: \"W\",\n ATG: \"M\",\n TAA: \"*\",\n TAG: \"*\",\n TGA: \"*\",\n};\n","import type { UiForm, UiTypes } from \"various-ui\";\n\nimport { codonDict, codons } from \"./options\";\n\nexport const useComposable = (emit: { (event: \"redraw\", data: any): void }) => {\n //* 获取I18n\n const i18n = useI18n();\n\n //* 响应式变量\n const refs = {\n form: ref>(),\n\n dictionaries: ref({}), //? 字典\n candidate: ref([]), //? 候选项\n original: ref({}), //? 原始数据\n };\n\n //* 表单数据\n const data = reactive({\n coordinate: \"\",\n codon: \"\",\n oaa: \"\",\n naa: \"\",\n });\n\n //* 表单校验规则\n const rules: { [name: string]: UiTypes.verifyRule[] } = {\n oaa: [\n {\n trigger: \"change\",\n verify: (data: any) => {\n if (data.oaa) return { verify: true, message: \"\" };\n else {\n return { verify: false, message: \"Please give us a original amino acid\" };\n }\n },\n },\n ],\n naa: [\n {\n trigger: \"change\",\n verify: (data: any) => {\n if (!/^([A|R|N|D|C|Q|E|G|H|I|L|K|M|F|P|S|T|W|Y|V|*]*)$/.test(data.naa)) {\n return { verify: false, message: \"only alphabet 'ARNDCQEGHILKMFPSTWYV*' are allowed\" };\n } else {\n return { verify: true, message: \"\" };\n }\n },\n },\n ],\n coordinate: [\n {\n trigger: \"verify\",\n verify: (data: any) => {\n const coordinate = Number(data.coordinate);\n if (!coordinate || coordinate < 1 || coordinate > refs.dictionaries.value.protein.length) {\n return { verify: false, message: \"Please input the position information\" };\n } else {\n return { verify: true, message: \"\" };\n }\n },\n },\n ],\n };\n\n //* 函数列表\n const methods = {\n //* 初始化函数\n init: function (origin: any, dictionaries: any) {\n //* 重置表单\n refs.form.value?.reset();\n\n //* 数据初始化\n data.naa = \"\";\n data.oaa = \"\";\n data.codon = \"\";\n data.coordinate = \"\";\n\n //* 数据缓存\n refs.original.value = origin || {};\n refs.dictionaries.value = dictionaries || {};\n },\n\n //* 切换预测位点\n changePos: () => {\n const handler = (valid: boolean) => {\n const coordinate = Number(data.coordinate) || 0;\n const protein = refs.dictionaries.value.protein[coordinate - 1];\n if (valid && protein) {\n data.oaa = protein.value;\n refs.form.value?.validator(() => {}, [\"oaa\"]);\n if (data.codon && /^([a|A|t|T|c|C|g|G]*)$/.test(data.codon)) {\n emit(\"redraw\", { start: protein.start, end: protein.end, ref: protein.value, alt: data.codon });\n } else {\n emit(\"redraw\", { start: protein.start, end: protein.end, ref: protein.value });\n }\n } else {\n data.oaa = \"\";\n }\n };\n\n refs.form.value?.validator(handler, [\"coordinate\"]);\n },\n\n //* 切换Naa\n changeNaa: function () {\n const handler = (valid: boolean) => {\n if (!valid) return;\n\n const coordinate = Number(data.coordinate) || 0;\n const protein = refs.dictionaries.value.protein[coordinate - 1];\n const codon = codons[data.naa] || {};\n\n refs.candidate.value = [];\n (codon.codon || []).forEach((val) => {\n refs.candidate.value.push({ label: val, value: val });\n });\n\n if (data.naa == \"\") {\n protein && emit(\"redraw\", { start: protein.start, end: protein.end, ref: protein.value });\n } else if (refs.candidate.value.length > 0) {\n let codonNumber = 0;\n let codon = refs.candidate.value[0].value;\n if (data.oaa) {\n refs.candidate.value.forEach((c) => {\n let number = 0;\n if (c.value == data.oaa) return;\n if (c.value.charAt(0) == data.oaa.charAt(0)) number++;\n if (c.value.charAt(1) == data.oaa.charAt(1)) number++;\n if (c.value.charAt(2) == data.oaa.charAt(2)) number++;\n if (number > codonNumber) {\n codon = c.value;\n codonNumber = number;\n }\n });\n }\n\n data.codon = codon;\n protein && emit(\"redraw\", { start: protein.start, end: protein.end, ref: protein.value, alt: data.codon });\n }\n };\n\n refs.form.value?.validator(handler, [\"naa\"]);\n },\n\n //* 切换Codon\n changeCodon: function () {\n const coordinate = Number(data.coordinate) || 0;\n const protein = refs.dictionaries.value.protein[coordinate - 1];\n const naa = codonDict[data.codon];\n\n refs.candidate.value = [];\n if (naa) {\n data.naa = naa;\n const codon = codons[naa] || {};\n (codon.codon || []).forEach((val) => {\n refs.candidate.value.push({ label: val, value: val });\n });\n } else {\n data.naa = \"\";\n }\n\n data.codon = data.codon.toUpperCase();\n refs.form.value?.validator(() => {}, [\"naa\"]);\n protein && emit(\"redraw\", { start: protein.start, end: protein.end, ref: protein.value, alt: data.codon });\n },\n\n //* 表单提交事件\n submit: function (callBack: (data: any) => void) {\n refs.form.value?.validator((valid: boolean) => {\n if (valid) {\n const coordinate = Number(data.coordinate) || 0;\n const protein = refs.dictionaries.value.protein[coordinate - 1];\n callBack && callBack({ alt: data.codon, ref: data.oaa, gene_pos: protein.start });\n }\n });\n },\n };\n\n //* 计算属性\n const computeds = {\n oaa: computed(() => {\n if (data.coordinate && data.oaa) {\n const key = codonDict[data.oaa];\n return `${key} (${codons[key].shortnanme}) : ${data.oaa}`;\n }\n\n return \"\";\n }),\n };\n\n return { refs, data, rules, methods, computeds };\n};\n","\n\n\n\n\n","import type { UiForm, UiTypes } from \"various-ui\";\n\nexport const useComposable = (emit: { (event: \"redraw\", data: any): void }) => {\n //* 获取I18n\n const i18n = useI18n();\n\n //* 响应式变量\n const refs = {\n form: ref>(),\n\n dictionaries: ref({}), //? 字典\n original: ref({}), //? 原始数据\n\n cPlaceholder: { start: i18n.t(\"CdsStart\"), end: i18n.t(\"CdsEnd\") },\n };\n\n //* 表单数据\n const data = reactive({\n ref: \"\",\n alt: \"\",\n coordinate: {\n \"start-steps\": 0,\n \"end-steps\": 0,\n \"start\": undefined,\n \"end\": undefined,\n },\n });\n\n //* 工具函数\n const utils = {\n disposePos: (value: number, next: number) => {\n const n = isNaN(next) ? 0 : Number(next);\n if (refs.dictionaries.value.cds[value - 1]) {\n //* 在CDS字典中存在, 则返回真实坐标 + n\n return refs.dictionaries.value.cds[value - 1].start + n;\n } else if (refs.dictionaries.value.cds.length < value) {\n //* 超出CDS字典长度, 则返回最后一个的真实坐标 + n\n return refs.dictionaries.value.cds.slice(-1)[0].start + n;\n } else {\n //* 否则返回-1\n return -1;\n }\n },\n };\n\n //* 表单校验规则\n const rules: { [name: string]: UiTypes.verifyRule[] } = {\n coordinate: [\n {\n trigger: \"change\",\n verify: (data: any) => {\n const seqLen = refs.dictionaries.value?.sequence?.length || 0;\n const startSteps = Number(data.coordinate[\"start-steps\"]) || 0;\n const endSteps = Number(data.coordinate[\"end-steps\"]) || 0;\n const start = Number(data.coordinate.start) || 0;\n const end = Number(data.coordinate.end) || 0;\n\n const realStart = utils.disposePos(start, startSteps);\n const realEnd = utils.disposePos(end, endSteps);\n\n //* 当start, end不存在或超出范围时\n if (!realStart || realStart > seqLen) {\n return {\n verify: false,\n message: i18n.t(\"BioTools.PositionVerify\", {\n type: i18n.t(\"BioTools.Start\"),\n start: 1,\n end: refs.dictionaries.value.cds.length,\n }),\n };\n } else if (!realEnd || realEnd > seqLen) {\n return {\n verify: false,\n message: i18n.t(\"BioTools.PositionVerify\", {\n type: i18n.t(\"BioTools.End\"),\n start: 1,\n end: refs.dictionaries.value.cds.length,\n }),\n };\n } else if (realStart > realEnd) {\n //* 当起始大于结束时\n return { verify: false, message: i18n.t(\"Placeholder.StartExceedEnd\") };\n } else if (realEnd - realStart + 1 > 50) {\n //* 当片段大于20bp时\n return { verify: false, message: i18n.t(\"BioTools.MrnaVerify1\", { length: 50 }) };\n } else {\n return { verify: true, message: \"\" };\n }\n },\n },\n ],\n ref: [\n {\n trigger: \"verify\",\n verify: (data: any) => {\n if (data.ref) return { verify: true, message: \"\" };\n else {\n return { verify: false, message: \"Please provide the coordinate\" };\n }\n },\n },\n ],\n alt: [\n {\n trigger: \"verify\",\n verify: (data: any) => {\n if (data.alt && !/^([A|T|C|G]*)$/.test(data.alt)) {\n return { verify: false, message: \"only alphabet 'ATCG' are allowed\" };\n } else {\n return { verify: true, message: \"\" };\n }\n },\n },\n ],\n };\n\n //* 函数列表\n const methods = {\n //* 初始化函数\n init: function (origin: any, dictionaries: any) {\n //* 重置表单\n refs.form.value?.reset();\n\n //* 数据初始化\n data.ref = \"\";\n data.alt = \"\";\n data.coordinate.end = undefined;\n data.coordinate.start = undefined;\n data.coordinate[\"end-steps\"] = 0;\n data.coordinate[\"start-steps\"] = 0;\n\n //* 数据缓存\n refs.original.value = origin || {};\n refs.dictionaries.value = dictionaries || {};\n },\n\n //* submit事件\n submit: function (callBack: (data: any) => void) {\n const startSteps = Number(data.coordinate[\"start-steps\"]) || 0;\n const start = Number(data.coordinate.start) || 0;\n refs.form.value?.validator((valid: boolean) => {\n valid && callBack && callBack({ alt: data.alt, ref: data.ref, gene_pos: utils.disposePos(start, startSteps) });\n });\n },\n\n //* 切换Alteration\n changeAlt: function () {\n const startSteps = Number(data.coordinate[\"start-steps\"]) || 0;\n const endSteps = Number(data.coordinate[\"end-steps\"]) || 0;\n const start = Number(data.coordinate.start) || 0;\n const end = Number(data.coordinate.end) || 0;\n\n const realStart = utils.disposePos(start, startSteps);\n const realEnd = utils.disposePos(end, endSteps);\n\n const hanlder = (valid: boolean) => {\n if (valid) {\n emit(\"redraw\", { ref: data.ref, alt: data.alt, end: realEnd, start: realStart });\n }\n };\n\n data.alt = data.alt.toUpperCase();\n if (realStart && realEnd) {\n refs.form.value?.validator(hanlder, [\"coordinate\", \"alt\"]);\n } else {\n refs.form.value?.validator(() => {}, [\"alt\"]);\n }\n },\n\n //* 切换预测位置\n changeCoordinate: function () {\n const hanlder = (valid: boolean) => {\n if (valid) {\n const startSteps = Number(data.coordinate[\"start-steps\"]) || 0;\n const endSteps = Number(data.coordinate[\"end-steps\"]) || 0;\n const start = Number(data.coordinate.start) || 0;\n const end = Number(data.coordinate.end) || 0;\n\n const realStart = utils.disposePos(start, startSteps);\n const realEnd = utils.disposePos(end, endSteps);\n const ref = [];\n\n for (let i = realStart; i <= realEnd; i++) {\n ref.push(refs.dictionaries.value.sequence.charAt(i - 1));\n }\n\n data.ref = ref.join(\"\");\n const renderData = { start: realStart, end: realEnd, ref: data.ref, alt: \"\" };\n if (data.alt && /^([A|T|C|G]*)$/.test(data.alt)) {\n renderData.alt = data.alt;\n }\n\n emit(\"redraw\", renderData);\n } else {\n data.ref = \"\";\n }\n };\n\n refs.form.value?.validator(hanlder, [\"coordinate\"]);\n },\n };\n\n return { refs, data, rules, methods };\n};\n","\n\n\n\n\n","//* 组件库\nimport { $message, utility, $loading } from \"various-ui\";\n//* 公共组件\nimport type { ConfirmModal } from \"@/components/windows\";\n//* 公共函数\nimport { Formats } from \"@/assets/js\";\n//* 私有组件\nimport Gene from \"../components/gene/index.vue\";\nimport Protein from \"../components/protein/index.vue\";\nimport Transcript from \"../components/transcript/index.vue\";\nimport PreviewModel from \"./components/preview/index.vue\";\n//* 组件属性\nimport type { VPMInitOption, VPMFormData } from \"../index\";\n\nexport const useComposable = () => {\n //* 获取i18n\n const i18n = useI18n();\n\n //* 获取Route\n const route = useRoute();\n\n //* 响应式变量\n const refs = {\n mrnas: ref([]),\n sequence: ref(\"\"),\n dictionaries: ref<{ [name: string]: any }>({}),\n };\n\n //* 表单数据\n const data = reactive({\n id: Formats.query(route.query.id), //? 基因ID\n mode: \"Gene\", //? 当前模式\n name: \"\", //? 基因名称\n mrna: null, //? 当前选择的mrna\n paste: \"\", //? 待解析的字符串\n transcript: \"\", //? 转录本ID\n });\n\n //* 节点\n const nodes = {\n model: ref>(),\n confirm: ref>(),\n preview: ref>(),\n };\n\n //* 工具函数\n const utils = {\n //* 数据处理函数\n data: (response: any) => {\n if (response?.data?.length) {\n //* 数据初始化\n data.name = response.name || \"--\";\n refs.mrnas.value = [];\n refs.sequence.value = response.sequence || \"\";\n //* 生成转录本选择器配置项\n response?.data?.forEach((mrna: any) => {\n refs.mrnas.value.push(Object.assign(mrna, { length: refs.sequence.value.length }));\n });\n\n //* 初始化选择器数据\n data.mrna = refs.mrnas.value.find((value) => value.value == data.transcript) || refs.mrnas.value[0];\n data.transcript = data.mrna.value;\n\n //* 处理数据生成蛋白列表与CDS列表\n utils.dictionaries();\n\n //* 初始化输入模型与预览模型\n nextTick(() => {\n nodes.model.value?.init(data, Object.assign(refs.dictionaries.value, { sequence: refs.sequence.value }));\n nodes.preview.value?.init(data.mrna);\n if (data.paste) {\n methods.mutation();\n }\n });\n } else {\n $message.warning(i18n.t(\"Placeholder.GeneNotTranscript\"));\n }\n },\n\n //* 生成CDS字典与蛋白字典\n dictionaries: () => {\n //* 初始化蛋白计数器\n const config: any = { start: 0, end: 0, chars: [] };\n\n //* 初始化字典\n refs.dictionaries.value.cds = [];\n refs.dictionaries.value.protein = [];\n\n //- 3. 遍历CDS列表生成CDS字典与蛋白字典\n data.mrna.cds.forEach((value: any) => {\n for (let i = value[0]; i <= value[1]; i++) {\n const char = refs.sequence.value.charAt(i - 1);\n refs.dictionaries.value.cds.push({ start: i, value: char });\n if (config.chars.length == 3) {\n refs.dictionaries.value.protein.push(utility.cloneDeep(Object.assign(config, { value: config.chars.join(\"\") })));\n config.start = i;\n config.chars = [char];\n } else {\n config.chars.push(char);\n config.start = config.start || i;\n config.end = i;\n }\n }\n });\n\n //- 4. 检测是否存在蛋白\n if (config.chars.length == 3) {\n refs.dictionaries.value.protein.push(utility.cloneDeep(Object.assign(config, { value: config.chars.join(\"\") })));\n }\n },\n\n //* 表单提交函数\n submit: (data: Object) => {\n $loading.open({ message: i18n.t(\"UnderLoad\") });\n api.frontend(\"/api/ai/mouse-pheno-predict\", {\n data: data,\n method: \"POST\",\n success: (response) => {\n if (response) {\n window.open(routerResolve({ name: \"MousePhenoPredictResult\", params: { id: response } }).href as string, \"_blank\");\n } else {\n $message.warning(i18n.t(\"UnknownError\"));\n }\n },\n finally: () => {\n $loading.close();\n },\n });\n },\n };\n\n //* 函数列表\n const methods = {\n //* 初始化函数\n init: (option: VPMInitOption) => {\n //* 开启加载器\n $loading.open({ message: i18n.t(\"UnderLoad\"), delay: 200 });\n\n //* 初始化数据\n data.id = option.id;\n data.paste = option.nucleotide || \"\";\n data.transcript = option.transcript || \"\";\n //* 数据获取\n api.frontend(\"/api/gene/mrnas-info\", {\n data: { id: data.id },\n finally: () => $loading.close(),\n success: (response) => {\n utils.data(response);\n },\n });\n },\n\n //* 切换Mrna\n mrna: () => {\n const mrna = refs.mrnas.value.find((val) => val.value === data.transcript);\n //* 获取Mrna成功时触发输入模型的初始化函数\n if (mrna) {\n data.mrna = mrna;\n data.paste = \"\";\n utils.dictionaries();\n //* 初始化输入模型与预览模型\n nextTick(() => {\n nodes.model.value?.init(data, Object.assign(refs.dictionaries.value, { sequence: refs.sequence.value }));\n nodes.preview.value?.init(data.mrna);\n });\n }\n },\n\n //* 切换模式\n mode: function () {\n nextTick(() => {\n //* 数据更新\n data.paste = \"\";\n //* 可视化模型更新\n nodes.model.value?.init(data, Object.assign(refs.dictionaries.value, { sequence: refs.sequence.value }));\n nodes.preview.value?.init(data.mrna);\n });\n },\n\n //* 切换基因\n change: (response: any) => {\n //* 路由更新\n routerPush({ name: \"MousePhenoPredict\", query: { id: response.id } });\n //* 数据更新\n methods.init({ id: response.id });\n },\n\n //* 表单提交\n submit: function () {\n nodes.model.value?.submit((res: any) => {\n const result = Object.assign(res, { name: data.name, gene_id: data.id, transcript_id: data.transcript });\n if (!result.alt) nodes.confirm.value?.open(result);\n else {\n utils.submit(result);\n }\n });\n },\n\n //* 解析突变信息\n mutation: function () {\n //* 无效数据检测\n if (!data.paste) return;\n //* 发起请求\n $loading.open({ message: \"\", delay: 200 });\n //* 突变位点解析\n api.frontend(\"/api/mutations/analyze\", {\n data: { id: data.id, keyword: data.paste, transcript: data.transcript },\n method: \"POST\",\n finally: () => $loading.close(),\n success: (response) => {\n if (data.mode == \"Gene\") {\n //* 当前模式为Gene模式时直接切换表格数据\n nodes.model.value?.changeData(response);\n } else {\n //* 反之切换模式并初始化预览模型和切换表格数据\n data.mode = \"Gene\";\n nextTick(() => {\n nodes.model.value?.init(data, Object.assign(refs.dictionaries.value, { sequence: refs.sequence.value }));\n nodes.model.value?.changeData(response);\n nodes.preview.value?.init(data.mrna);\n });\n }\n },\n });\n },\n };\n\n //* 计算属性\n const computeds = {\n view: computed(() => {\n switch (data.mode) {\n case \"Protein\":\n return Protein;\n case \"Transcript\":\n return Transcript;\n default:\n return Gene;\n }\n }),\n };\n\n return { data, refs, nodes, utils, methods, computeds };\n};\n","\n\n\n\n\n","\n\n\n"],"names":["useComposable","refs","ref","data","routerPush","_a","methods","modal","keyword","disposeData","view","__privateAdd","_disposeData_instances","__publicField","__privateMethod","disposeClassify_fn","config","value","width","result","site","option","i","l","exon","index","size","front","frontEnd","disposeExon_fn","queen","diff","i18n","useI18n","bar","reactive","mode","Konva","container","end","start","radius","content","ev","_b","_c","_d","_e","_f","wireframe","clientX","offsetX","offset","alt","mutation","_g","_h","_i","_j","_k","_l","_m","info","mainNode","tooltipNode","__expose","emit","nodes","seqLen","origin","dictionaries","valid","altNumber","number","chars","hanlder","callBack","__emit","rules","show","candidate","cPlaceholder","form","changeCoordinate","changeAlt","naa","codons","codonDict","coordinate","handler","protein","codon","val","codonNumber","c","computeds","computed","key","changePos","changeNaa","changeCodon","utils","next","n","startSteps","endSteps","realStart","realEnd","renderData","route","useRoute","Formats.query","response","mrna","nextTick","$message","char","utility.cloneDeep","$loading","api","routerResolve","res","Protein","Transcript","Gene","mrnas","confirm","preview","model","onMounted","PredictModel","PredictMiddle"],"mappings":"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"}