mirror of
https://github.com/discourse/discourse.git
synced 2024-12-25 12:43:45 +08:00
25ccf6fab1
When updating the position of a category, the server correctly updates the position in the database, but the response sent back to the client still contains the old position, causing it to "flip back" in the UI when saving. Only reloading the page will reveal the new, correct value.
The Positionable concern correctly positions the record and updates the database, but we don't assign the new position to the already instantiated model.
This change just assigns self.position after the database update. 😎
40 lines
1.1 KiB
Ruby
40 lines
1.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Positionable
|
|
extend ActiveSupport::Concern
|
|
|
|
included { before_save { self.position ||= self.class.count } }
|
|
|
|
def move_to(position_arg)
|
|
position = [[position_arg, 0].max, self.class.count - 1].min
|
|
|
|
if self.position.nil? || position > (self.position)
|
|
DB.exec "
|
|
UPDATE #{self.class.table_name}
|
|
SET position = position - 1
|
|
WHERE position > :current_position and position <= :new_position",
|
|
current_position: self.position,
|
|
new_position: position
|
|
elsif position < self.position
|
|
DB.exec "
|
|
UPDATE #{self.class.table_name}
|
|
SET position = position + 1
|
|
WHERE position >= :new_position and position < :current_position",
|
|
current_position: self.position,
|
|
new_position: position
|
|
else
|
|
# Not moving to a new position
|
|
return
|
|
end
|
|
|
|
DB.exec "
|
|
UPDATE #{self.class.table_name}
|
|
SET position = :position
|
|
WHERE id = :id",
|
|
id: id,
|
|
position: position
|
|
|
|
self.position = position
|
|
end
|
|
end
|