Skip to content

Commit 97ceab5

Browse files
committed
chore(vscode): further typing nodes
[ci skip] - last bit of typing the logic
1 parent 9c76f85 commit 97ceab5

File tree

9 files changed

+78
-100
lines changed

9 files changed

+78
-100
lines changed

vscode/react/src/components/graph/ModelColumns.tsx

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,24 +30,24 @@ import { useLineageFlow } from './context'
3030
import { useApiColumnLineage } from '@/api/index'
3131
import SourceList from '@/components/sourceList/SourceList'
3232
import type { Lineage } from '@/domain/lineage'
33-
import type { Column, ColumnName } from '@/domain/column'
34-
import type { ModelEncodedFQN } from '@/domain/models'
33+
import type { Column, ColumnEncodedName, ColumnName } from '@/domain/column'
34+
import { encode, type ModelEncodedFQN } from '@/domain/models'
3535

3636
export function ModelColumns({
3737
nodeId,
3838
columns,
3939
disabled,
4040
className,
41-
limit = 5,
41+
limit,
4242
withHandles = false,
4343
withDescription = true,
4444
maxHeight = '50vh',
4545
}: {
4646
nodeId: ModelEncodedFQN
4747
columns: Column[]
48+
limit: number
4849
disabled?: boolean
4950
className?: string
50-
limit?: number
5151
withHandles?: boolean
5252
withDescription?: boolean
5353
maxHeight?: string
@@ -292,10 +292,12 @@ export function ModelColumns({
292292
withHandles={withHandles}
293293
withDescription={withDescription}
294294
isEmpty={
295-
isNotNil(getColumnFromLineage(lineage, nodeId, item.name)) &&
295+
isNotNil(
296+
getColumnFromLineage(lineage, nodeId, encode(item.name)),
297+
) &&
296298
Object.keys(
297-
getColumnFromLineage(lineage, nodeId, item.name)?.models ??
298-
{},
299+
getColumnFromLineage(lineage, nodeId, encode(item.name))
300+
?.models ?? {},
299301
).length === 0
300302
}
301303
className="border-t border-neutral-10 first:border-0 rounded-md"
@@ -585,9 +587,9 @@ function ColumnStatus({
585587
}
586588

587589
function getColumnFromLineage(
588-
lineage: Record<string, Lineage>,
589-
nodeId: string,
590-
columnName: string,
590+
lineage: Record<ModelEncodedFQN, Lineage>,
591+
nodeId: ModelEncodedFQN,
592+
columnName: ColumnEncodedName,
591593
): LineageColumn | undefined {
592-
return lineage?.[nodeId]?.columns?.[columnName as ColumnName]
594+
return lineage?.[nodeId]?.columns?.[columnName]
593595
}

vscode/react/src/components/graph/ModelNode.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import clsx from 'clsx'
33
import { useMemo, useCallback, useState } from 'react'
44
import { ModelType, type Model } from '@/api/client'
55
import { useLineageFlow } from './context'
6-
import { type GraphNodeData } from './help'
6+
import { MAX_VISIBLE_COLUMNS, type GraphNodeData } from './help'
77
import { Position, type NodeProps } from 'reactflow'
88
import { ModelNodeHeaderHandles } from './ModelNodeHeaderHandles'
99
import { ModelColumns } from './ModelColumns'
@@ -37,7 +37,6 @@ export default function ModelNode({
3737
withColumns: false,
3838
}
3939
const {
40-
// connections,
4140
models,
4241
handleClickModel,
4342
lineage,
@@ -229,6 +228,7 @@ export default function ModelNode({
229228
className="nowheel rounded-b-lg bg-theme-lighter text-xs"
230229
nodeId={id}
231230
columns={columns}
231+
limit={MAX_VISIBLE_COLUMNS}
232232
disabled={shouldDisableColumns}
233233
withHandles={true}
234234
withDescription={false}

vscode/react/src/components/graph/ModelNodeHeaderHandles.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { EnumSide, toID } from './types'
77
import { ArrowRightCircleIcon } from '@heroicons/react/24/solid'
88
import clsx from 'clsx'
99
import { type LineageNodeModelType } from './ModelNode'
10+
import type { ModelEncodedFQN } from '@/domain/models'
1011

1112
export function ModelNodeHeaderHandles({
1213
id,
@@ -21,7 +22,7 @@ export function ModelNodeHeaderHandles({
2122
handleClick,
2223
handleSelect,
2324
}: {
24-
id: string
25+
id: ModelEncodedFQN
2526
label: string
2627
type?: LineageNodeModelType
2728
hasLeft?: boolean

vscode/react/src/components/graph/help.ts

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,40 @@ import {
66
isNotNil,
77
isObjectEmpty,
88
} from '@/utils/index'
9-
import { type LineageColumn } from '@/api/client'
109
import { Position, type Edge, type Node, type XYPosition } from 'reactflow'
1110
import { type ActiveEdges, type Connections } from './context'
1211
import { EnumSide, toID, toKeys } from './types'
1312
import {
1413
EnumLineageNodeModelType,
1514
type LineageNodeModelType,
1615
} from './ModelNode'
17-
import type { Lineage } from '@/domain/lineage'
16+
import type { Lineage, LineageColumn } from '@/domain/lineage'
1817
import type { ConnectedNode } from '@/workers/lineage'
19-
import { encode, type ModelEncodedFQN, type ModelURI } from '@/domain/models'
18+
import {
19+
encode,
20+
type ModelEncodedFQN,
21+
type ModelName,
22+
type ModelURI,
23+
} from '@/domain/models'
2024
import type { Column, ColumnName } from '@/domain/column'
2125
import type { ModelSQLMeshModel } from '@/domain/sqlmesh-model'
2226

2327
/**
2428
* Space between nodes.
2529
*/
26-
const NODE_BALANCE_SPACE = 64
30+
export const NODE_BALANCE_SPACE = 64
2731
/**
2832
* Height of a column line.
2933
*/
30-
const COLUMN_LINE_HEIGHT = 24
34+
export const COLUMN_LINE_HEIGHT = 24
3135
/**
3236
* Assumed width of a character.
3337
*/
34-
const CHAR_WIDTH = 8
38+
export const CHAR_WIDTH = 8
3539
/**
3640
* Maximum number of columns that can be visible in a node.
3741
*/
38-
const MAX_VISIBLE_COLUMNS = 5
42+
export const MAX_VISIBLE_COLUMNS = 5
3943

4044
export interface GraphNodeData {
4145
label: string
@@ -327,10 +331,10 @@ function createGraphEdge<Data>(
327331

328332
export function mergeLineageWithColumns(
329333
currentLineage: Record<string, Lineage> = {},
330-
newLineage: Record<string, Record<string, LineageColumn>> = {},
334+
newLineage: Record<ModelName, Record<ColumnName, LineageColumn>> = {},
331335
): Record<string, Lineage> {
332-
for (const targetModelName in newLineage) {
333-
const targetModelNameEncoded = encodeURI(targetModelName)
336+
for (const targetModelName of toKeys(newLineage)) {
337+
const targetModelNameEncoded = encode(targetModelName)
334338

335339
if (isNil(currentLineage[targetModelNameEncoded])) {
336340
currentLineage[targetModelNameEncoded] = { columns: {}, models: [] }
@@ -339,16 +343,16 @@ export function mergeLineageWithColumns(
339343
const currentLineageModel = currentLineage[targetModelNameEncoded]!
340344
const newLineageModel = newLineage[targetModelName]!
341345

342-
for (const targetColumnName in newLineageModel) {
343-
const targetColumnNameEncoded = encodeURI(targetColumnName)
346+
for (const targetColumnName of toKeys(newLineageModel)) {
347+
const targetColumnNameEncoded = encode(targetColumnName)
344348
const newLineageModelColumn = newLineageModel[targetColumnName]!
345349

346350
if (isNil(currentLineageModel.columns)) {
347351
currentLineageModel.columns = {}
348352
}
349353

350354
// New Column Lineage delivers fresh data, so we can just assign it
351-
currentLineageModel.columns[targetColumnNameEncoded as ColumnName] = {
355+
currentLineageModel.columns[targetColumnNameEncoded] = {
352356
expression: newLineageModelColumn.expression ?? undefined,
353357
source: newLineageModelColumn.source ?? undefined,
354358
models: {},
@@ -362,7 +366,7 @@ export function mergeLineageWithColumns(
362366
const currentLineageModelColumnModels = currentLineageModelColumn.models
363367

364368
for (const sourceColumnName in newLineageModelColumn.models) {
365-
const sourceColumnNameEncoded = encodeURI(sourceColumnName)
369+
const sourceColumnNameEncoded = encode(sourceColumnName)
366370
const currentLineageModelColumnModel =
367371
currentLineageModelColumnModels[
368372
sourceColumnNameEncoded as ModelEncodedFQN
@@ -400,11 +404,11 @@ export function mergeConnections(
400404

401405
// We are getting lineage in format of target -> source
402406
for (const targetModelName in lineage) {
403-
const targetModelNameEncoded = encodeURI(targetModelName)
407+
const targetModelNameEncoded = encode(targetModelName)
404408
const model = lineage[targetModelName]!
405409

406410
for (const targetColumnName in model) {
407-
const targetColumnNameEncoded = encodeURI(targetColumnName)
411+
const targetColumnNameEncoded = encode(targetColumnName)
408412
const column = model[targetColumnName]
409413

410414
// We don't have any connectins so we skip
@@ -426,9 +430,9 @@ export function mergeConnections(
426430
}
427431

428432
Object.entries(column.models).forEach(([sourceModelName, columns]) => {
429-
const sourceModelNameEncoded = encodeURI(sourceModelName)
433+
const sourceModelNameEncoded = encode(sourceModelName)
430434
columns.forEach(sourceColumnName => {
431-
const sourceColumnNameEncoded = encodeURI(sourceColumnName)
435+
const sourceColumnNameEncoded = encode(sourceColumnName)
432436
// It is a source (right handler)
433437
// but it can also be a target (left handler) for other connections
434438
const modelColumnIdSource = toID(

vscode/react/src/components/graph/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { ColumnName } from '@/domain/column'
1+
import type { ColumnEncodedName } from '@/domain/column'
22
import type { ModelEncodedFQN } from '@/domain/models'
33

44
export const EnumSide = {
@@ -21,7 +21,7 @@ export type EdgeId = string
2121
export function toID(
2222
leftOrRight: 'left' | 'right',
2323
modelName: ModelEncodedFQN,
24-
columnName: ColumnName,
24+
columnName: ColumnEncodedName,
2525
): NodeId
2626
export function toID(source: NodeId, target: NodeId): NodeId
2727
export function toID(

vscode/react/src/domain/column.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { type Branded } from '@bus/brand'
33

44
export type ColumnName = Branded<string, 'ColumnName'>
55

6+
export type ColumnEncodedName = Branded<string, 'ColumnEncodedName'>
7+
68
export type Column = {
79
name: ColumnName
810
type: string

vscode/react/src/domain/lineage.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import {
33
type ModelLineageApiLineageModelNameGet200,
44
} from '@/api/client'
55
import type { ModelEncodedFQN, ModelFQN } from '@/domain/models'
6-
import type { ColumnName } from './column'
6+
import type { ColumnEncodedName, ColumnName } from './column'
77

88
export interface Lineage {
99
models: ModelEncodedFQN[]
10-
columns?: Record<ColumnName, LineageColumn>
10+
columns?: Record<ColumnEncodedName, LineageColumn>
1111
}
1212

1313
export interface LineageColumn {

vscode/react/src/domain/models.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { Branded } from '@bus/brand'
2+
import type { ColumnEncodedName, ColumnName } from './column'
23

34
/**
45
* ModelName is a type that represents the name of a model.
@@ -30,13 +31,15 @@ export type ModelURI = Branded<string, 'ModelURI'>
3031
*/
3132
export type ModelEncodedURI = Branded<string, 'ModelEncodedURI'>
3233

33-
export function encode(fqn: ModelName): ModelEncodedName
34-
export function encode(fqn: ModelURI): ModelEncodedURI
34+
export function encode(columnName: ColumnName): ColumnEncodedName
35+
export function encode(name: ModelName): ModelEncodedName
36+
export function encode(uri: ModelURI): ModelEncodedURI
3537
export function encode(fqn: ModelFQN): ModelEncodedFQN
3638
export function encode(s: string): string {
3739
return encodeURI(s)
3840
}
3941

42+
export function decode(columnName: ColumnEncodedName): ColumnName
4043
export function decode(fqn: ModelEncodedName): ModelName
4144
export function decode(fqn: ModelEncodedURI): ModelURI
4245
export function decode(fqn: ModelEncodedFQN): ModelFQN

0 commit comments

Comments
 (0)