-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOrderable.ts
82 lines (74 loc) · 2.13 KB
/
Orderable.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import { getMetadataArgsStorage } from 'typeorm'
import { metaMapping, metaColumns } from './MetaStore'
export function Orderable(): ClassDecorator {
return (target: Function): void => {
metaMapping.set(
target,
metaColumns.map(item => {
return {
...item,
target,
}
}),
)
metaColumns.splice(0, metaColumns.length)
getMetadataArgsStorage().columns.sort((a, b): number => {
const aOrder: number =
metaMapping
.get(a.target)
?.find(item => item.propertyName === a.propertyName)?.options
.priority ?? 0
const bOrder: number =
metaMapping
.get(b.target)
?.find(item => item.propertyName === b.propertyName)?.options
.priority ?? 0
return aOrder - bOrder
})
metaMapping.get(target)?.forEach(item => {
if (item.options.before || item.options.after) {
const currentIndex = getMetadataArgsStorage().columns.findIndex(
column => {
if (
column.target == target &&
column.propertyName == item.propertyName
) {
return true
}
return false
},
)
const currentField = getMetadataArgsStorage().columns.splice(
currentIndex,
1,
)
const offsetElementName = item.options.after || item.options.before
const offsetElementShift = item.options.after ? 1 : 0
const offsetIndex = getMetadataArgsStorage().columns.findIndex(
column => {
if (
column.target == target &&
column.propertyName == offsetElementName
) {
return true
}
return false
},
)
if (offsetIndex > -1) {
getMetadataArgsStorage().columns.splice(
offsetIndex + offsetElementShift,
0,
currentField[0],
)
} else {
getMetadataArgsStorage().columns.splice(
currentIndex,
0,
currentField[0],
)
}
}
})
}
}