Files
leadchat/db/migrate/20230405104405_update_position_for_articles.rb
Shivam Mishra ca2506a941 feat: allow sorting of articles (#6833)
* feat: sort by position

* chore: whitespace change

* feat: add border bottom color to list item

* feat: allow dragging articles

* feat: add migration to reorder all articles

* feat: add onsort method

* feat: finish UI sorting

* feat: show 50 per page in articles list

* feat: add article sorting methods

* feat: patch up reorder action with the API

* refactor: better naming

* chore: add comments

* feat: attach position to article before create

* feat: move article to end if moved between categories

* chore: add comments

* chore: update version

* fix: don't change position if previous category was nil

* fix: condition to trigger update on category change

* refactor: store new_position

* refactor: use grid instead of table

* feat: add snug spacing

* feat: add grab-icon

* feat: add grab icon to list

* refactor: show draggable only for category page

* feat: add update_positions as a class method

---------

Co-authored-by: Nithin David Thomas <1277421+nithindavid@users.noreply.github.com>
2023-04-17 14:43:10 +05:30

31 lines
1.3 KiB
Ruby

class UpdatePositionForArticles < ActiveRecord::Migration[6.1]
def change
# Get the unique combinations of account_id and category_id
groups = Article.select(:account_id, :category_id).distinct
# Iterate through the groups
groups.each do |group|
# Get articles belonging to the current group
articles = Article.where(account_id: group.account_id, category_id: group.category_id)
# Separate articles with a position set and those without
articles_with_position = articles.where.not(position: nil).order(:position, :updated_at)
articles_without_position = articles.where(position: nil).order(:updated_at)
# Set the position for articles with a position set, in multiples of 10
# why multiples of 10? because we want to leave room for articles which can be added in between in case we are editing the order from the DB
position_counter = 0
articles_with_position.each do |article|
position_counter += 10
article.update(position: position_counter)
end
# Set the position for articles without a position, starting from where the last position ended
articles_without_position.each do |article|
position_counter += 10
article.update(position: position_counter)
end
end
end
end