mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-31 19:17:48 +00:00 
			
		
		
		
	 655db56be9
			
		
	
	655db56be9
	
	
	
		
			
			# Pull Request Template ## Description This PR increases the per-page limit for the Category index endpoint from 25 to 1000. Fixes [CW-5486](https://linear.app/chatwoot/issue/CW-5486/you-cannot-work-with-more-than-25-help-center-categories) https://github.com/chatwoot/chatwoot/issues/12274 ## Type of change ## How Has This Been Tested? ### Loom video https://www.loom.com/share/431fb48491a44578851621fc4607c4dd?sid=81198d89-e8c0-4fb9-b93f-8b4dbf524a46 ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [ ] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules
		
			
				
	
	
		
			92 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # == Schema Information
 | |
| #
 | |
| # Table name: categories
 | |
| #
 | |
| #  id                     :bigint           not null, primary key
 | |
| #  description            :text
 | |
| #  icon                   :string           default("")
 | |
| #  locale                 :string           default("en")
 | |
| #  name                   :string
 | |
| #  position               :integer
 | |
| #  slug                   :string           not null
 | |
| #  created_at             :datetime         not null
 | |
| #  updated_at             :datetime         not null
 | |
| #  account_id             :integer          not null
 | |
| #  associated_category_id :bigint
 | |
| #  parent_category_id     :bigint
 | |
| #  portal_id              :integer          not null
 | |
| #
 | |
| # Indexes
 | |
| #
 | |
| #  index_categories_on_associated_category_id         (associated_category_id)
 | |
| #  index_categories_on_locale                         (locale)
 | |
| #  index_categories_on_locale_and_account_id          (locale,account_id)
 | |
| #  index_categories_on_parent_category_id             (parent_category_id)
 | |
| #  index_categories_on_slug_and_locale_and_portal_id  (slug,locale,portal_id) UNIQUE
 | |
| #
 | |
| class Category < ApplicationRecord
 | |
|   paginates_per Limits::CATEGORIES_PER_PAGE
 | |
|   belongs_to :account
 | |
|   belongs_to :portal
 | |
|   has_many :folders, dependent: :destroy_async
 | |
|   has_many :articles, dependent: :nullify
 | |
|   has_many :category_related_categories,
 | |
|            class_name: :RelatedCategory,
 | |
|            dependent: :destroy_async
 | |
|   has_many :related_categories,
 | |
|            through: :category_related_categories,
 | |
|            class_name: :Category,
 | |
|            dependent: :nullify
 | |
|   has_many :sub_categories,
 | |
|            class_name: :Category,
 | |
|            foreign_key: :parent_category_id,
 | |
|            dependent: :nullify,
 | |
|            inverse_of: 'parent_category'
 | |
|   has_many :associated_categories,
 | |
|            class_name: :Category,
 | |
|            foreign_key: :associated_category_id,
 | |
|            dependent: :nullify,
 | |
|            inverse_of: 'root_category'
 | |
|   belongs_to :parent_category, class_name: :Category, optional: true
 | |
|   belongs_to :root_category,
 | |
|              class_name: :Category,
 | |
|              foreign_key: :associated_category_id,
 | |
|              inverse_of: :associated_categories,
 | |
|              optional: true
 | |
| 
 | |
|   before_validation :ensure_account_id
 | |
|   validates :account_id, presence: true
 | |
|   validates :slug, presence: true
 | |
|   validates :name, presence: true
 | |
|   validate :allowed_locales
 | |
|   validates :locale, uniqueness: { scope: %i[slug portal_id],
 | |
|                                    message: I18n.t('errors.categories.locale.unique') }
 | |
|   accepts_nested_attributes_for :related_categories
 | |
| 
 | |
|   scope :search_by_locale, ->(locale) { where(locale: locale) if locale.present? }
 | |
| 
 | |
|   def self.search(params)
 | |
|     search_by_locale(params[:locale]).page(current_page(params)).order(position: :asc)
 | |
|   end
 | |
| 
 | |
|   def self.current_page(params)
 | |
|     params[:page] || 1
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def ensure_account_id
 | |
|     self.account_id = portal&.account_id
 | |
|   end
 | |
| 
 | |
|   def allowed_locales
 | |
|     return if portal.blank?
 | |
| 
 | |
|     allowed_locales = portal.config['allowed_locales']
 | |
| 
 | |
|     return true if allowed_locales.include?(locale)
 | |
| 
 | |
|     errors.add(:locale, "#{locale} of category is not part of portal's #{allowed_locales}.")
 | |
|   end
 | |
| end
 |