Skip to content

Commit 37571fa

Browse files
committed
feat: create signingOrderMixin for shared ordering logic
Add signingOrderMixin.js with recalculateSigningOrders and normalizeSigningOrders methods to centralize signing order calculations and normalization logic used by both drag-and-drop and manual input components. Signed-off-by: Vitor Mattos <[email protected]>
1 parent 83a982f commit 37571fa

1 file changed

Lines changed: 104 additions & 0 deletions

File tree

src/mixins/signingOrderMixin.js

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/**
2+
* SPDX-FileCopyrightText: 2025 LibreCode coop and LibreCode contributors
3+
* SPDX-License-Identifier: AGPL-3.0-or-later
4+
*/
5+
6+
export default {
7+
methods: {
8+
recalculateSigningOrders(signers, targetIndex, originalOrders = null, oldIndex = null) {
9+
if (signers.length === 0) {
10+
return
11+
}
12+
13+
const hasPrev = targetIndex > 0
14+
const hasNext = targetIndex < signers.length - 1
15+
const isLastPosition = targetIndex === signers.length - 1
16+
let prevOrder = null
17+
let nextOrder = null
18+
19+
if (originalOrders !== null && oldIndex !== null) {
20+
if (targetIndex > oldIndex) {
21+
if (hasPrev) {
22+
prevOrder = originalOrders[targetIndex]
23+
}
24+
if (hasNext) {
25+
nextOrder = originalOrders[targetIndex + 1]
26+
}
27+
} else {
28+
if (hasPrev) {
29+
prevOrder = originalOrders[targetIndex - 1]
30+
}
31+
if (hasNext) {
32+
nextOrder = originalOrders[targetIndex]
33+
}
34+
}
35+
36+
if (isLastPosition && hasPrev) {
37+
prevOrder = signers[targetIndex - 1].signingOrder
38+
}
39+
} else {
40+
if (hasPrev) {
41+
prevOrder = signers[targetIndex - 1].signingOrder
42+
}
43+
if (hasNext) {
44+
nextOrder = signers[targetIndex + 1].signingOrder
45+
}
46+
}
47+
48+
let newOrder
49+
if (!hasPrev) {
50+
newOrder = 1
51+
for (let i = targetIndex + 1; i < signers.length; i++) {
52+
signers[i].signingOrder += 1
53+
}
54+
} else if (isLastPosition) {
55+
newOrder = prevOrder + 1
56+
} else if (hasNext && nextOrder > prevOrder) {
57+
newOrder = nextOrder
58+
for (let i = targetIndex + 1; i < signers.length; i++) {
59+
signers[i].signingOrder += 1
60+
}
61+
} else if (hasNext && nextOrder === prevOrder) {
62+
newOrder = prevOrder
63+
} else {
64+
newOrder = prevOrder
65+
}
66+
67+
signers[targetIndex].signingOrder = newOrder
68+
69+
this.normalizeSigningOrders(signers)
70+
},
71+
normalizeSigningOrders(signers) {
72+
if (signers.length === 0) {
73+
return
74+
}
75+
76+
const firstOrder = signers[0].signingOrder
77+
78+
if (firstOrder > 1) {
79+
const diff = firstOrder - 1
80+
for (let i = 0; i < signers.length; i++) {
81+
signers[i].signingOrder -= diff
82+
}
83+
} else if (firstOrder < 1) {
84+
const diff = 1 - firstOrder
85+
for (let i = 0; i < signers.length; i++) {
86+
signers[i].signingOrder += diff
87+
}
88+
}
89+
90+
for (let i = 0; i < signers.length - 1; i++) {
91+
const current = signers[i].signingOrder
92+
const next = signers[i + 1].signingOrder
93+
const expectedNext = current + 1
94+
95+
if (next > expectedNext) {
96+
const gap = next - expectedNext
97+
for (let j = i + 1; j < signers.length; j++) {
98+
signers[j].signingOrder -= gap
99+
}
100+
}
101+
}
102+
},
103+
},
104+
}

0 commit comments

Comments
 (0)