function toggleSubSectionContent()

in src/dotnet/APIView/APIViewWeb/Client/src/pages/review.module.ts [178:276]


function toggleSubSectionContent(headingRow : JQuery<HTMLElement>, subSectionLevel : string, subSectionHeadingPosition : string,
    subSectionContentClass : string, caretDirection : string, caretIcon : JQuery<HTMLElement>, lineNumber) {
    var subSectionDescendants = $(`.${subSectionContentClass}`);

    if (caretDirection.endsWith("right")) {
        var startShowing = false;
        $.each(subSectionDescendants, function (index, value) {
            var rowClasses = $(value).attr("class");
            var rowLineNumber = $(value).find(".line-number>span").text();
            if (rowClasses) {
                if (rowClasses.match(new RegExp(`lvl_${subSectionLevel}_parent_${subSectionHeadingPosition}`)) && rowLineNumber == lineNumber) {
                    startShowing = true;
                }
                    
                if (startShowing && (rowClasses.match(new RegExp(`lvl_${subSectionLevel}_parent_${Number(subSectionHeadingPosition) + 1}`))
                    || rowClasses.match(new RegExp(`lvl_${subSectionLevel}_child_${Number(subSectionHeadingPosition) + 1}`))
                    || rowClasses.match(new RegExp(`lvl_${Number(subSectionLevel) - 1}_`)))) {
                    return false;
                }
                    

                // Show only immediate descendants
                if (startShowing) {
                    if (rowClasses.match(new RegExp(`lvl_${Number(subSectionLevel) + 1}_`))) {
                        if (rowClasses.match(/comment-row/) && !$("#show-comments-checkbox").prop("checked")) {
                            hp.toggleCommentIcon($(value).attr("data-line-id")!, true);
                            return; // Dont show comment row if show comments setting is unchecked
                        }

                        $(value).removeClass("d-none");
                        let rowHeight = $(value).height() ?? 0;
                        $(value).find("svg").attr("height", `${rowHeight}`);
                    }
                }
            }
        });

        // Add jump-lint event for classes
        addClickEventToClassesInSections();

        // Update section heading icons to open state
        updateSectionHeadingIcons(CodeLineSectionState.shown, caretIcon, headingRow);

        // maintain lineNumbers of shown headings in session storage
        let shownSubSectionHeadingLineNumbers = sessionStorage.getItem("shownSubSectionHeadingLineNumbers") ?? "";
        shownSubSectionHeadingLineNumbers = updateCodeLineSectionState(shownSubSectionHeadingLineNumbers, lineNumber, CodeLineSectionState.shown);
        sessionStorage.setItem("shownSubSectionHeadingLineNumbers", shownSubSectionHeadingLineNumbers);
    }
    else {
        var startHiding = false;
        $.each(subSectionDescendants, function (index, value) {
            var rowClasses = $(value).attr("class");
            var rowLineNumber = $(value).find(".line-number>span").text();
            if (rowClasses) {
                if (rowClasses.match(new RegExp(`lvl_${subSectionLevel}_parent_${subSectionHeadingPosition}`)) && rowLineNumber == lineNumber) {
                    startHiding = true;
                }
                    
                if (startHiding && (rowClasses.match(new RegExp(`lvl_${subSectionLevel}_parent_${Number(subSectionHeadingPosition) + 1}`))
                    || rowClasses.match(new RegExp(`lvl_${subSectionLevel}_child_${Number(subSectionHeadingPosition) + 1}`))
                    || rowClasses.match(new RegExp(`lvl_${Number(subSectionLevel) - 1}_`)))) {
                        return false;
                }
                

                if (startHiding) {
                    let descendantClasses = rowClasses.split(' ').filter(c => c.match(/lvl_[0-9]+_child_.*/))[0];
                    if (descendantClasses) {
                        let descendantLevel = descendantClasses.split('_')[1];
                        if (/^\d+$/.test(descendantLevel)) {
                            if (Number(descendantLevel) > Number(subSectionLevel)) {
                                $(value).addClass("d-none");
                                if (rowClasses.match(/lvl_[0-9]+_parent_.*/)) {
                                    // Update all heading/parent rows to closed state before hiding it
                                    let caretIcon = $(value).find(".row-fold-caret").children("i");
                                    let lineNo = $(value).find(".line-number>span").text();
                                    updateSectionHeadingIcons(CodeLineSectionState.hidden, caretIcon, $(value));

                                    // maintain lineNumbers of shown headings in sessionStorage
                                    let shownSubSectionHeadingLineNumbers = sessionStorage.getItem("shownSubSectionHeadingLineNumbers") ?? "";
                                    shownSubSectionHeadingLineNumbers = updateCodeLineSectionState(shownSubSectionHeadingLineNumbers, lineNo, CodeLineSectionState.hidden);
                                    sessionStorage.setItem("shownSubSectionHeadingLineNumbers", shownSubSectionHeadingLineNumbers);
                                }
                            }
                        }
                    }
                }
            }
        });

        // Update section heading icons to closed state
        updateSectionHeadingIcons(CodeLineSectionState.hidden, caretIcon, headingRow);

        // maintain lineNumbers of shown headings in sessionStorage
        let shownSubSectionHeadingLineNumbers = sessionStorage.getItem("shownSubSectionHeadingLineNumbers") ?? "";
        shownSubSectionHeadingLineNumbers = updateCodeLineSectionState(shownSubSectionHeadingLineNumbers, lineNumber, CodeLineSectionState.hidden);
        sessionStorage.setItem("shownSubSectionHeadingLineNumbers", shownSubSectionHeadingLineNumbers);
    }
}