mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-01 19:48:08 +00:00
* 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>
82 lines
2.5 KiB
Ruby
82 lines
2.5 KiB
Ruby
class Api::V1::Accounts::ArticlesController < Api::V1::Accounts::BaseController
|
|
before_action :portal
|
|
before_action :check_authorization
|
|
before_action :fetch_article, except: [:index, :create, :attach_file, :reorder]
|
|
before_action :set_current_page, only: [:index]
|
|
|
|
def index
|
|
@portal_articles = @portal.articles
|
|
@all_articles = @portal_articles.search(list_params)
|
|
@articles_count = @all_articles.count
|
|
|
|
@articles = if list_params[:category_slug].present?
|
|
@all_articles.order_by_position.page(@current_page).per(50)
|
|
else
|
|
@all_articles.order_by_updated_at.page(@current_page)
|
|
end
|
|
end
|
|
|
|
def create
|
|
@article = @portal.articles.create!(article_params)
|
|
@article.associate_root_article(article_params[:associated_article_id])
|
|
@article.draft!
|
|
render json: { error: @article.errors.messages }, status: :unprocessable_entity and return unless @article.valid?
|
|
end
|
|
|
|
def edit; end
|
|
|
|
def show; end
|
|
|
|
def update
|
|
@article.update!(article_params) if params[:article].present?
|
|
render json: { error: @article.errors.messages }, status: :unprocessable_entity and return unless @article.valid?
|
|
end
|
|
|
|
def destroy
|
|
@article.destroy!
|
|
head :ok
|
|
end
|
|
|
|
def attach_file
|
|
file_blob = ActiveStorage::Blob.create_and_upload!(
|
|
key: nil,
|
|
io: params[:background_image].tempfile,
|
|
filename: params[:background_image].original_filename,
|
|
content_type: params[:background_image].content_type
|
|
)
|
|
file_blob.save!
|
|
render json: { file_url: url_for(file_blob) }
|
|
end
|
|
|
|
def reorder
|
|
Article.update_positions(params[:positions_hash])
|
|
head :ok
|
|
end
|
|
|
|
private
|
|
|
|
def fetch_article
|
|
@article = @portal.articles.find(params[:id])
|
|
end
|
|
|
|
def portal
|
|
@portal ||= Current.account.portals.find_by!(slug: params[:portal_id])
|
|
end
|
|
|
|
def article_params
|
|
params.require(:article).permit(
|
|
:title, :slug, :position, :content, :description, :position, :category_id, :author_id, :associated_article_id, :status, meta: [:title,
|
|
:description,
|
|
{ tags: [] }]
|
|
)
|
|
end
|
|
|
|
def list_params
|
|
params.permit(:locale, :query, :page, :category_slug, :status, :author_id)
|
|
end
|
|
|
|
def set_current_page
|
|
@current_page = params[:page] || 1
|
|
end
|
|
end
|