...

удалить элемент орг стуктуры

Тема в разделе "Вопросы по ELMA365 Platform", создана пользователем Griffith88, 13 ноя 2023.

  1. Griffith88

    Griffith88 Участник

    фрагмент кода
    Код:
    
    async function removeItems(): Promise<void> {
        
    Context.data.logDeleted = ''
        
    Context.data.logDeletedDep = ''
        
    const 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) {
                
    let child = root.find(f => f.id === item_id)
                if (
    child) {
                    
    let parent = child.getParent()
                    if (
    parent) {
                        if (
    child.isDepartment()) {
                            
    Context.data.logDeletedDep += ` ${child.data.name} `
                        } else {
                            
    Context.data.logDeleted += ` ${child.data.name} `
                        }
                        
    parent.removeChild(child)
                    }
                }
            }
        }
        const 
    errors = await org.validate()
        if (
    errors.length === 0) {
            
    Context.data.log4 =  `Успешно сохранено`
        } else {
            for (
    let err of errors) {
                
    Context.data.log4 += ` ,${err.desc}`
            }
            return
        }

        
    await System.organisationStructure.save(org)

    }
    Пытаюсь удалить элемент орг стуктуры, при сохранении нарываюсь на ошибку invalid sort.
    Есть еще какие то методы удалить элемент орг структуры?
  2. Griffith88

    Griffith88 Участник

    Нашел решение, с помощью 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)
                    }
                }
            }
        }   
    }
    Итоговое решение.