diff options
author | Valery Sizov <valery@gitlab.com> | 2017-03-10 18:12:31 +0300 |
---|---|---|
committer | Valery Sizov <valery@gitlab.com> | 2017-03-14 15:11:59 +0300 |
commit | 5670777735a615b511c3282e8fc79b67c74669bc (patch) | |
tree | 0659efe220286457fb00eaf0eba2c808f9cd3f8a /app/models/concerns/relative_positioning.rb | |
parent | 67686e38fdb1d9c427a39ff1862af691ccd4e598 (diff) |
[Issue sorting] Filling positions preferable in the middle
Diffstat (limited to 'app/models/concerns/relative_positioning.rb')
-rw-r--r-- | app/models/concerns/relative_positioning.rb | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/app/models/concerns/relative_positioning.rb b/app/models/concerns/relative_positioning.rb index ec23c8a08fb..f8ab16a9f4c 100644 --- a/app/models/concerns/relative_positioning.rb +++ b/app/models/concerns/relative_positioning.rb @@ -2,6 +2,7 @@ module RelativePositioning extend ActiveSupport::Concern MIN_POSITION = 0 + START_POSITION = Gitlab::Database::MAX_INT_VALUE / 2 MAX_POSITION = Gitlab::Database::MAX_INT_VALUE DISTANCE = 500 @@ -9,10 +10,6 @@ module RelativePositioning after_save :save_positionable_neighbours end - def min_relative_position - self.class.in_projects(project.id).minimum(:relative_position) - end - def max_relative_position self.class.in_projects(project.id).maximum(:relative_position) end @@ -27,7 +24,7 @@ module RelativePositioning maximum(:relative_position) end - prev_pos || MIN_POSITION + prev_pos end def next_relative_position @@ -40,7 +37,7 @@ module RelativePositioning minimum(:relative_position) end - next_pos || MAX_POSITION + next_pos end def move_between(before, after) @@ -72,7 +69,7 @@ module RelativePositioning end def move_to_end - self.relative_position = position_between(max_relative_position, MAX_POSITION) + self.relative_position = position_between(max_relative_position || START_POSITION, MAX_POSITION) end private @@ -87,10 +84,16 @@ module RelativePositioning pos_before, pos_after = [pos_before, pos_after].sort - if pos_after - pos_before > DISTANCE * 2 - pos_before + DISTANCE + if pos_after - pos_before < DISTANCE * 2 + (pos_after + pos_before) / 2 else - pos_before + (pos_after - pos_before) / 2 + if pos_before == MIN_POSITION + pos_after - DISTANCE + elsif pos_after == MAX_POSITION + pos_before + DISTANCE + else + (pos_after + pos_before) / 2 + end end end |