diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
index d57ad0e53..b6df015f7 100644
--- a/app/controllers/dashboard_controller.rb
+++ b/app/controllers/dashboard_controller.rb
@@ -80,10 +80,17 @@ class DashboardController < ActionController::Base
IS_ENTERPRISE: ChatwootApp.enterprise?,
AZURE_APP_ID: GlobalConfigService.load('AZURE_APP_ID', ''),
GIT_SHA: GIT_HASH,
- ALLOWED_LOGIN_METHODS: allowed_login_methods
+ ALLOWED_LOGIN_METHODS: allowed_login_methods,
+ ACTIVE_PLATFORM_BANNERS: active_platform_banners
}
end
+ def active_platform_banners
+ return [] unless ChatwootApp.chatwoot_cloud?
+
+ PlatformBanner.active.order(created_at: :desc).as_json(only: %i[id banner_message banner_type updated_at])
+ end
+
def allowed_login_methods
methods = ['email']
methods << 'google_oauth' if GlobalConfigService.load('ENABLE_GOOGLE_OAUTH_LOGIN', 'true').to_s != 'false'
diff --git a/app/controllers/super_admin/platform_banners_controller.rb b/app/controllers/super_admin/platform_banners_controller.rb
new file mode 100644
index 000000000..e4bf727a0
--- /dev/null
+++ b/app/controllers/super_admin/platform_banners_controller.rb
@@ -0,0 +1,9 @@
+class SuperAdmin::PlatformBannersController < SuperAdmin::ApplicationController
+ before_action :ensure_chatwoot_cloud
+
+ private
+
+ def ensure_chatwoot_cloud
+ raise ActionController::RoutingError, 'Not Found' unless ChatwootApp.chatwoot_cloud?
+ end
+end
diff --git a/app/dashboards/platform_banner_dashboard.rb b/app/dashboards/platform_banner_dashboard.rb
new file mode 100644
index 000000000..41674406a
--- /dev/null
+++ b/app/dashboards/platform_banner_dashboard.rb
@@ -0,0 +1,20 @@
+require 'administrate/base_dashboard'
+
+class PlatformBannerDashboard < Administrate::BaseDashboard
+ ATTRIBUTE_TYPES = {
+ id: Field::Number,
+ banner_message: Field::Text.with_options(truncate: 200),
+ banner_type: Field::Select.with_options(collection: %w[info warning error]),
+ active: Field::Boolean,
+ created_at: Field::DateTime,
+ updated_at: Field::DateTime
+ }.freeze
+
+ COLLECTION_ATTRIBUTES = %i[id banner_message banner_type active created_at].freeze
+ SHOW_PAGE_ATTRIBUTES = %i[id banner_message banner_type active created_at updated_at].freeze
+ FORM_ATTRIBUTES = %i[banner_message banner_type active].freeze
+
+ def display_resource(platform_banner)
+ "Banner ##{platform_banner.id} (#{platform_banner.banner_type})"
+ end
+end
diff --git a/app/javascript/dashboard/App.vue b/app/javascript/dashboard/App.vue
index 988829407..99aebfd1a 100644
--- a/app/javascript/dashboard/App.vue
+++ b/app/javascript/dashboard/App.vue
@@ -3,6 +3,7 @@ import { mapGetters } from 'vuex';
import LoadingState from './components/widgets/LoadingState.vue';
import NetworkNotification from './components/NetworkNotification.vue';
import UpdateBanner from './components/app/UpdateBanner.vue';
+import StatusBanner from './components/app/StatusBanner.vue';
import PaymentPendingBanner from './components/app/PaymentPendingBanner.vue';
import PendingEmailVerificationBanner from './components/app/PendingEmailVerificationBanner.vue';
import vueActionCable from './helper/actionCable';
@@ -27,6 +28,7 @@ export default {
LoadingState,
NetworkNotification,
UpdateBanner,
+ StatusBanner,
PaymentPendingBanner,
WootSnackbarBox,
PendingEmailVerificationBanner,
@@ -137,6 +139,7 @@ export default {
:dir="isRTL ? 'rtl' : 'ltr'"
>
+
diff --git a/app/javascript/dashboard/components-next/banner/Banner.vue b/app/javascript/dashboard/components-next/banner/Banner.vue
index 466c03be0..c9b86d42b 100644
--- a/app/javascript/dashboard/components-next/banner/Banner.vue
+++ b/app/javascript/dashboard/components-next/banner/Banner.vue
@@ -1,5 +1,3 @@
-
-
+
+
+
+
+
+
diff --git a/app/javascript/dashboard/components/ui/Banner.vue b/app/javascript/dashboard/components/ui/Banner.vue
index 6c71588f7..5e5e5a871 100644
--- a/app/javascript/dashboard/components/ui/Banner.vue
+++ b/app/javascript/dashboard/components/ui/Banner.vue
@@ -1,3 +1,5 @@
+
+