Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions app/views/context_menus/_accordion_menu.html.erb
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<li class="subtask_list_accordion">
<a href="javascript:void(0)" class="icon-arrow-expanded" onclick="seletedTreeOpen(); return false;"><%= l(:context_menu_expand) %></a>
<a href="javascript:void(0)" class="icon-arrow-expanded" onclick="selectedTreeOpen(); return false;"><%= l(:context_menu_expand) %></a>
</li>
<li class="subtask_list_accordion">
<a href="javascript:void(0)" class="icon-arrow-collapsed" onclick="seletedTreeClose(); return false;"><%= l(:context_menu_collapse) %></a>
<a href="javascript:void(0)" class="icon-arrow-collapsed" onclick="selectedTreeClose(); return false;"><%= l(:context_menu_collapse) %></a>
</li>
<li class="subtask_list_accordion">
<a href="javascript:void(0)" onclick="allExpandNext(); return false;"><%= l(:context_menu_all_expand_next) %></a>
Expand Down
2 changes: 1 addition & 1 deletion app/views/issues/_subtask_list_accordion_partial.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
var _contextMenuShow = contextMenuShow;
isHideMenuSla = false;
contextMenuShow = function(event){
if ($(event.target).parents("div[id='relations']").size() == 1 || !$("table.list > tbody > tr").is(".idnt-1"))
if ($(event.target).parents("div[id='relations']").length == 1 || !$("table.list > tbody > tr").is(".idnt-1"))
{
//hide this plugin menu
isHideMenuSla = true;
Expand Down
203 changes: 130 additions & 73 deletions assets/javascripts/subtask_list_accordion.js
Original file line number Diff line number Diff line change
@@ -1,109 +1,166 @@
function childIssueShowOrHide(parentTR)
{
var childlen = slaTRs.filter(function(index){
return index >= (parentTR.attr('cs') - 0) && index <= (parentTR.attr('ce') - 0);
function childIssueShowOrHide(parentTR) {
var children = slaTRs.filter(function (index) {
return index >= parentTR.attr("cs") - 0 && index <= parentTR.attr("ce") - 0;
});

if (childlen.is(":visible"))
{

if (children.is(":visible")) {
parentTR.removeClass("expand").addClass("collapse");
childlen.hide("fast").filter(".haschild").removeClass("expand").addClass("collapse");
}
else
{
children
.hide("fast")
.filter(".haschild")
.removeClass("expand")
.addClass("collapse");
} else {
parentTR.removeClass("collapse").addClass("expand");
childlen.filter('.idnt-' + (parentTR.attr('rank') - 0 + 1)).show("fast");
children.filter(".idnt-" + (parentTR.attr("rank") - 0 + 1)).show("fast");
}
}

function seletedTreeOpen()
{
function selectedTreeOpen() {
var targetParents = slaTRs.filter("tr:has(td.checkbox > input:checked)");
for (var i = 0; i < targetParents.size(); i++)
{
for (var i = 0; i < targetParents.length; i++) {
var parentTR = targetParents.eq(i);
if (!parentTR.hasClass("haschild"))
{
if (!parentTR.hasClass("haschild")) {
continue;
}
}

//show
var childlen = slaTRs.filter(function(index){
return index >= (parentTR.attr('cs') - 0) && index <= (parentTR.attr('ce') - 0);
var children = slaTRs.filter(function (index) {
return (
index >= parentTR.attr("cs") - 0 && index <= parentTR.attr("ce") - 0
);
});
childlen.show().filter(".haschild").removeClass("collapse").addClass("expand");
children
.show()
.filter(".haschild")
.removeClass("collapse")
.addClass("expand");
parentTR.removeClass("collapse").addClass("expand");
}
}

function seletedTreeClose()
{
function selectedTreeClose() {
var targetParents = slaTRs.filter("tr:has(td.checkbox > input:checked)");
for (var i = 0; i < targetParents.size(); i++)
{
for (var i = 0; i < targetParents.length; i++) {
var parentTR = targetParents.eq(i);
if (!parentTR.hasClass("haschild"))
{
if (!parentTR.hasClass("haschild")) {
continue;
}

//hide
var childlen = slaTRs.filter(function(index){
return index >= (parentTR.attr('cs') - 0) && index <= (parentTR.attr('ce') - 0);
var children = slaTRs.filter(function (index) {
return (
index >= parentTR.attr("cs") - 0 && index <= parentTR.attr("ce") - 0
);
});
childlen.hide().filter(".haschild").removeClass("expand").addClass("collapse");
children
.hide()
.filter(".haschild")
.removeClass("expand")
.addClass("collapse");
parentTR.removeClass("expand").addClass("collapse");
}
}

function allExpandNext()
{
function allExpandNext() {
var parentTR = slaTRs.filter("tr:has(td.checkbox > input:checked)");
if (parentTR.size() != 1)
{
if (parentTR.length != 1) {
exit;
}
if (!parentTR.hasClass("haschild"))
{
if (!parentTR.hasClass("haschild")) {
exit;
}

for (var rank = 0; rank <= (parentTR.attr("rank") - 0); rank++)
{

for (var rank = 0; rank <= parentTR.attr("rank") - 0; rank++) {
//show
slaTRs.filter("tr[rank='" + rank + "'].haschild.collapse").each(function(){
childIssueShowOrHide($(this));
});
slaTRs
.filter("tr[rank='" + rank + "'].haschild.collapse")
.each(function () {
childIssueShowOrHide($(this));
});
}
}

$(document).ready(function()
{
//set toggle event
slaTRs = $("table.list > tbody > tr");
slaTRs.find("td.subject > span.treearrow").click(function()
{
childIssueShowOrHide($(this).parent().parent());
return false;
});

//all expand
$("a.subtask_all_expand").click(function(){
slaTRs.show().filter(".haschild").removeClass("collapse").addClass("expand");

//for debug
if (slaTRs.filter("tr:visible").size() != slaTRs.size()) alert("NG");

return false;
});

//all collapese
$("a.subtask_all_collapse").click(function(){
slaTRs.filter(".idnt").hide();
slaTRs.filter(".haschild").removeClass("expand").addClass("collapse");
return false;
});

//link move
$("div.accordion_control").insertAfter("#issue_tree > p");
$(document).ready(function () {
function setupAccordion() {
// Note: slaTRs is defined in the global scope for access by other functions
slaTRs = $("table.list > tbody > tr");

if (slaTRs.closest("table.list").data("subtaskListAccordionSetupDone")) {
return; // Already set up
}

//set toggle event
slaTRs.find("td.subject > span.treearrow").click(function () {
childIssueShowOrHide($(this).parent().parent());
return false;
});

//all expand
$("a.subtask_all_expand").click(function () {
slaTRs
.show()
.filter(".haschild")
.removeClass("collapse")
.addClass("expand");

//for debug
if (slaTRs.filter("tr:visible").length != slaTRs.length) alert("NG");

return false;
});

//all collapse
$("a.subtask_all_collapse").click(function () {
slaTRs.filter(".idnt").hide();
slaTRs.filter(".haschild").removeClass("expand").addClass("collapse");
return false;
});

//link move
$("div.accordion_control").insertAfter("#issue_tree > p");

// Add marker to indicate setup is done
slaTRs.closest("table.list").data("subtaskListAccordionSetupDone", true);
}

/**
* Set up form change detection.
* This method's purpose is to detect when the issue view is replaced by
* other plugins like Redmine RT.
*/
function setupFormChangeDetection() {
const targetNode = $("div.issue.details").parent()[0];

if (targetNode) {
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
if (mutation.type === "childList") {
mutation.addedNodes.forEach((node) => {
if (
node.nodeType === Node.ELEMENT_NODE &&
($(node).is("div.issue.details") ||
$(node).is($("#issue_tree table.list.issues").parent("form")))
) {
setupAccordion();
}
});
}
});
});

observer.observe(targetNode, {
childList: true,
subtree: true,
attributes: false,
});
}
}

function initialize() {
setupAccordion();
setupFormChangeDetection();
}

initialize();
});
Loading