Initial commit: Add logistics and order_detail message types
Some checks failed
Lock Threads / action (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
Publish Chatwoot EE docker images / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Publish Chatwoot EE docker images / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Publish Chatwoot EE docker images / merge (push) Has been cancelled
Publish Chatwoot CE docker images / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Publish Chatwoot CE docker images / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Publish Chatwoot CE docker images / merge (push) Has been cancelled
Run Chatwoot CE spec / lint-backend (push) Has been cancelled
Run Chatwoot CE spec / lint-frontend (push) Has been cancelled
Run Chatwoot CE spec / frontend-tests (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (0, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (1, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (10, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (11, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (12, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (13, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (14, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (15, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (2, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (3, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (4, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (5, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (6, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (7, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (8, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (9, 16) (push) Has been cancelled
Run Linux nightly installer / nightly (push) Has been cancelled

- Add Logistics component with progress tracking
- Add OrderDetail component for order information
- Support data-driven steps and actions
- Add blue color scale to widget SCSS
- Fix node overflow and progress bar rendering issues
- Add English translations for dashboard components

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Liang XJ
2026-01-26 11:16:56 +08:00
commit 092fb2e083
7646 changed files with 975643 additions and 0 deletions

View File

@@ -0,0 +1,37 @@
class AccountPolicy < ApplicationPolicy
def show?
@account_user.administrator? || @account_user.agent?
end
def cache_keys?
@account_user.administrator? || @account_user.agent?
end
def limits?
@account_user.administrator? || @account_user.agent?
end
def update?
@account_user.administrator?
end
def update_active_at?
true
end
def subscription?
@account_user.administrator?
end
def checkout?
@account_user.administrator?
end
def toggle_deletion?
@account_user.administrator?
end
def topup_checkout?
@account_user.administrator?
end
end

View File

@@ -0,0 +1,29 @@
class AgentBotPolicy < ApplicationPolicy
def index?
@account_user.administrator? || @account_user.agent?
end
def update?
@account_user.administrator?
end
def show?
@account_user.administrator? || @account_user.agent?
end
def create?
@account_user.administrator?
end
def destroy?
@account_user.administrator?
end
def avatar?
@account_user.administrator?
end
def reset_access_token?
@account_user.administrator?
end
end

View File

@@ -0,0 +1,59 @@
class ApplicationPolicy
attr_reader :user_context, :user, :record, :account, :account_user
def initialize(user_context, record)
@user_context = user_context
@user = user_context[:user]
@account = user_context[:account]
@account_user = user_context[:account_user]
@record = record
end
def index?
false
end
def show?
scope.exists?(id: record.id)
end
def create?
false
end
def new?
create?
end
def update?
false
end
def edit?
update?
end
def destroy?
false
end
def scope
Pundit.policy_scope!(user_context, record.class)
end
class Scope
attr_reader :user_context, :user, :scope, :account, :account_user
def initialize(user_context, scope)
@user_context = user_context
@user = user_context[:user]
@account = user_context[:account]
@account_user = user_context[:account_user]
@scope = scope
end
def resolve
scope
end
end
end

View File

@@ -0,0 +1,31 @@
class ArticlePolicy < ApplicationPolicy
def index?
@account.users.include?(@user)
end
def update?
@account_user.administrator?
end
def show?
@account_user.administrator?
end
def edit?
@account_user.administrator?
end
def create?
@account_user.administrator?
end
def destroy?
@account_user.administrator?
end
def reorder?
@account_user.administrator?
end
end
ArticlePolicy.prepend_mod_with('ArticlePolicy')

View File

@@ -0,0 +1,21 @@
class AssignmentPolicyPolicy < ApplicationPolicy
def index?
@account_user.administrator?
end
def show?
@account_user.administrator?
end
def create?
@account_user.administrator?
end
def update?
@account_user.administrator?
end
def destroy?
@account_user.administrator?
end
end

View File

@@ -0,0 +1,25 @@
class AutomationRulePolicy < ApplicationPolicy
def index?
@account_user.administrator?
end
def create?
@account_user.administrator?
end
def show?
@account_user.administrator?
end
def update?
@account_user.administrator?
end
def clone?
@account_user.administrator?
end
def destroy?
@account_user.administrator?
end
end

View File

@@ -0,0 +1,21 @@
class CampaignPolicy < ApplicationPolicy
def index?
@account_user.administrator?
end
def update?
@account_user.administrator?
end
def show?
@account_user.administrator?
end
def create?
@account_user.administrator?
end
def destroy?
@account_user.administrator?
end
end

View File

@@ -0,0 +1,27 @@
class CategoryPolicy < ApplicationPolicy
def index?
@account.users.include?(@user)
end
def update?
@account_user.administrator?
end
def show?
@account_user.administrator?
end
def edit?
@account_user.administrator?
end
def create?
@account_user.administrator?
end
def destroy?
@account_user.administrator?
end
end
CategoryPolicy.prepend_mod_with('CategoryPolicy')

View File

@@ -0,0 +1,53 @@
class ContactPolicy < ApplicationPolicy
def index?
true
end
def active?
true
end
def import?
@account_user.administrator?
end
def export?
@account_user.administrator?
end
def search?
true
end
def filter?
true
end
def update?
true
end
def contactable_inboxes?
true
end
def destroy_custom_attributes?
true
end
def show?
true
end
def create?
true
end
def avatar?
true
end
def destroy?
@account_user.administrator?
end
end

View File

@@ -0,0 +1,47 @@
class ConversationPolicy < ApplicationPolicy
def index?
true
end
def destroy?
administrator?
end
def show?
administrator? || agent_bot? || agent_can_view_conversation?
end
private
def agent_can_view_conversation?
inbox_access? || team_access?
end
def administrator?
account_user&.administrator?
end
def agent_bot?
user.is_a?(AgentBot)
end
def inbox_access?
user.inboxes.where(account_id: account&.id).exists?(id: record.inbox_id)
end
def team_access?
return false if record.team_id.blank?
user.teams.where(account_id: account&.id).exists?(id: record.team_id)
end
def assigned_to_user?
record.assignee_id == user.id
end
def participant?
record.conversation_participants.exists?(user_id: user.id)
end
end
ConversationPolicy.prepend_mod_with('ConversationPolicy')

View File

@@ -0,0 +1,15 @@
class CsatSurveyResponsePolicy < ApplicationPolicy
def index?
@account_user.administrator?
end
def metrics?
@account_user.administrator?
end
def download?
@account_user.administrator?
end
end
CsatSurveyResponsePolicy.prepend_mod_with('CsatSurveyResponsePolicy')

View File

@@ -0,0 +1,21 @@
class CustomFilterPolicy < ApplicationPolicy
def create?
@account_user.administrator? || @account_user.agent?
end
def show?
@account_user.administrator? || @account_user.agent?
end
def index?
@account_user.administrator? || @account_user.agent?
end
def update?
@account_user.administrator? || @account_user.agent?
end
def destroy?
@account_user.administrator? || @account_user.agent?
end
end

View File

@@ -0,0 +1,17 @@
class HookPolicy < ApplicationPolicy
def create?
@account_user.administrator?
end
def update?
@account_user.administrator?
end
def process_event?
true
end
def destroy?
@account_user.administrator?
end
end

View File

@@ -0,0 +1,68 @@
class InboxPolicy < ApplicationPolicy
class Scope
attr_reader :user_context, :user, :scope, :account, :account_user
def initialize(user_context, scope)
@user_context = user_context
@user = user_context[:user]
@account = user_context[:account]
@account_user = user_context[:account_user]
@scope = scope
end
def resolve
user.assigned_inboxes
end
end
def index?
true
end
def show?
# FIXME: for agent bots, lets bring this validation to policies as well in future
return true if @user.is_a?(AgentBot)
Current.user.assigned_inboxes.include? record
end
def assignable_agents?
true
end
def agent_bot?
true
end
def campaigns?
@account_user.administrator?
end
def create?
@account_user.administrator?
end
def update?
@account_user.administrator?
end
def destroy?
@account_user.administrator?
end
def set_agent_bot?
@account_user.administrator?
end
def avatar?
@account_user.administrator?
end
def sync_templates?
@account_user.administrator?
end
def health?
@account_user.administrator?
end
end

View File

@@ -0,0 +1,21 @@
class LabelPolicy < ApplicationPolicy
def index?
@account_user.administrator? || @account_user.agent?
end
def update?
@account_user.administrator?
end
def show?
@account_user.administrator?
end
def create?
@account_user.administrator?
end
def destroy?
@account_user.administrator?
end
end

View File

@@ -0,0 +1,37 @@
class MacroPolicy < ApplicationPolicy
def index?
true
end
def create?
true
end
def show?
@record.global? || author?
end
def update?
author? || (@account_user.administrator? && @record.global?)
end
def destroy?
author? || orphan_record?
end
def execute?
@record.global? || author?
end
private
def author?
@record.created_by == @account_user.user
end
def orphan_record?
return @account_user.administrator? if @record.created_by.nil? && @record.global?
false
end
end

View File

@@ -0,0 +1,39 @@
class PortalPolicy < ApplicationPolicy
def index?
@account.users.include?(@user)
end
def update?
@account_user.administrator?
end
def show?
@account.users.include?(@user)
end
def edit?
@account_user.administrator?
end
def create?
@account_user.administrator?
end
def destroy?
@account_user.administrator?
end
def logo?
@account_user.administrator?
end
def send_instructions?
@account_user.administrator?
end
def ssl_status?
@account.users.include?(@user)
end
end
PortalPolicy.prepend_mod_with('PortalPolicy')

View File

@@ -0,0 +1,7 @@
class ReportPolicy < ApplicationPolicy
def view?
@account_user.administrator?
end
end
ReportPolicy.prepend_mod_with('ReportPolicy')

View File

@@ -0,0 +1,17 @@
class TeamMemberPolicy < ApplicationPolicy
def index?
true
end
def create?
@account_user.administrator?
end
def destroy?
@account_user.administrator?
end
def update?
@account_user.administrator?
end
end

View File

@@ -0,0 +1,21 @@
class TeamPolicy < ApplicationPolicy
def index?
true
end
def update?
@account_user.administrator?
end
def show?
true
end
def create?
@account_user.administrator?
end
def destroy?
@account_user.administrator?
end
end

View File

@@ -0,0 +1,21 @@
class UserPolicy < ApplicationPolicy
def index?
true
end
def create?
@account_user.administrator?
end
def update?
@account_user.administrator?
end
def destroy?
@account_user.administrator?
end
def bulk_create?
@account_user.administrator?
end
end

View File

@@ -0,0 +1,17 @@
class WebhookPolicy < ApplicationPolicy
def index?
@account_user.administrator?
end
def update?
@account_user.administrator?
end
def destroy?
@account_user.administrator?
end
def create?
@account_user.administrator?
end
end