5

enter image description here

When clicked on each person , the subordinates list of that person should appear at the bottom. The whole list is dynamic .

{
        "EmployeeId": "1",
        "Name": "John",
        "Position": "HR",
        "Image": "",
        "SubordinateCount": 6,
        "Subordinates": [
            {
                "EmployeeId": "2",
                "Name": "Sub john 1",
                "Position": "Manager",
                "Image": "",
                "SubordinateCount": 1,
                "Subordinates": [
                    {
                        "EmployeeId": "3",
                        "Name": "Joseph",
                        "Position": "Admin",
                        "Image": "",
                        "SubordinateCount": 1,
                        "Subordinates": [
                            {
                                "EmployeeId": "4",
                                "Name": "Raj",
                                "Position": "Software Developer",
                                "Image": "",
                                "SubordinateCount": 0,
                                "Subordinates": []
                            }
                        ]
                    }
                ]
            },
            {
                "EmployeeId": "5",
                "Name": "Rahul",
                "Position": "ERP Consultant",
                "Image": "",
                "SubordinateCount": 16,
                "Subordinates": [
                    {
                        "EmployeeId": "6",
                        "Name": "Fam",
                        "Position": "QA",
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    },
                    {
                        "EmployeeId": "7",
                        "Name": "Salman A Q",
                        "Position": "Software Developer",
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    },
                    {
                        "EmployeeId": "8",
                        "Name": "Mac",
                        "Position": "Software Developer",
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    },
                    {
                        "EmployeeId": "9",
                        "Name": "Mathew",
                        "Position": "QA",
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    },
                    {
                        "EmployeeId": "10",
                        "Name": "Kim",
                        "Position": "QA",
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    },
                    {
                        "EmployeeId": "11",
                        "Name": "Loren",
                        "Position": "Software Developer",
                        "Image": "",
                        "SubordinateCount": 0,
                        "Subordinates": []
                    },
                    {
                        "EmployeeId": "12",
                        "Name": "Adam",
                        "Position": "QA",
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    },
                    {
                        "EmployeeId": "13",
                        "Name": "Meera",
                        "Position": "QA",
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    },
                    {
                        "EmployeeId": "14",
                        "Name": "MMM",
                        "Position": "QA",
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    },
                    {
                        "EmployeeId": "15",
                        "Name": "Master",
                        "Position": "QA",
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    },
                    {
                        "EmployeeId": "16",
                        "Name": "Michael",
                        "Position": "QA",
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    },
                    {
                        "EmployeeId": "17",
                        "Name": "George",
                        "Position": "Consultant",
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    },
                    {
                        "EmployeeId": "18",
                        "Name": "Ahmedu A F",
                        "Position": "QA",
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    },
                    {
                        "EmployeeId": "19",
                        "Name": "KKKK",
                        "Position": "QA",
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    },
                    {
                        "EmployeeId": "20",
                        "Name": "xxx",
                        "Position": "QA",
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    },
                    {
                        "EmployeeId": "21",
                        "Name": "DK",
                        "Position": "QA",
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    }
                ]
            },
            {
                "EmployeeId": "22",
                "Name": "HHHH",
                "Position": "Engineer",
                "Image": "",
                "SubordinateCount": 1,
                "Subordinates": [
                    {
                        "EmployeeId": "23",
                        "Name": "Ar",
                        "Position": "Technical",
                        "Image": "",
                        "SubordinateCount": 0,
                        "Subordinates": []
                    }
                ]
            },
            {
                "EmployeeId": "24",
                "Name": "Sun",
                "Position": "Software Developer",
                "Image": null,
                "SubordinateCount": 1,
                "Subordinates": [
                    {
                        "EmployeeId": "25",
                        "Name": "AAAA",
                        "Position": null,
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    }
                ]
            },
            {
                "EmployeeId": "26",
                "Name": "CCCC",
                "Position": "Consultant",
                "Image": null,
                "SubordinateCount": 0,
                "Subordinates": []
            },
            {
                "EmployeeId": "27",
                "Name": "Jaaaa",
                "Position": "Software Developer",
                "Image": null,
                "SubordinateCount": 2,
                "Subordinates": [
                    {
                        "EmployeeId": "28",
                        "Name": "Jay",
                        "Position": "Ssssss",
                        "Image": null,
                        "SubordinateCount": 0,
                        "Subordinates": []
                    },
                    {
                        "EmployeeId": "29",
                        "Name": "NNNN",
                        "Position": "Sssss",
                        "Image": null,
                        "SubordinateCount": 1,
                        "Subordinates": [
                            {
                                "EmployeeId": "30",
                                "Name": "Jo",
                                "Position": "Engineer",
                                "Image": null,
                                "SubordinateCount": 0,
                                "Subordinates": []
                            }
                        ]
                    }
                ]
            }
        ]
    }

This is the json to be used .I have tried with collection view inside table view.But failed when i try to delete a row when user moves to the top and clicks on a new person . I have seen many libraries showing tree structure for table view . But i think that cannot be used here .

This is what i have tried so far.

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return selectedIndexes.count + 1
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        var bottomCell : SubordinatesTableViewCell! = self.Extableview.dequeueReusableCell(withIdentifier: "SubordinatesTableViewCell") as? SubordinatesTableViewCell
        if bottomCell == nil {
            let nib:Array = Bundle.main.loadNibNamed("SubordinatesTableViewCell", owner: self, options: nil)!
            bottomCell = nib[0] as? SubordinatesTableViewCell
        }
            bottomCell.empLevel = indexPath.row
            bottomCell.delegate = self
            bottomCell.subordinateDetails = self.subordinatesList
        return bottomCell
}

extension CurrentVC : SubordinateCellDelegate {
    func employeeClicked(row: Int?, index: Int?) {
        self.subordinatesList = self.heirarchy?.subordinates
        self.currentHeirarchyLevel = row! + 1
        if self.Extableview.numberOfRows(inSection: 0) > row! + 1 {
            var newIndexes = [Int]()
            if row! == 0 {
                self.selectedIndexes.removeAll()
                self.selectedIndexes.append(index!)
            }else {
            for i in 0..<(row! + 1) {
                newIndexes.append(selectedIndexes[i])
            }
            self.selectedIndexes = newIndexes
            self.selectedIndexes.append(index!)
            }
            for i in 0..<row! + 1 {
                self.subordinatesList = self.subordinatesList?[self.selectedIndexes[i]].subordinates
                print(subordinatesList)
                
            }
            if subordinatesList?.count ?? 0 > 0  {
                self.Extableview.reloadRows(at: [IndexPath(row: self.currentHeirarchyLevel, section: 0)], with: .fade)
            }else {
                for i in 0..<self.Extableview.numberOfRows(inSection: 0) {
                    if i > row! {
                    self.Extableview.beginUpdates()
                    self.Extableview.deleteRows(at: [IndexPath(row: 1, section: 0)], with: .fade)
                    }
                }
                self.numOfsections = row! + 1
                self.Extableview.endUpdates()
            }
        }else {
            self.selectedIndexes.append(index!)
            for i in 0..<row! + 1 {
                self.subordinatesList = self.subordinatesList?[self.selectedIndexes[i]].subordinates
                
            }
        if self.subordinatesList?.count ?? 0 > 0 {
        self.Extableview.beginUpdates()
            self.numOfsections = row! + 2
            self.Extableview.insertRows(at: [IndexPath(row: row! + 1, section: 0)], with: .none)
        self.Extableview.endUpdates()
        }else {
            for i in 0..<self.Extableview.numberOfRows(inSection: 0) {
                if i > row! {
                self.Extableview.beginUpdates()
                    self.numOfsections = row! + 1
                self.Extableview.deleteRows(at: [IndexPath(row: 1, section: 0)], with: .fade)
                }
            }
            self.Extableview.endUpdates()
        }
        }
    }
}
faheem
  • 83
  • 12
  • 2
    What is your question? – Bruno Bieri Feb 02 '21 at 12:18
  • trailingSwipeActionsConfigurationForRowAt - you can use this delegate method to disable swipe actions for tableViewCells. – Mohan Meruva Feb 02 '21 at 18:40
  • How it should behave when currently is expanded f.e. Bent Grasha (which has f.e. 5 subordinates) and you're selecting Brigida Withey? Should the previous one collapse? Or it should expand the second by keeping the previous selection as well? If yes, how the UI should look like? There is no room for that! – arturdev Feb 04 '21 at 07:09

1 Answers1

1

Declare 4 variables ,

var heirarchy : Subordinates?
var numOfRows = 0
var subordinatesList : [Subordinates]?
var subList = [[Subordinates]?]()

Once you get the json response ,

self.numOfRows += 1
self.subordinatesList?.append(self.heirarchy!)
self.subList.append([self.heirarchy!])

Create a delegate function for collection view item click as below .

func employeeClicked(row: Int?, index: Int?, subordinates: [Subordinates]?) {

    if (subordinates?.count ?? 0) > 0 {
    self.subordinatesList = subordinates
    if numOfRows > row! + 2 {
        self.tableView.beginUpdates()
        for i in (row! + 1)..<tableView.numberOfRows(inSection: 0) {
            self.tableView.deleteRows(at: [IndexPath(row: i, section: 0)], with: .fade)
            self.numOfRows = numOfRows - 1
            self.subList.removeLast()
            
        }
        self.subList.append(self.subordinatesList)
        self.numOfRows = row! + 2
        self.tableView.insertRows(at: [IndexPath(row: row! + 1, section: 0)], with: .fade)
        self.tableView.endUpdates()
    }
    else if numOfRows == row! + 2 {
        self.subList[row! + 1] = self.subordinatesList
        self.tableView.reloadRows(at: [IndexPath(row: row! + 1, section: 0)], with: .fade)
    }else {
        self.subList.append(self.subordinatesList)
    self.numOfRows = row! + 2
    self.tableView.insertRows(at: [IndexPath(row: row! + 1, section: 0)], with: .fade)
    }
    }else {
        if numOfRows > row! + 1 {
            self.tableView.beginUpdates()
            for i in (row! + 1)..<tableView.numberOfRows(inSection: 0) {
                self.tableView.deleteRows(at: [IndexPath(row: i, section: 0)], with: .fade)
                self.numOfRows = numOfRows - 1
                self.subList.removeLast()
                
            }
            self.tableView.endUpdates()
        }
    }
    self.tableView.scrollToBottom()
}
}

In tableview cellfor row delegate use the value of sublist array. Hope this helps you . I checked the code and it is working fine for me.

Faheem Rahman
  • 343
  • 2
  • 10