@platforma-sdk/ui-vue 1.37.4 → 1.37.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/.turbo/turbo-build.log +868 -868
  2. package/.turbo/turbo-type-check.log +1 -1
  3. package/CHANGELOG.md +14 -0
  4. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.d.ts +0 -6
  5. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.d.ts.map +1 -1
  6. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js +12 -14
  7. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js.map +1 -1
  8. package/dist/components/PlMultiSequenceAlignment/data.d.ts +0 -1
  9. package/dist/components/PlMultiSequenceAlignment/data.d.ts.map +1 -1
  10. package/dist/components/PlMultiSequenceAlignment/data.js +115 -116
  11. package/dist/components/PlMultiSequenceAlignment/data.js.map +1 -1
  12. package/dist/lib/ui/uikit/dist/components/DataTable/BaseCellComponent.vue.js +2 -2
  13. package/dist/lib/ui/uikit/dist/components/DataTable/TdCell.vue.js +2 -2
  14. package/dist/lib/ui/uikit/dist/components/DataTable/composition/useResize.js +2 -2
  15. package/dist/lib/ui/uikit/dist/components/DataTable/composition/useTableColumns.js +6 -6
  16. package/dist/lib/ui/uikit/dist/components/DataTable/state.js +12 -12
  17. package/dist/lib/ui/uikit/dist/components/PlAutocomplete/PlAutocomplete.vue.js +12 -12
  18. package/dist/lib/ui/uikit/dist/components/PlBtnSplit/PlBtnSplit.vue.js +10 -10
  19. package/dist/lib/ui/uikit/dist/components/PlBtnSplit/PlBtnSplit.vue.js.map +1 -1
  20. package/dist/lib/ui/uikit/dist/components/PlElementList/PlElementList.vue.js +10 -0
  21. package/dist/lib/ui/uikit/dist/components/PlElementList/PlElementList.vue2.js +239 -0
  22. package/dist/lib/ui/uikit/dist/components/PlElementList/PlElementList.vue2.js.map +1 -0
  23. package/dist/lib/ui/uikit/dist/components/PlElementList/PlElementList.vue3.js +22 -0
  24. package/dist/{components → lib/ui/uikit/dist/components}/PlElementList/PlElementList.vue3.js.map +1 -1
  25. package/dist/lib/ui/uikit/dist/components/PlElementList/PlElementListItem.vue.js +10 -0
  26. package/dist/lib/ui/uikit/dist/components/PlElementList/PlElementListItem.vue2.js +106 -0
  27. package/dist/lib/ui/uikit/dist/components/PlElementList/PlElementListItem.vue2.js.map +1 -0
  28. package/dist/lib/ui/uikit/dist/components/PlElementList/PlElementListItem.vue3.js +48 -0
  29. package/dist/lib/ui/uikit/dist/components/PlElementList/PlElementListItem.vue3.js.map +1 -0
  30. package/dist/lib/ui/uikit/dist/components/PlElementList/utils.js +17 -0
  31. package/dist/lib/ui/uikit/dist/components/PlElementList/utils.js.map +1 -0
  32. package/dist/lib/ui/uikit/dist/components/PlErrorBoundary/PlErrorBoundary.vue.js +5 -5
  33. package/dist/lib/ui/uikit/dist/components/PlFileDialog/PlFileDialog.vue.js +14 -14
  34. package/dist/lib/ui/uikit/dist/components/PlFileDialog/Remote.vue.js +8 -8
  35. package/dist/lib/ui/uikit/dist/components/PlFileDialog/utils.js +9 -9
  36. package/dist/lib/ui/uikit/dist/components/PlLogView/PlLogView.vue.js +9 -9
  37. package/dist/lib/ui/uikit/dist/composition/useFormState.js +5 -5
  38. package/dist/lib/ui/uikit/dist/composition/useQuery.js +12 -12
  39. package/dist/lib/ui/uikit/dist/composition/useWatchFetch.js +4 -4
  40. package/dist/lib/ui/uikit/dist/index.js +81 -78
  41. package/dist/lib/ui/uikit/dist/index.js.map +1 -1
  42. package/dist/lib/ui/uikit/dist/lib/util/helpers/dist/index.js +156 -127
  43. package/dist/lib/ui/uikit/dist/lib/util/helpers/dist/index.js.map +1 -1
  44. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/@vueuse_core@13.3.0_vue@3.5.13_typescript@5.6.3_/node_modules/@vueuse/core/index.js +53 -43
  45. package/dist/lib/ui/uikit/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
  46. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/@vueuse_integrations@13.3.0_axios@1.8.1_focus-trap@7.6.0_sortablejs@1.15.6_vue@3.5.13_typescript@5.6.3_/node_modules/@vueuse/integrations/useSortable.js +51 -0
  47. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/@vueuse_integrations@13.3.0_axios@1.8.1_focus-trap@7.6.0_sortablejs@1.15.6_vue@3.5.13_typescript@5.6.3_/node_modules/@vueuse/integrations/useSortable.js.map +1 -0
  48. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/@vueuse_shared@13.3.0_vue@3.5.13_typescript@5.6.3_/node_modules/@vueuse/shared/index.js +70 -62
  49. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/@vueuse_shared@13.3.0_vue@3.5.13_typescript@5.6.3_/node_modules/@vueuse/shared/index.js.map +1 -1
  50. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/sortablejs@1.15.6/node_modules/sortablejs/modular/sortable.esm.js +1262 -0
  51. package/dist/lib/ui/uikit/dist/node_modules/.pnpm/sortablejs@1.15.6/node_modules/sortablejs/modular/sortable.esm.js.map +1 -0
  52. package/dist/lib/ui/uikit/dist/utils/DropdownOverlay/DropdownOverlay.vue.js +2 -2
  53. package/dist/lib/util/helpers/dist/index.js +43 -85
  54. package/dist/lib/util/helpers/dist/index.js.map +1 -1
  55. package/dist/lib.d.ts +0 -1
  56. package/dist/lib.d.ts.map +1 -1
  57. package/dist/lib.js +105 -105
  58. package/dist/node_modules/.pnpm/@vueuse_core@13.3.0_vue@3.5.13_typescript@5.5.4_/node_modules/@vueuse/core/index.js +30 -31
  59. package/dist/node_modules/.pnpm/@vueuse_core@13.3.0_vue@3.5.13_typescript@5.5.4_/node_modules/@vueuse/core/index.js.map +1 -1
  60. package/dist/sdk/model/dist/index.js +39 -32
  61. package/dist/sdk/model/dist/index.js.map +1 -1
  62. package/package.json +5 -5
  63. package/src/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue +0 -7
  64. package/src/components/PlMultiSequenceAlignment/data.ts +2 -6
  65. package/src/lib.ts +0 -2
  66. package/dist/components/PlElementList/PlElementList.vue.d.ts +0 -61
  67. package/dist/components/PlElementList/PlElementList.vue.d.ts.map +0 -1
  68. package/dist/components/PlElementList/PlElementList.vue.js +0 -10
  69. package/dist/components/PlElementList/PlElementList.vue2.js +0 -214
  70. package/dist/components/PlElementList/PlElementList.vue2.js.map +0 -1
  71. package/dist/components/PlElementList/PlElementList.vue3.js +0 -13
  72. package/dist/components/PlElementList/PlElementListItem.vue.d.ts +0 -55
  73. package/dist/components/PlElementList/PlElementListItem.vue.d.ts.map +0 -1
  74. package/dist/components/PlElementList/PlElementListItem.vue.js +0 -10
  75. package/dist/components/PlElementList/PlElementListItem.vue2.js +0 -103
  76. package/dist/components/PlElementList/PlElementListItem.vue2.js.map +0 -1
  77. package/dist/components/PlElementList/PlElementListItem.vue3.js +0 -37
  78. package/dist/components/PlElementList/PlElementListItem.vue3.js.map +0 -1
  79. package/dist/components/PlElementList/index.d.ts +0 -2
  80. package/dist/components/PlElementList/index.d.ts.map +0 -1
  81. package/dist/components/PlElementList/utils.d.ts +0 -3
  82. package/dist/components/PlElementList/utils.d.ts.map +0 -1
  83. package/dist/components/PlElementList/utils.js +0 -17
  84. package/dist/components/PlElementList/utils.js.map +0 -1
  85. package/dist/node_modules/.pnpm/@vueuse_integrations@13.3.0_axios@1.8.1_focus-trap@7.6.0_sortablejs@1.15.6_vue@3.5.13_typescript@5.5.4_/node_modules/@vueuse/integrations/useSortable.js +0 -51
  86. package/dist/node_modules/.pnpm/@vueuse_integrations@13.3.0_axios@1.8.1_focus-trap@7.6.0_sortablejs@1.15.6_vue@3.5.13_typescript@5.5.4_/node_modules/@vueuse/integrations/useSortable.js.map +0 -1
  87. package/dist/node_modules/.pnpm/sortablejs@1.15.6/node_modules/sortablejs/modular/sortable.esm.js +0 -1262
  88. package/dist/node_modules/.pnpm/sortablejs@1.15.6/node_modules/sortablejs/modular/sortable.esm.js.map +0 -1
  89. package/src/components/PlElementList/PlElementList.vue +0 -287
  90. package/src/components/PlElementList/PlElementListItem.vue +0 -222
  91. package/src/components/PlElementList/README.md +0 -123
  92. package/src/components/PlElementList/index.ts +0 -1
  93. package/src/components/PlElementList/utils.ts +0 -17
  94. /package/dist/{components → lib/ui/uikit/dist/components}/PlElementList/PlElementList.vue.js.map +0 -0
  95. /package/dist/{components → lib/ui/uikit/dist/components}/PlElementList/PlElementListItem.vue.js.map +0 -0
@@ -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 type JoinEntry,\n matchAxisId,\n parseJson,\n type PColumnIdAndSpec,\n type PColumnPredicate,\n type PFrameHandle,\n type PlSelectionModel,\n type PObjectId,\n type PTableColumnId,\n type PTableSorting,\n pTableValue,\n} from '@platforma-sdk/model';\nimport { computedAsync } from '@vueuse/core';\nimport { type MaybeRefOrGetter, ref, shallowRef, toValue } from 'vue';\nimport { type Markup, markupAlignedSequence, parseMarkup } from './markup';\nimport { multiSequenceAlignment } from './multi-sequence-alignment';\n\nconst getPFrameDriver = () => getRawPlatformaInstance().pFrameDriver;\n\nexport const sequenceLimit = 1000;\n\nexport function useSequenceColumnsOptions(\n params: MaybeRefOrGetter<{\n pFrame: PFrameHandle | undefined;\n sequenceColumnPredicate: PColumnPredicate;\n }>,\n) {\n const error = shallowRef<Error>();\n const data = computedAsync(\n async () => {\n try {\n error.value = undefined;\n return await getSequenceColumnsOptions(toValue(params));\n } catch (err) {\n error.value = ensureError(err);\n return { options: [], defaults: [] };\n }\n },\n { options: [], defaults: [] },\n );\n return { data, error };\n}\n\nexport function useLabelColumnsOptions(\n params: MaybeRefOrGetter<{\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[];\n }>,\n) {\n const error = shallowRef<Error>();\n const data = computedAsync(\n async () => {\n try {\n error.value = undefined;\n return await getLabelColumnsOptions(toValue(params));\n } catch (err) {\n console.error(err);\n error.value = ensureError(err);\n return { options: [], defaults: [] };\n }\n },\n { options: [], defaults: [] },\n );\n return { data, error };\n}\n\nexport function useMarkupColumnsOptions(\n params: MaybeRefOrGetter<{\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[];\n }>,\n) {\n const error = shallowRef<Error>();\n const data = computedAsync(\n async () => {\n try {\n error.value = undefined;\n return await getMarkupColumnsOptions(toValue(params));\n } catch (err) {\n console.error(err);\n error.value = ensureError(err);\n return [];\n }\n },\n [],\n );\n return { data, error };\n}\n\nexport function useMultipleAlignmentData(\n params: MaybeRefOrGetter<{\n pframe: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[];\n labelColumnIds: PTableColumnId[];\n markupColumnId: PObjectId | undefined;\n linkerColumnPredicate: PColumnPredicate | undefined;\n selection: PlSelectionModel | undefined;\n }>,\n) {\n const loading = ref(true);\n const error = shallowRef<Error>();\n const data = computedAsync(\n async () => {\n try {\n error.value = undefined;\n return await getMultipleAlignmentData(toValue(params));\n } catch (err) {\n console.error(err);\n error.value = ensureError(err);\n return { sequences: [], labels: [], exceedsLimit: false };\n }\n },\n { sequences: [], labels: [], exceedsLimit: false },\n { evaluating: loading },\n );\n return { data, error, loading };\n}\n\nasync function getSequenceColumnsOptions({\n pFrame,\n sequenceColumnPredicate,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnPredicate: (column: PColumnIdAndSpec) => boolean;\n}): Promise<OptionsWithDefaults<PObjectId>> {\n if (!pFrame) return { options: [], defaults: [] };\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[];\n}): Promise<OptionsWithDefaults<PTableColumnId>> {\n if (!pFrame) return { options: [], defaults: [] };\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[];\n}): Promise<ListOptionNormalized<PObjectId>[]> {\n if (!pFrame || sequenceColumnIds.length !== 1) return [];\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 linkerColumnPredicate,\n selection,\n}: {\n pframe: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[];\n labelColumnIds: PTableColumnId[];\n markupColumnId: PObjectId | undefined;\n linkerColumnPredicate: PColumnPredicate | undefined;\n selection: PlSelectionModel | undefined;\n}): Promise<MultipleAlignmentData> {\n if (!pframe || sequenceColumnIds.length === 0) {\n return { sequences: [], labels: [], exceedsLimit: false };\n }\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pframe);\n const linkerColumns = linkerColumnPredicate\n ? columns.filter((c) => linkerColumnPredicate(c))\n : [];\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(Array.from(\n { length: rowCount },\n (_, row) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString()\n ?? '',\n )),\n ),\n );\n\n const sequences = Array.from(\n { length: rowCount },\n (_, row) => alignedSequences.map((column) => column[row]),\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 result: MultipleAlignmentData = { sequences, labels, exceedsLimit };\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 return result;\n}\n\ntype MultipleAlignmentData = {\n sequences: string[][];\n labels: string[][];\n markup?: {\n labels: Record<string, string>;\n data: Markup[];\n };\n exceedsLimit: boolean;\n};\n\ntype OptionsWithDefaults<T> = {\n options: ListOptionNormalized<T>[];\n defaults: T[];\n};\n"],"names":["getPFrameDriver","getRawPlatformaInstance","sequenceLimit","useSequenceColumnsOptions","params","error","shallowRef","computedAsync","getSequenceColumnsOptions","toValue","err","ensureError","useLabelColumnsOptions","getLabelColumnsOptions","useMarkupColumnsOptions","getMarkupColumnsOptions","useMultipleAlignmentData","loading","ref","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","linkerColumnPredicate","selection","linkerColumns","c","filterColumn","createRowSelectionColumn","primaryEntry","secondaryEntry","sorting","request","table","rowCount","exceedsLimit","sequenceColumns","labelColumns","markupColumn","alignedSequences","multiSequenceAlignment","_","row","pTableValue","sequences","labels","result","data","markup","parseMarkup","markupAlignedSequence"],"mappings":"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"}
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 PColumnPredicate,\n type PFrameHandle,\n type PlSelectionModel,\n type PObjectId,\n type PTableColumnId,\n type PTableSorting,\n pTableValue,\n} from '@platforma-sdk/model';\nimport { computedAsync } from '@vueuse/core';\nimport { type MaybeRefOrGetter, ref, shallowRef, toValue } from 'vue';\nimport { type Markup, markupAlignedSequence, parseMarkup } from './markup';\nimport { multiSequenceAlignment } from './multi-sequence-alignment';\n\nconst getPFrameDriver = () => getRawPlatformaInstance().pFrameDriver;\n\nexport const sequenceLimit = 1000;\n\nexport function useSequenceColumnsOptions(\n params: MaybeRefOrGetter<{\n pFrame: PFrameHandle | undefined;\n sequenceColumnPredicate: PColumnPredicate;\n }>,\n) {\n const error = shallowRef<Error>();\n const data = computedAsync(\n async () => {\n try {\n error.value = undefined;\n return await getSequenceColumnsOptions(toValue(params));\n } catch (err) {\n error.value = ensureError(err);\n return { options: [], defaults: [] };\n }\n },\n { options: [], defaults: [] },\n );\n return { data, error };\n}\n\nexport function useLabelColumnsOptions(\n params: MaybeRefOrGetter<{\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[];\n }>,\n) {\n const error = shallowRef<Error>();\n const data = computedAsync(\n async () => {\n try {\n error.value = undefined;\n return await getLabelColumnsOptions(toValue(params));\n } catch (err) {\n console.error(err);\n error.value = ensureError(err);\n return { options: [], defaults: [] };\n }\n },\n { options: [], defaults: [] },\n );\n return { data, error };\n}\n\nexport function useMarkupColumnsOptions(\n params: MaybeRefOrGetter<{\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[];\n }>,\n) {\n const error = shallowRef<Error>();\n const data = computedAsync(\n async () => {\n try {\n error.value = undefined;\n return await getMarkupColumnsOptions(toValue(params));\n } catch (err) {\n console.error(err);\n error.value = ensureError(err);\n return [];\n }\n },\n [],\n );\n return { data, error };\n}\n\nexport function useMultipleAlignmentData(\n params: MaybeRefOrGetter<{\n pframe: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[];\n labelColumnIds: PTableColumnId[];\n markupColumnId: PObjectId | undefined;\n selection: PlSelectionModel | undefined;\n }>,\n) {\n const loading = ref(true);\n const error = shallowRef<Error>();\n const data = computedAsync(\n async () => {\n try {\n error.value = undefined;\n return await getMultipleAlignmentData(toValue(params));\n } catch (err) {\n console.error(err);\n error.value = ensureError(err);\n return { sequences: [], labels: [], exceedsLimit: false };\n }\n },\n { sequences: [], labels: [], exceedsLimit: false },\n { evaluating: loading },\n );\n return { data, error, loading };\n}\n\nasync function getSequenceColumnsOptions({\n pFrame,\n sequenceColumnPredicate,\n}: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnPredicate: (column: PColumnIdAndSpec) => boolean;\n}): Promise<OptionsWithDefaults<PObjectId>> {\n if (!pFrame) return { options: [], defaults: [] };\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[];\n}): Promise<OptionsWithDefaults<PTableColumnId>> {\n if (!pFrame) return { options: [], defaults: [] };\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[];\n}): Promise<ListOptionNormalized<PObjectId>[]> {\n if (!pFrame || sequenceColumnIds.length !== 1) return [];\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}: {\n pframe: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[];\n labelColumnIds: PTableColumnId[];\n markupColumnId: PObjectId | undefined;\n selection: PlSelectionModel | undefined;\n}): Promise<MultipleAlignmentData> {\n if (!pframe || sequenceColumnIds.length === 0) {\n return { sequences: [], labels: [], exceedsLimit: false };\n }\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(Array.from(\n { length: rowCount },\n (_, row) =>\n pTableValue(column.data, row, { na: '', absent: '' })?.toString()\n ?? '',\n )),\n ),\n );\n\n const sequences = Array.from(\n { length: rowCount },\n (_, row) => alignedSequences.map((column) => column[row]),\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 result: MultipleAlignmentData = { sequences, labels, exceedsLimit };\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 return result;\n}\n\ntype MultipleAlignmentData = {\n sequences: string[][];\n labels: string[][];\n markup?: {\n labels: Record<string, string>;\n data: Markup[];\n };\n exceedsLimit: boolean;\n};\n\ntype OptionsWithDefaults<T> = {\n options: ListOptionNormalized<T>[];\n defaults: T[];\n};\n"],"names":["getPFrameDriver","getRawPlatformaInstance","sequenceLimit","useSequenceColumnsOptions","params","error","shallowRef","computedAsync","getSequenceColumnsOptions","toValue","err","ensureError","useLabelColumnsOptions","getLabelColumnsOptions","useMarkupColumnsOptions","getMarkupColumnsOptions","useMultipleAlignmentData","loading","ref","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","linkerColumns","isLinkerColumn","filterColumn","createRowSelectionColumn","primaryEntry","secondaryEntry","sorting","request","table","rowCount","exceedsLimit","sequenceColumns","labelColumns","markupColumn","alignedSequences","multiSequenceAlignment","_","row","pTableValue","sequences","labels","result","data","markup","parseMarkup","markupAlignedSequence"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as y, reactive as b, computed as k, ref as C, createElementBlock as o, openBlock as u, normalizeClass as V, toDisplayString as _, unref as g } from "vue";
2
2
  import { call as B } from "../../lib/util/helpers/dist/index.js";
3
- const F = ["value"], T = { key: 1 }, S = /* @__PURE__ */ y({
3
+ const F = ["value"], T = { key: 1 }, R = /* @__PURE__ */ y({
4
4
  __name: "BaseCellComponent",
5
5
  props: {
6
6
  modelValue: {},
@@ -37,6 +37,6 @@ const F = ["value"], T = { key: 1 }, S = /* @__PURE__ */ y({
37
37
  }
38
38
  });
39
39
  export {
40
- S as default
40
+ R as default
41
41
  };
42
42
  //# sourceMappingURL=BaseCellComponent.vue.js.map
@@ -6,7 +6,7 @@ import D from "./BaseCellComponent.vue.js";
6
6
  const U = ["^data-row-index"], T = {
7
7
  key: 0,
8
8
  class: "control-cell"
9
- }, j = /* @__PURE__ */ R({
9
+ }, F = /* @__PURE__ */ R({
10
10
  __name: "TdCell",
11
11
  props: {
12
12
  cell: {}
@@ -70,6 +70,6 @@ const U = ["^data-row-index"], T = {
70
70
  }
71
71
  });
72
72
  export {
73
- j as default
73
+ F as default
74
74
  };
75
75
  //# sourceMappingURL=TdCell.vue.js.map
@@ -17,7 +17,7 @@ function I(i) {
17
17
  });
18
18
  }).slice(0, s.length - 1);
19
19
  }
20
- function _(i, o) {
20
+ function A(i, o) {
21
21
  const s = y(), r = w(o, {}), { data: e } = i, n = h(
22
22
  (t) => {
23
23
  a(e.resizeTh, (c) => {
@@ -49,6 +49,6 @@ function _(i, o) {
49
49
  }
50
50
  export {
51
51
  I as getColumnPositions,
52
- _ as useResize
52
+ A as useResize
53
53
  };
54
54
  //# sourceMappingURL=useResize.js.map
@@ -12,12 +12,12 @@ function b(l) {
12
12
  frozen: !0
13
13
  })
14
14
  );
15
- let r = 0;
16
- const n = s.map((o) => {
17
- const c = { ...o, offset: r };
18
- return r += o.width + w, c;
19
- }), u = n.filter((o) => o.frozen);
20
- return p(n, (o) => o.frozen ? !1 : t < o.offset + o.width && o.offset < a + t).concat(u).map((o) => ({
15
+ let n = 0;
16
+ const r = s.map((o) => {
17
+ const c = { ...o, offset: n };
18
+ return n += o.width + w, c;
19
+ }), u = r.filter((o) => o.frozen);
20
+ return p(r, (o) => o.frozen ? !1 : t < o.offset + o.width && o.offset < a + t).concat(u).map((o) => ({
21
21
  ...o,
22
22
  style: {
23
23
  left: o.frozen ? `${o.offset}px` : `${o.offset - e.scrollLeft}px`,
@@ -1,17 +1,17 @@
1
1
  import { reactive as W, watch as u, computed as a, provide as v } from "vue";
2
- import { deepClone as h, tap as p, clamp as m, deepEqual as S, resolveAwaited as C, delay as R } from "../../lib/util/helpers/dist/index.js";
2
+ import { deepClone as h, tap as p, clamp as m, deepEqual as R, resolveAwaited as S, delay as C } from "../../lib/util/helpers/dist/index.js";
3
3
  import { stateKey as L } from "./keys.js";
4
- import { useTableColumns as D } from "./composition/useTableColumns.js";
5
- import { useTableRows as $ } from "./composition/useTableRows.js";
4
+ import { useTableColumns as j } from "./composition/useTableColumns.js";
5
+ import { useTableRows as A } from "./composition/useTableRows.js";
6
6
  import { GAP as w, WINDOW_DELTA as g } from "./constants.js";
7
- const j = async (l, t) => {
7
+ const B = async (l, t) => {
8
8
  const { scrollTop: r, bodyHeight: i } = l;
9
- return await R(0), C({
9
+ return await C(0), S({
10
10
  rows: t.getRows(r, i),
11
11
  dataWindow: l
12
12
  });
13
13
  };
14
- function I(l) {
14
+ function K(l) {
15
15
  const t = W({
16
16
  rowIndex: -1,
17
17
  columns: [],
@@ -41,14 +41,14 @@ function I(l) {
41
41
  bodyHeight: t.bodyHeight,
42
42
  scrollTop: t.scrollTop,
43
43
  current: t.currentWindow
44
- })), n = D({
44
+ })), n = j({
45
45
  data: t,
46
46
  settings: r
47
- }), T = $(t, n), d = {
47
+ }), H = A(t, n), d = {
48
48
  data: t,
49
49
  settings: r,
50
50
  tableColumns: n,
51
- tableRows: T,
51
+ tableRows: H,
52
52
  adjustWidth: () => {
53
53
  const e = t.columns.reduce((s, c) => s + c.width + w, 0), o = t.bodyWidth + t.scrollLeft;
54
54
  if (e < o) {
@@ -98,14 +98,14 @@ function I(l) {
98
98
  (!s || e.scrollTop < s.scrollTop || e.scrollTop + e.bodyHeight > s.bodyHeight + s.scrollTop) && (t.currentWindow = {
99
99
  scrollTop: e.scrollTop - g,
100
100
  bodyHeight: e.bodyHeight + g * 2
101
- }, j(h(t.currentWindow), r.value.dataSource).then(({ rows: c, dataWindow: H }) => {
102
- S(t.currentWindow, H) && (t.rows = c);
101
+ }, B(h(t.currentWindow), r.value.dataSource).then(({ rows: c, dataWindow: T }) => {
102
+ R(t.currentWindow, T) && (t.rows = c);
103
103
  }));
104
104
  },
105
105
  { deep: !0, immediate: !0 }
106
106
  ), v(L, d), d;
107
107
  }
108
108
  export {
109
- I as createState
109
+ K as createState
110
110
  };
111
111
  //# sourceMappingURL=state.js.map
@@ -1,4 +1,4 @@
1
- import { defineComponent as ne, mergeModels as pe, useModel as ce, useSlots as se, ref as m, useTemplateRef as ue, reactive as de, computed as u, unref as h, watch as x, watchPostEffect as ve, createElementBlock as n, openBlock as r, withModifiers as L, createElementVNode as g, createCommentVNode as s, normalizeClass as M, createBlock as _, createVNode as R, withDirectives as fe, vModelText as me, withCtx as D, createTextVNode as he, toDisplayString as k, renderSlot as H, Fragment as xe, renderList as ge } from "vue";
1
+ import { defineComponent as ne, mergeModels as pe, useModel as ce, useSlots as se, ref as m, useTemplateRef as ue, reactive as de, computed as u, unref as h, watch as x, watchPostEffect as ve, createElementBlock as n, openBlock as r, withModifiers as L, createElementVNode as g, createCommentVNode as s, normalizeClass as M, createBlock as _, createVNode as O, withDirectives as fe, vModelText as me, withCtx as D, createTextVNode as he, toDisplayString as k, renderSlot as R, Fragment as xe, renderList as ge } from "vue";
2
2
  import { tap as we } from "../../helpers/functions.js";
3
3
  import be from "../PlTooltip/PlTooltip.vue.js";
4
4
  import _e from "../../utils/DoubleContour.vue.js";
@@ -6,7 +6,7 @@ import { useLabelNotch as ke } from "../../utils/useLabelNotch.js";
6
6
  import { deepEqual as y } from "../../helpers/objects.js";
7
7
  import ye from "../DropdownListItem.vue.js";
8
8
  import ze from "../LongText.vue.js";
9
- import { normalizeListOptions as O } from "../../helpers/utils.js";
9
+ import { normalizeListOptions as H } from "../../helpers/utils.js";
10
10
  import Le from "../PlIcon16/PlIcon16.vue.js";
11
11
  import Se from "../PlIcon24/PlIcon24.vue.js";
12
12
  import $e from "../../utils/DropdownOverlay/DropdownOverlay.vue.js";
@@ -34,13 +34,13 @@ const Be = ["tabindex"], Ve = { class: "pl-autocomplete__container" }, Ae = { cl
34
34
  }, Te = { key: 0 }, qe = {
35
35
  key: 0,
36
36
  class: "nothing-found"
37
- }, Re = {
37
+ }, Oe = {
38
38
  key: 0,
39
39
  class: "pl-autocomplete__error"
40
- }, He = {
40
+ }, Re = {
41
41
  key: 1,
42
42
  class: "pl-autocomplete__helper"
43
- }, Oe = {
43
+ }, He = {
44
44
  key: 2,
45
45
  class: "pl-autocomplete__helper"
46
46
  }, Ue = {
@@ -74,7 +74,7 @@ const Be = ["tabindex"], Ve = { class: "pl-autocomplete__container" }, Ae = { cl
74
74
  }), P = () => we(
75
75
  b.value.findIndex((e) => y(e.value, a.value)),
76
76
  (e) => e < 0 ? 0 : e
77
- ), W = () => t.activeIndex = P(), $ = m([]), w = m(), b = u(() => O($.value).map((e, o) => ({
77
+ ), W = () => t.activeIndex = P(), $ = m([]), w = m(), b = u(() => H($.value).map((e, o) => ({
78
78
  ...e,
79
79
  index: o,
80
80
  isSelected: o === Y.value,
@@ -145,7 +145,7 @@ const Be = ["tabindex"], Ve = { class: "pl-autocomplete__container" }, Ae = { cl
145
145
  return x(() => B.value, (e) => {
146
146
  e && ($.value = e, p.value !== null && (I.value = !1));
147
147
  }), x(() => q.value, (e) => {
148
- e && (w.value = O([e])[0]);
148
+ e && (w.value = H([e])[0]);
149
149
  }), x(() => B.error, (e) => {
150
150
  e && (I.value = !!e);
151
151
  }), x(() => B.loading || q.loading, (e) => {
@@ -179,7 +179,7 @@ const Be = ["tabindex"], Ve = { class: "pl-autocomplete__container" }, Ae = { cl
179
179
  [me, p.value]
180
180
  ]),
181
181
  t.open ? s("", !0) : (r(), n("div", De, [
182
- R(ze, null, {
182
+ O(ze, null, {
183
183
  default: D(() => [
184
184
  he(k(F.value), 1)
185
185
  ]),
@@ -197,7 +197,7 @@ const Be = ["tabindex"], Ve = { class: "pl-autocomplete__container" }, Ae = { cl
197
197
  name: "delete-clear",
198
198
  onClick: L(J, ["stop"])
199
199
  })) : s("", !0),
200
- H(e.$slots, "append"),
200
+ R(e.$slots, "append"),
201
201
  g("div", {
202
202
  class: "pl-autocomplete__arrow-wrapper",
203
203
  onClick: L(X, ["stop"])
@@ -221,7 +221,7 @@ const Be = ["tabindex"], Ve = { class: "pl-autocomplete__container" }, Ae = { cl
221
221
  position: "top"
222
222
  }, {
223
223
  tooltip: D(() => [
224
- H(e.$slots, "tooltip")
224
+ R(e.$slots, "tooltip")
225
225
  ]),
226
226
  _: 3
227
227
  })) : s("", !0)
@@ -247,10 +247,10 @@ const Be = ["tabindex"], Ve = { class: "pl-autocomplete__container" }, Ae = { cl
247
247
  ]),
248
248
  _: 1
249
249
  }, 8, ["root"])) : s("", !0),
250
- R(_e, { class: "pl-autocomplete__contour" })
250
+ O(_e, { class: "pl-autocomplete__contour" })
251
251
  ])
252
252
  ], 42, Be),
253
- C.value ? (r(), n("div", Re, k(C.value), 1)) : z.value && e.loadingOptionsHelper ? (r(), n("div", He, k(e.loadingOptionsHelper), 1)) : e.helper ? (r(), n("div", Oe, k(e.helper), 1)) : s("", !0)
253
+ C.value ? (r(), n("div", Oe, k(C.value), 1)) : z.value && e.loadingOptionsHelper ? (r(), n("div", Re, k(e.loadingOptionsHelper), 1)) : e.helper ? (r(), n("div", He, k(e.helper), 1)) : s("", !0)
254
254
  ]));
255
255
  }
256
256
  });
@@ -1,4 +1,4 @@
1
- import { defineComponent as $, mergeModels as z, useModel as O, ref as u, reactive as I, watch as R, computed as d, createElementBlock as y, openBlock as r, normalizeClass as D, createElementVNode as w, createBlock as E, createCommentVNode as W, withKeys as G, withModifiers as H, toDisplayString as J, unref as M, Teleport as Q, normalizeStyle as X, Fragment as Y, renderList as Z } from "vue";
1
+ import { defineComponent as U, mergeModels as z, useModel as O, ref as u, reactive as I, watch as R, computed as d, createElementBlock as y, openBlock as r, normalizeClass as D, createElementVNode as w, createBlock as E, createCommentVNode as W, withKeys as G, withModifiers as H, toDisplayString as J, unref as M, Teleport as Q, normalizeStyle as X, Fragment as Y, renderList as Z } from "vue";
2
2
  import ee from "../DropdownListItem.vue.js";
3
3
  import { useElementPosition as oe } from "../../composition/usePosition.js";
4
4
  import { normalizeListOptions as te } from "../../helpers/utils.js";
@@ -14,7 +14,7 @@ import ne from "../PlIcon16/PlIcon16.vue.js";
14
14
  console.error("vite-plugin-css-injected-by-js", v);
15
15
  }
16
16
  })();
17
- const ie = ["onKeyup"], ce = /* @__PURE__ */ $({
17
+ const ie = ["onKeyup"], ce = /* @__PURE__ */ U({
18
18
  __name: "PlBtnSplit",
19
19
  props: /* @__PURE__ */ z({
20
20
  options: {},
@@ -56,7 +56,7 @@ const ie = ["onKeyup"], ce = /* @__PURE__ */ $({
56
56
  isSelected: o === N.value,
57
57
  isActive: o === t.activeIndex
58
58
  }))
59
- ), x = d(() => a.loading || a.options === void 0), P = d(() => {
59
+ ), x = d(() => a.loading || a.options === void 0), T = d(() => {
60
60
  var e;
61
61
  return ((e = c.value.find((o) => S(o.value, b.value))) == null ? void 0 : e.label) ?? (a.options === void 0 ? "..." : "");
62
62
  });
@@ -71,7 +71,7 @@ const ie = ["onKeyup"], ce = /* @__PURE__ */ $({
71
71
  function m() {
72
72
  j("click");
73
73
  }
74
- const T = (e) => {
74
+ const F = (e) => {
75
75
  var o, n;
76
76
  if (["ArrowDown", "ArrowUp", "Enter", "Escape"].includes(e.code))
77
77
  e.preventDefault();
@@ -91,9 +91,9 @@ const ie = ["onKeyup"], ce = /* @__PURE__ */ $({
91
91
  if (!_)
92
92
  return;
93
93
  e.code === "Enter" && B((n = h.find((k) => k.index === g)) == null ? void 0 : n.value);
94
- const L = h.findIndex((k) => k.index === g) ?? -1, q = e.code === "ArrowDown" ? 1 : e.code === "ArrowUp" ? -1 : 0, U = Math.abs(L + q + _) % _;
95
- t.activeIndex = c.value[U].index ?? -1;
96
- }, F = (e) => {
94
+ const P = h.findIndex((k) => k.index === g) ?? -1, $ = e.code === "ArrowDown" ? 1 : e.code === "ArrowUp" ? -1 : 0, q = Math.abs(P + $ + _) % _;
95
+ t.activeIndex = c.value[q].index ?? -1;
96
+ }, L = (e) => {
97
97
  var o, n;
98
98
  const l = e.relatedTarget;
99
99
  !((o = i.value) != null && o.contains(l)) && !((n = f.value) != null && n.contains(l)) && (t.open = !1);
@@ -102,8 +102,8 @@ const ie = ["onKeyup"], ce = /* @__PURE__ */ $({
102
102
  ref_key: "root",
103
103
  ref: i,
104
104
  class: D([{ disabled: e.disabled || x.value, loading: x.value }, "pl-btn-split d-flex"]),
105
- onFocusout: F,
106
- onKeydown: T
105
+ onFocusout: L,
106
+ onKeydown: F
107
107
  }, [
108
108
  w("div", {
109
109
  ref_key: "buttonAction",
@@ -112,7 +112,7 @@ const ie = ["onKeyup"], ce = /* @__PURE__ */ $({
112
112
  tabindex: "0",
113
113
  onClick: m,
114
114
  onKeyup: G(H(m, ["stop"]), ["enter"])
115
- }, J(P.value), 41, ie),
115
+ }, J(T.value), 41, ie),
116
116
  w("div", {
117
117
  ref_key: "menuActivator",
118
118
  ref: C,
@@ -1 +1 @@
1
- {"version":3,"file":"PlBtnSplit.vue.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlBtnSplit/PlBtnSplit.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"M = unknown\">\nimport { computed, reactive, ref, unref, watch } from 'vue';\nimport './pl-btn-split.scss';\nimport DropdownListItem from '../DropdownListItem.vue';\nimport type { ListOption } from '../../types';\nimport { useElementPosition } from '../../composition/usePosition';\nimport { normalizeListOptions } from '../../helpers/utils';\nimport { deepEqual } from '@milaboratories/helpers';\nimport { PlMaskIcon16 } from '../PlMaskIcon16';\n\nconst props = defineProps<{\n /**\n * List of available options for the dropdown menu\n */\n options?: Readonly<ListOption<M>[]>;\n\n /**\n * If `true`, the dropdown component is disabled and cannot be interacted with.\n */\n disabled?: boolean;\n\n /**\n * If `true,` the button is disabled, cannot be interacted with, and shows a special 'loading' icon.\n */\n loading?: boolean;\n}>();\n\nconst emits = defineEmits(['click']);\n\nconst model = defineModel<M>({ required: true });\n\nconst root = ref<HTMLElement | undefined>();\nconst list = ref<HTMLElement | undefined>();\nconst menuActivator = ref<HTMLElement | undefined>();\nconst buttonAction = ref<HTMLElement | undefined>();\n\nconst data = reactive({\n open: false,\n optionsHeight: 0,\n activeIndex: -1,\n});\n\ndefineExpose({\n data,\n});\n\nconst optionsStyle = reactive({\n top: '0px',\n left: '0px',\n width: '0px',\n});\n\nwatch(\n list,\n (el) => {\n if (el) {\n const rect = el.getBoundingClientRect();\n data.optionsHeight = rect.height;\n window.dispatchEvent(new CustomEvent('adjust'));\n }\n },\n { immediate: true },\n);\n\nconst iconState = computed(() => (data.open ? 'mask-24 mask-chevron-up' : 'mask-24 mask-chevron-down'));\n\nconst selectedIndex = computed(() => {\n return (props.options ?? []).findIndex((o) => deepEqual(o.value, model.value));\n});\n\nconst items = computed(() =>\n normalizeListOptions(props.options ?? []).map((opt, index) => ({\n ...opt,\n index,\n isSelected: index === selectedIndex.value,\n isActive: index === data.activeIndex,\n })),\n);\n\nconst isLoadingOptions = computed(() => props.loading || props.options === undefined);\n\nconst actionName = computed(() => items.value.find((o) => deepEqual(o.value, model.value))?.label ?? (props.options === undefined ? '...' : ''));\n\nuseElementPosition(root, (pos) => {\n const focusWidth = 3;\n\n const downTopOffset = pos.top + pos.height + focusWidth;\n\n if (downTopOffset + data.optionsHeight > pos.clientHeight) {\n optionsStyle.top = pos.top - data.optionsHeight - focusWidth + 'px';\n } else {\n optionsStyle.top = downTopOffset + 'px';\n }\n\n optionsStyle.left = pos.left + 'px';\n optionsStyle.width = pos.width + 'px';\n});\n\nconst selectOption = (v: M | undefined) => {\n model.value = v!;\n data.open = false;\n root?.value?.focus();\n};\n\nfunction emitEnter() {\n emits('click');\n}\n\nconst handleKeydown = (e: { code: string; preventDefault(): void; stopPropagation(): void; target: EventTarget | null }) => {\n if (!['ArrowDown', 'ArrowUp', 'Enter', 'Escape'].includes(e.code)) {\n return;\n } else {\n e.preventDefault();\n }\n\n if (e.target === buttonAction.value && e.code === 'Enter') {\n emitEnter();\n return;\n }\n\n const { open, activeIndex } = data;\n\n if (!open && e.target === menuActivator.value) {\n if (e.code === 'Enter') {\n data.open = true;\n }\n return;\n }\n\n if (e.code === 'Escape') {\n data.open = false;\n root.value?.focus();\n }\n\n const filtered = unref(items);\n\n const { length } = filtered;\n\n if (!length) {\n return;\n }\n\n if (e.code === 'Enter') {\n selectOption(filtered.find((it) => it.index === activeIndex)?.value);\n }\n\n const localIndex = filtered.findIndex((it) => it.index === activeIndex) ?? -1;\n\n const delta = e.code === 'ArrowDown' ? 1 : e.code === 'ArrowUp' ? -1 : 0;\n\n const newIndex = Math.abs(localIndex + delta + length) % length;\n\n data.activeIndex = items.value[newIndex].index ?? -1;\n};\n\nconst onFocusOut = (event: FocusEvent) => {\n const relatedTarget = event.relatedTarget as Node | null;\n\n if (!root.value?.contains(relatedTarget) && !list.value?.contains(relatedTarget)) {\n data.open = false;\n }\n};\n</script>\n<template>\n <div\n ref=\"root\"\n :class=\"{ disabled: disabled || isLoadingOptions, loading: isLoadingOptions }\"\n class=\"pl-btn-split d-flex\"\n @focusout=\"onFocusOut\"\n @keydown=\"handleKeydown\"\n >\n <div\n ref=\"buttonAction\"\n class=\"pl-btn-split__title flex-grow-1 d-flex align-center text-s-btn\"\n tabindex=\"0\"\n @click=\"emitEnter\"\n @keyup.stop.enter=\"emitEnter\"\n >\n {{ actionName }}\n </div>\n <div ref=\"menuActivator\" class=\"pl-btn-split__icon-container d-flex align-center justify-center\" tabindex=\"0\" @click=\"data.open = !data.open\">\n <PlMaskIcon16 v-if=\"isLoadingOptions\" name=\"loading\" />\n <div v-else :class=\"iconState\" class=\"pl-btn-split__icon\" />\n </div>\n\n <Teleport v-if=\"data.open\" to=\"body\">\n <div ref=\"list\" class=\"pl-dropdown__options\" :style=\"optionsStyle\" tabindex=\"-1\">\n <DropdownListItem\n v-for=\"(item, index) in items\"\n :key=\"index\"\n :option=\"item\"\n :is-selected=\"item.isSelected\"\n :is-hovered=\"item.isActive\"\n :size=\"'medium'\"\n @click.stop=\"selectOption(item.value)\"\n />\n </div>\n </Teleport>\n </div>\n</template>\n"],"names":["props","__emit","model","y","z","f","q","s","u","m","_","b","o","B","O","c","watch","list","rect","data","t","iconState","D","T","r","K","d","opt","index","computed","useElementPosition","te","pos","downTopOffset","n","selectOption","x","A","open","items","length","filtered","p","localIndex","E","it","h","newIndex","W","$","P","root","i"],"mappings":"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"}
1
+ {"version":3,"file":"PlBtnSplit.vue.js","sources":["../../../../../../../../../lib/ui/uikit/src/components/PlBtnSplit/PlBtnSplit.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"M = unknown\">\nimport { computed, reactive, ref, unref, watch } from 'vue';\nimport './pl-btn-split.scss';\nimport DropdownListItem from '../DropdownListItem.vue';\nimport type { ListOption } from '../../types';\nimport { useElementPosition } from '../../composition/usePosition';\nimport { normalizeListOptions } from '../../helpers/utils';\nimport { deepEqual } from '@milaboratories/helpers';\nimport { PlMaskIcon16 } from '../PlMaskIcon16';\n\nconst props = defineProps<{\n /**\n * List of available options for the dropdown menu\n */\n options?: Readonly<ListOption<M>[]>;\n\n /**\n * If `true`, the dropdown component is disabled and cannot be interacted with.\n */\n disabled?: boolean;\n\n /**\n * If `true,` the button is disabled, cannot be interacted with, and shows a special 'loading' icon.\n */\n loading?: boolean;\n}>();\n\nconst emits = defineEmits(['click']);\n\nconst model = defineModel<M>({ required: true });\n\nconst root = ref<HTMLElement | undefined>();\nconst list = ref<HTMLElement | undefined>();\nconst menuActivator = ref<HTMLElement | undefined>();\nconst buttonAction = ref<HTMLElement | undefined>();\n\nconst data = reactive({\n open: false,\n optionsHeight: 0,\n activeIndex: -1,\n});\n\ndefineExpose({\n data,\n});\n\nconst optionsStyle = reactive({\n top: '0px',\n left: '0px',\n width: '0px',\n});\n\nwatch(\n list,\n (el) => {\n if (el) {\n const rect = el.getBoundingClientRect();\n data.optionsHeight = rect.height;\n window.dispatchEvent(new CustomEvent('adjust'));\n }\n },\n { immediate: true },\n);\n\nconst iconState = computed(() => (data.open ? 'mask-24 mask-chevron-up' : 'mask-24 mask-chevron-down'));\n\nconst selectedIndex = computed(() => {\n return (props.options ?? []).findIndex((o) => deepEqual(o.value, model.value));\n});\n\nconst items = computed(() =>\n normalizeListOptions(props.options ?? []).map((opt, index) => ({\n ...opt,\n index,\n isSelected: index === selectedIndex.value,\n isActive: index === data.activeIndex,\n })),\n);\n\nconst isLoadingOptions = computed(() => props.loading || props.options === undefined);\n\nconst actionName = computed(() => items.value.find((o) => deepEqual(o.value, model.value))?.label ?? (props.options === undefined ? '...' : ''));\n\nuseElementPosition(root, (pos) => {\n const focusWidth = 3;\n\n const downTopOffset = pos.top + pos.height + focusWidth;\n\n if (downTopOffset + data.optionsHeight > pos.clientHeight) {\n optionsStyle.top = pos.top - data.optionsHeight - focusWidth + 'px';\n } else {\n optionsStyle.top = downTopOffset + 'px';\n }\n\n optionsStyle.left = pos.left + 'px';\n optionsStyle.width = pos.width + 'px';\n});\n\nconst selectOption = (v: M | undefined) => {\n model.value = v!;\n data.open = false;\n root?.value?.focus();\n};\n\nfunction emitEnter() {\n emits('click');\n}\n\nconst handleKeydown = (e: { code: string; preventDefault(): void; stopPropagation(): void; target: EventTarget | null }) => {\n if (!['ArrowDown', 'ArrowUp', 'Enter', 'Escape'].includes(e.code)) {\n return;\n } else {\n e.preventDefault();\n }\n\n if (e.target === buttonAction.value && e.code === 'Enter') {\n emitEnter();\n return;\n }\n\n const { open, activeIndex } = data;\n\n if (!open && e.target === menuActivator.value) {\n if (e.code === 'Enter') {\n data.open = true;\n }\n return;\n }\n\n if (e.code === 'Escape') {\n data.open = false;\n root.value?.focus();\n }\n\n const filtered = unref(items);\n\n const { length } = filtered;\n\n if (!length) {\n return;\n }\n\n if (e.code === 'Enter') {\n selectOption(filtered.find((it) => it.index === activeIndex)?.value);\n }\n\n const localIndex = filtered.findIndex((it) => it.index === activeIndex) ?? -1;\n\n const delta = e.code === 'ArrowDown' ? 1 : e.code === 'ArrowUp' ? -1 : 0;\n\n const newIndex = Math.abs(localIndex + delta + length) % length;\n\n data.activeIndex = items.value[newIndex].index ?? -1;\n};\n\nconst onFocusOut = (event: FocusEvent) => {\n const relatedTarget = event.relatedTarget as Node | null;\n\n if (!root.value?.contains(relatedTarget) && !list.value?.contains(relatedTarget)) {\n data.open = false;\n }\n};\n</script>\n<template>\n <div\n ref=\"root\"\n :class=\"{ disabled: disabled || isLoadingOptions, loading: isLoadingOptions }\"\n class=\"pl-btn-split d-flex\"\n @focusout=\"onFocusOut\"\n @keydown=\"handleKeydown\"\n >\n <div\n ref=\"buttonAction\"\n class=\"pl-btn-split__title flex-grow-1 d-flex align-center text-s-btn\"\n tabindex=\"0\"\n @click=\"emitEnter\"\n @keyup.stop.enter=\"emitEnter\"\n >\n {{ actionName }}\n </div>\n <div ref=\"menuActivator\" class=\"pl-btn-split__icon-container d-flex align-center justify-center\" tabindex=\"0\" @click=\"data.open = !data.open\">\n <PlMaskIcon16 v-if=\"isLoadingOptions\" name=\"loading\" />\n <div v-else :class=\"iconState\" class=\"pl-btn-split__icon\" />\n </div>\n\n <Teleport v-if=\"data.open\" to=\"body\">\n <div ref=\"list\" class=\"pl-dropdown__options\" :style=\"optionsStyle\" tabindex=\"-1\">\n <DropdownListItem\n v-for=\"(item, index) in items\"\n :key=\"index\"\n :option=\"item\"\n :is-selected=\"item.isSelected\"\n :is-hovered=\"item.isActive\"\n :size=\"'medium'\"\n @click.stop=\"selectOption(item.value)\"\n />\n </div>\n </Teleport>\n </div>\n</template>\n"],"names":["props","__emit","model","y","z","f","q","s","u","m","_","b","o","B","O","c","watch","list","rect","data","t","iconState","D","T","r","K","d","opt","index","computed","useElementPosition","te","pos","downTopOffset","n","selectOption","x","A","open","items","length","filtered","p","localIndex","E","it","h","newIndex","W","$","root","i"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import o from "./PlElementList.vue2.js";
2
+ import s from "./PlElementList.vue3.js";
3
+ import r from "../../_virtual/_plugin-vue_export-helper.js";
4
+ const t = {
5
+ $style: s
6
+ }, p = /* @__PURE__ */ r(o, [["__cssModules", t]]);
7
+ export {
8
+ p as default
9
+ };
10
+ //# sourceMappingURL=PlElementList.vue.js.map