Нашел решение, с помощью moveAfter я сначала сдвигаю индекс сортировки до максимума, потом уже произвошу удаление
Код:
async function removeItems(): Promise<void> {
Context.data.logDeleted = ''
Context.data.logDeletedDep = ''
let org = await System.organisationStructure.fetchTree()
let root = org.getRoot()
let root_list = [root]
let item_list: string[] = []
while (root_list.length > 0) {
for (let item of root_list) {
root_list = root_list.filter(f => f !== item) // удаляем из списка корневых элементов уже обработанный элемент
item_list.push(item.id)
let childs = item.getChildren()
root_list = [...root_list, ...childs]
}
}
const actual_list: string[] = Context.data.itemlist
const items_to_delete_ids = item_list.filter(x => !actual_list.find(f => f === x))
if (items_to_delete_ids) {
for (let item_id of items_to_delete_ids) {
org = await System.organisationStructure.fetchTree()
root = org.getRoot()
let child = root.find(f => f.id === item_id)
if (child) {
let parent = child.getParent()
if (parent) {
const children = parent.getChildren()
const children_sort_index_max = Math.max(...children.map(f => f.data.sort!))
if (child.data.sort! !== children_sort_index_max) { // проверяем, что элемент находится не в конце
let shift = children_sort_index_max - child.data.sort! // вычисляем на сколько позиций сдвинуть в конец
for (let i = 1; i <= shift; i++) {
child.moveAfter() // двигаем
}
const errors = await org.validate()
if (errors.length === 0) {
Context.data.log = `Успешно сохранено`
} else {
for (let err of errors) {
Context.data.log += ` ,${err.desc}`
}
return
}
await System.organisationStructure.save(org)
}
org = await System.organisationStructure.fetchTree() // Заново фетчим орг структуру с уже сдвинутыми элементами
root = org.getRoot()
child = root.find(f => f.id === item_id)!
parent = child.getParent()!
parent.removeChild(child) // Спокойно удаляем
if (child.isDepartment()) {
Context.data.logDeletedDep += ` ${child.data.name} `
} else {
Context.data.logDeleted += ` ${child.data.name} `
}
const errors = await org.validate()
if (errors.length === 0) {
Context.data.log = `Успешно сохранено`
} else {
for (let err of errors) {
Context.data.log += ` ,${err.desc}`
}
return
}
await System.organisationStructure.save(org)
}
}
}
}
}
Итоговое решение.