Skip to content

Commit

Permalink
Merge branch 'development'
Browse files Browse the repository at this point in the history
  • Loading branch information
GEROMAX committed Jan 31, 2018
2 parents c42ea44 + ff6d675 commit 1bd757e
Show file tree
Hide file tree
Showing 11 changed files with 375 additions and 203 deletions.
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,16 @@ This plugin provide accordion to subtask list of issue.
* Add accordion feature to subtask-list.
* Add function 'Expand this tree', 'Collapse this tree' and 'Expand next level all' to context-menu.
* Add preferences of expand tree at first time.
* Add plugin setting for server/client processing mode switch. (server mode default)
Server mode is faster than client mode, but server mode is tradeoff other subtask's plugin. (for exsample 'subtask_list_columns' plugin)

## Compatibility

Redmine 3.3 or 3.4 stable

Tested on:
* 3.3.3
* 3.4.2
* 3.3.6
* 3.4.4

## Installation

Expand Down
6 changes: 4 additions & 2 deletions app/views/issues/_subtask_list_accordion_partial.html.erb
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
<% if has_grandson_issues?(@issue) %>
<%= content_for :header_tags do
stylesheet_link_tag("subtask_list_accordion", :plugin => "redmine_subtask_list_accordion") +
javascript_include_tag("subtask_list_accordion", :plugin => "redmine_subtask_list_accordion")
javascript_include_tag("subtask_list_accordion" + (subtask_tree_client_processing? ? "_client" : ""), :plugin => "redmine_subtask_list_accordion")
end %>
<div class="accordion_control contextual">
<a href="javascript:void(0)" class="subtask_all_expand"><%= l(:list_all_expand) %></a>
<a href="javascript:void(0)" class="subtask_all_collapse"><%= l(:list_all_collapse) %></a>
</div>
<% if subtask_tree_client_processing? %>
<script>
window.subtaskListAccordionExpandTreeAtFirst = <%= expand_tree_at_first?(@issue, User.current) %>;
window.subtaskListAccordionExpandTreeAtFirst = <%= expand_tree_at_first?(@issue) %>;
</script>
<% end %>
<% end %>
<script>
//control context-menu of this plugin
Expand Down
4 changes: 4 additions & 0 deletions app/views/settings/_subtask_list_accordion_settings.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<div>
<%= check_box_tag 'settings[enable_server_scripting_mode]', true, settings['enable_server_scripting_mode'] %>
<%= l(:label_enable_server_scripting_mode).html_safe %>
</div>
209 changes: 15 additions & 194 deletions assets/javascripts/subtask_list_accordion.js
Original file line number Diff line number Diff line change
@@ -1,83 +1,3 @@
function getParentIssue(startPos, rank, sameTreeOnly)
{
if (sameTreeOnly)
{
if (rank > 0 &&
!slaTRs.eq(startPos.val + 1).hasClass("idnt-" + rank) &&
!slaTRs.eq(startPos.val + 1).hasClass("idnt-" + (rank + 1)))
{
//skip because other tree
return $();
}
}

//find potential parent
var issuesSelector = "table.list > tbody > tr";
var rankAttr = rank <= 0 ? ":not(.idnt)" : "tr.idnt-" + rank;
var nextAttr = "tr.idnt-" + (rank + 1 - 0);
var selectorP = (startPos.val + rank) > 0 ? ":gt(" + startPos.val + ")" + rankAttr : rankAttr;
var selectorC = nextAttr + ":first";
var pp = $(issuesSelector + selectorP + " + " + selectorC);

if (pp.size() != 1)
{
//no parent
return $();
}

//get parent
startPos.val = pp.index() - 1;
return slaTRs.filter(function(index){
return index == startPos.val;
});
}

function getChildIssues(startPos, rank)
{
//find first child
var nextAttr = ".idnt-" + (rank - 0 + 1);
var selectorFirst = ":gt(" + startPos.val + ")" + nextAttr + ":first";
var startIdx = slaTRs.filter(selectorFirst).index();
if (startIdx <= 0)
{
return $();
}

//find last child
var cc = startIdx;
var rankCount = rank + 1;
var endIdx;
do
{
if (slaTRs.eq(cc).is('.idnt-' + rankCount))
{
endIdx = cc++;
}
else if (slaTRs.eq(cc).is('.idnt-' + (rankCount - 0 + 1)))
{
endIdx = cc++;
rankCount++;
}
else if (slaTRs.eq(cc).is('.idnt') && (rankCount > (rank + 1)))
{
rankCount--;
}
else
{
break;
}
}
while (cc < slaTRsSize);

startPos.val = endIdx;
return slaTRs.filter(function(index){ return index >= startIdx && index <= endIdx; });
}

function addRangeIndex(parentTR, childlen, rank)
{
parentTR.attr('cs', childlen.filter("tr:first").index()).attr('ce', childlen.filter("tr:last").index()).attr('rank', rank);
}

function childIssueShowOrHide(parentTR)
{
var childlen = slaTRs.filter(function(index){
Expand All @@ -96,52 +16,6 @@ function childIssueShowOrHide(parentTR)
}
}

function setAccordion(parentPos, rank, isHiding, sameTreeOnly)
{
var parentTR = getParentIssue(parentPos, rank, sameTreeOnly);
if (parentTR.size() != 1)
{
return false;
}
else if (parentTR.hasClass("haschild"))
{
//search exit or skip
return !sameTreeOnly;
}
parentTR.addClass("haschild").addClass(isHiding ? "collapse" : "expand").find("td.subject > a").before('<span class="treearrow" />');

var childlen = getChildIssues(parentPos, rank);
addRangeIndex(parentTR, childlen, rank);
parentTR.find('td.subject > span.treearrow').click(function()
{
childIssueShowOrHide($(this).parent().parent());
return false;
});
if (isHiding)
{
childlen.hide();
}

//make next rank
if (sameTreeOnly)
{
parentTR.find("td.subject > span.treearrow").one('click', function(){
var parentTR = $(this).parent().parent();
var parentFound = false;
var parentPos = { val: 0 };
parentPos.val = parentTR.index();
do
{
parentFound = setAccordion(parentPos, rank + 1, true, true);
}
while(parentFound);
});
}

//do next
return true;
}

function seletedTreeOpen()
{
var targetParents = slaTRs.filter("tr:has(td.checkbox > input:checked)");
Expand All @@ -151,21 +25,8 @@ function seletedTreeOpen()
if (!parentTR.hasClass("haschild"))
{
continue;
}

//make rank
for (var rank = (parentTR.attr("rank") - 0 + 1); rank < 10; rank++)
{
var parentFound = false;
var parentPos = { val: 0 };
parentPos.val = parentTR.index();
do
{
parentFound = setAccordion(parentPos, rank, false, false);
}
while(parentFound && parentPos.val < (parentTR.attr('ce') - 0));
}

}

//show
var childlen = slaTRs.filter(function(index){
return index >= (parentTR.attr('cs') - 0) && index <= (parentTR.attr('ce') - 0);
Expand Down Expand Up @@ -207,71 +68,31 @@ function allExpandNext()
exit;
}

//make rank
for (var rank = 0; rank <= (parentTR.attr("rank") - 0 + 1); rank++)
{
if (rank > 0)
{
var parentFound = false;
var parentPos = { val: 0 };
do
{
parentFound = setAccordion(parentPos, rank, true, false);
}
while(parentFound);
}

for (var rank = 0; rank <= (parentTR.attr("rank") - 0); rank++)
{
//show
if (rank <= (parentTR.attr("rank") - 0))
{
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()
{
var expandTreeAtFirst = window.subtaskListAccordionExpandTreeAtFirst;
//make rank first time
//set toggle event
slaTRs = $("table.list > tbody > tr");
slaTRsSize = slaTRs.size();
var analyzeTo = expandTreeAtFirst ? 10 : 1;
var isHiding = !expandTreeAtFirst;
var isSameTreeOnly = isHiding;

for (var rank = 0; rank < analyzeTo; rank++)
slaTRs.find("td.subject > span.treearrow").click(function()
{
var parentPos = { val: 0 };
var parentFound = false;
do
{
parentFound = setAccordion(parentPos, rank, isHiding, isSameTreeOnly);
}
while(parentFound);
}

childIssueShowOrHide($(this).parent().parent());
return false;
});

//all expand
$("a.subtask_all_expand").one("click", function(){
for (var rank = 1; rank < 10; rank++)
{
var parentPos = { val: 0 };
var parentFound = false;
do
{
parentFound = setAccordion(parentPos, rank, false, false);
}
while(parentFound);
}
}).click(function(){
$("a.subtask_all_expand").click(function(){
slaTRs.show().filter(".haschild").removeClass("collapse").addClass("expand");

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

return false;
});
Expand Down
Loading

0 comments on commit 1bd757e

Please sign in to comment.