diff --git a/addons/tncsc_deployment/__manifest__.py b/addons/tncsc_deployment/__manifest__.py
index d8536a1..2c4be23 100644
--- a/addons/tncsc_deployment/__manifest__.py
+++ b/addons/tncsc_deployment/__manifest__.py
@@ -26,6 +26,8 @@ that applies to the community_* product modules.
'website': 'https://www.metatroncube.com',
'license': 'LGPL-3',
'depends': [
+ 'event',
+ 'website_event',
'community_theme_base',
'community_membership',
'event_qr_ticketing',
@@ -49,6 +51,7 @@ that applies to the community_* product modules.
'views/website_header_overrides.xml',
'views/browser_branding.xml',
'views/event_kanban_views.xml',
+ 'views/event_views.xml',
'views/community_dashboard_views.xml',
'views/login_templates.xml',
],
diff --git a/addons/tncsc_deployment/models/__init__.py b/addons/tncsc_deployment/models/__init__.py
index b067a53..2365ddf 100644
--- a/addons/tncsc_deployment/models/__init__.py
+++ b/addons/tncsc_deployment/models/__init__.py
@@ -1,2 +1,3 @@
from . import res_company
from . import res_partner
+from . import event_event
diff --git a/addons/tncsc_deployment/models/event_event.py b/addons/tncsc_deployment/models/event_event.py
new file mode 100644
index 0000000..2b440b9
--- /dev/null
+++ b/addons/tncsc_deployment/models/event_event.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+from odoo import api, fields, models
+
+
+class EventEvent(models.Model):
+ _name = 'event.event'
+ _inherit = ['event.event', 'image.mixin']
+
+ registration_status = fields.Selection([
+ ('open', 'Open for Registration'),
+ ('closed', 'Registrations Closed'),
+ ('sold_out', 'Sold Out'),
+ ('ongoing', 'Happening Now'),
+ ], string='Registration Status', compute='_compute_registration_status', compute_sudo=True)
+
+ is_registration_open = fields.Boolean(
+ string='Is Registration Open',
+ compute='_compute_registration_status',
+ compute_sudo=True,
+ )
+
+ stage_display_name = fields.Char(
+ string='Stage Display Name',
+ compute='_compute_stage_display_name',
+ compute_sudo=True,
+ )
+
+ @api.depends('stage_id', 'stage_id.name')
+ def _compute_stage_display_name(self):
+ for ev in self:
+ ev_sudo = ev.sudo()
+ ev.stage_display_name = ev_sudo.stage_id.name if ev_sudo.stage_id else 'Festival'
+
+ @api.depends(
+ 'event_registrations_open',
+ 'event_registrations_sold_out',
+ 'is_done',
+ 'is_ongoing',
+ 'stage_id',
+ 'stage_id.name',
+ 'date_end',
+ 'kanban_state',
+ )
+ def _compute_registration_status(self):
+ now = fields.Datetime.now()
+ for ev in self:
+ ev_sudo = ev.sudo()
+ stage_name = (ev_sudo.stage_id.name or '').lower() if ev_sudo.stage_id else ''
+ is_ended = bool(
+ ev_sudo.is_done
+ or stage_name in ['ended', 'done', 'cancelled', 'concluded']
+ or (ev_sudo.date_end and ev_sudo.date_end < now)
+ or (ev_sudo.kanban_state == 'cancel')
+ )
+ if ev_sudo.kanban_state == 'cancel':
+ ev.registration_status = 'closed'
+ ev.is_registration_open = False
+ elif is_ended:
+ ev.registration_status = 'closed'
+ ev.is_registration_open = False
+ elif ev_sudo.event_registrations_sold_out:
+ ev.registration_status = 'sold_out'
+ ev.is_registration_open = False
+ elif ev_sudo.is_ongoing and not ev_sudo.event_registrations_open:
+ ev.registration_status = 'ongoing'
+ ev.is_registration_open = False
+ elif ev_sudo.event_registrations_open:
+ ev.registration_status = 'open'
+ ev.is_registration_open = True
+ else:
+ ev.registration_status = 'closed'
+ ev.is_registration_open = False
diff --git a/addons/tncsc_deployment/security/tncsc_roles.xml b/addons/tncsc_deployment/security/tncsc_roles.xml
index 359e281..224c8b6 100644
--- a/addons/tncsc_deployment/security/tncsc_roles.xml
+++ b/addons/tncsc_deployment/security/tncsc_roles.xml
@@ -76,4 +76,24 @@
Reviews and publishes classified listings.
+
+
+
+ event.stage.public
+
+
+
+
+
+
+
+
+ event.stage.portal
+
+
+
+
+
+
+
diff --git a/addons/tncsc_deployment/static/src/img/dashboard/gold_chariot_art.jpg b/addons/tncsc_deployment/static/src/img/dashboard/gold_chariot_art.jpg
index 4fb1c83..28d0b73 100644
Binary files a/addons/tncsc_deployment/static/src/img/dashboard/gold_chariot_art.jpg and b/addons/tncsc_deployment/static/src/img/dashboard/gold_chariot_art.jpg differ
diff --git a/addons/tncsc_deployment/static/src/img/dashboard/gold_chariot_art.png b/addons/tncsc_deployment/static/src/img/dashboard/gold_chariot_art.png
new file mode 100644
index 0000000..f5e5d9c
Binary files /dev/null and b/addons/tncsc_deployment/static/src/img/dashboard/gold_chariot_art.png differ
diff --git a/addons/tncsc_deployment/static/src/img/dashboard/gold_chariot_original_gold.png b/addons/tncsc_deployment/static/src/img/dashboard/gold_chariot_original_gold.png
new file mode 100644
index 0000000..50c01cd
Binary files /dev/null and b/addons/tncsc_deployment/static/src/img/dashboard/gold_chariot_original_gold.png differ
diff --git a/addons/tncsc_deployment/static/src/img/dashboard/gold_chariot_preview_ivory.jpg b/addons/tncsc_deployment/static/src/img/dashboard/gold_chariot_preview_ivory.jpg
new file mode 100644
index 0000000..eab54ca
Binary files /dev/null and b/addons/tncsc_deployment/static/src/img/dashboard/gold_chariot_preview_ivory.jpg differ
diff --git a/addons/tncsc_deployment/static/src/js/community_dashboard.js b/addons/tncsc_deployment/static/src/js/community_dashboard.js
index efbbe21..3c202e6 100644
--- a/addons/tncsc_deployment/static/src/js/community_dashboard.js
+++ b/addons/tncsc_deployment/static/src/js/community_dashboard.js
@@ -10,6 +10,7 @@ export class CommunityDashboard extends Component {
setup() {
this.actionService = useService("action");
+ this.menuService = useService("menu");
this.notification = useService("notification");
this.state = useState({
loading: true,
@@ -127,19 +128,39 @@ export class CommunityDashboard extends Component {
}
}
+ syncMenu(menuXmlId) {
+ if (!this.menuService || !menuXmlId) return;
+ try {
+ const menu = this.menuService.getAll().find((m) => m.xmlid === menuXmlId);
+ if (menu) {
+ const targetAppId = menu.appID || menu.id;
+ const currentApp = this.menuService.getCurrentApp();
+ if (targetAppId && (!currentApp || currentApp.id !== targetAppId)) {
+ this.menuService.setCurrentMenu(targetAppId);
+ }
+ }
+ } catch (e) {
+ console.warn("Failed to sync menu from dashboard:", e);
+ }
+ }
+
openMembers() {
+ this.syncMenu("community_membership.menu_membership_root");
this.actionService.doAction("community_membership.action_membership_members");
}
openTiers() {
+ this.syncMenu("community_membership.menu_membership_root");
this.actionService.doAction("community_membership.action_membership_tier");
}
openEvents() {
+ this.syncMenu("event.event_main_menu");
this.actionService.doAction("event.action_event_view");
}
openEvent(eventId) {
+ this.syncMenu("event.event_main_menu");
if (!eventId) {
this.openEvents();
return;
@@ -154,42 +175,52 @@ export class CommunityDashboard extends Component {
}
openSchool() {
+ this.syncMenu("community_school.menu_school_root");
this.actionService.doAction("community_school.action_school_student");
}
openSchoolClasses() {
+ this.syncMenu("community_school.menu_school_root");
this.actionService.doAction("community_school.action_school_class");
}
openBenefits() {
+ this.syncMenu("community_benefits.menu_benefits_root");
this.actionService.doAction("community_benefits.action_benefit");
}
openClassifieds() {
+ this.syncMenu("community_classifieds.menu_classifieds_root");
this.actionService.doAction("community_classifieds.action_classified_moderation");
}
openMarketplace() {
+ this.syncMenu("community_classifieds.menu_classifieds_root");
this.actionService.doAction("community_classifieds.action_classified_moderation");
}
openCulturalPrograms() {
+ this.syncMenu("event.event_main_menu");
this.actionService.doAction("event.action_event_view");
}
openReports() {
+ this.syncMenu("event.event_main_menu");
this.actionService.doAction("event.event_registration_action");
}
openSettings() {
+ this.syncMenu("base.menu_administration");
this.actionService.doAction("base.action_res_users");
}
openInterac() {
+ this.syncMenu("community_interac.menu_interac_root");
this.actionService.doAction("community_interac.action_payment_transaction_interac_pending");
}
openNewEvent() {
+ this.syncMenu("event.event_main_menu");
this.actionService.doAction({
type: "ir.actions.act_window",
res_model: "event.event",
@@ -199,6 +230,7 @@ export class CommunityDashboard extends Component {
}
openNewMember() {
+ this.syncMenu("community_membership.menu_membership_root");
this.actionService.doAction({
type: "ir.actions.act_window",
res_model: "res.partner",
@@ -209,6 +241,7 @@ export class CommunityDashboard extends Component {
}
openNewStudent() {
+ this.syncMenu("community_school.menu_school_root");
this.actionService.doAction({
type: "ir.actions.act_window",
res_model: "community.school.student",
diff --git a/addons/tncsc_deployment/static/src/js/global_sidebar.js b/addons/tncsc_deployment/static/src/js/global_sidebar.js
index 58a5715..5934ec7 100644
--- a/addons/tncsc_deployment/static/src/js/global_sidebar.js
+++ b/addons/tncsc_deployment/static/src/js/global_sidebar.js
@@ -10,6 +10,7 @@ export class TncscGlobalSidebar extends Component {
setup() {
this.actionService = useService("action");
+ this.menuService = useService("menu");
this.state = useState({
activeTab: "dashboard",
collapsed: false,
@@ -31,6 +32,97 @@ export class TncscGlobalSidebar extends Component {
});
}
+ syncNavbarMenu(action, activeTab) {
+ if (!this.menuService) {
+ return;
+ }
+ try {
+ const allMenus = this.menuService.getAll();
+ if (!allMenus || !allMenus.length) {
+ return;
+ }
+
+ let targetMenu = null;
+ const actionId = action?.id;
+
+ // 1. Try finding menu by actionID
+ if (actionId) {
+ targetMenu = allMenus.find((m) => m.actionID === actionId);
+ }
+
+ // 2. Try finding menu by action.xml_id or action.path
+ if (!targetMenu && action?.xml_id) {
+ targetMenu = allMenus.find((m) => m.xmlid === action.xml_id);
+ }
+
+ // 3. Try finding dashboard
+ if (!targetMenu && (action?.tag === "tncsc_community_dashboard" || action?.path === "community-dashboard" || activeTab === "dashboard")) {
+ targetMenu = allMenus.find((m) => m.xmlid === "tncsc_deployment.menu_community_dashboard_root");
+ }
+
+ // 4. Try finding menu by activeTab root mapping
+ if (!targetMenu && activeTab) {
+ const tabXmlMap = {
+ dashboard: "tncsc_deployment.menu_community_dashboard_root",
+ members: "community_membership.menu_membership_root",
+ events: "event.event_main_menu",
+ cultural: "event.event_main_menu",
+ school: "community_school.menu_school_root",
+ benefits: "community_benefits.menu_benefits_root",
+ classifieds: "community_classifieds.menu_classifieds_root",
+ reports: "event.event_main_menu",
+ settings: "base.menu_administration",
+ };
+ const xmlId = tabXmlMap[activeTab];
+ if (xmlId) {
+ targetMenu = allMenus.find((m) => m.xmlid === xmlId);
+ }
+ }
+
+ // 5. Fallback by name
+ if (!targetMenu && activeTab) {
+ const tabNames = {
+ dashboard: ["Community Dashboard"],
+ members: ["Membership"],
+ events: ["Events"],
+ cultural: ["Events"],
+ school: ["School", "Tamil School"],
+ benefits: ["Benefits", "Classifieds"],
+ reports: ["Events"],
+ settings: ["Settings"],
+ };
+ const names = tabNames[activeTab] || [];
+ targetMenu = allMenus.find((m) => names.includes(m.name) && (m.appID === m.id || !m.parent_id));
+ }
+
+ if (targetMenu) {
+ const targetAppId = targetMenu.appID || targetMenu.id;
+ const currentApp = this.menuService.getCurrentApp();
+ if (targetAppId && (!currentApp || currentApp.id !== targetAppId)) {
+ this.menuService.setCurrentMenu(targetAppId);
+ }
+ }
+ } catch (err) {
+ console.warn("Failed to sync navbar menu:", err);
+ }
+ }
+
+ syncNavbarMenuByXmlId(xmlId) {
+ if (!this.menuService || !xmlId) return;
+ try {
+ const menu = this.menuService.getAll().find((m) => m.xmlid === xmlId);
+ if (menu) {
+ const targetAppId = menu.appID || menu.id;
+ const currentApp = this.menuService.getCurrentApp();
+ if (targetAppId && (!currentApp || currentApp.id !== targetAppId)) {
+ this.menuService.setCurrentMenu(targetAppId);
+ }
+ }
+ } catch (err) {
+ console.warn("Failed to sync navbar menu by xmlId:", err);
+ }
+ }
+
updateActiveTab() {
try {
const currentController = this.actionService.currentController;
@@ -96,49 +188,56 @@ export class TncscGlobalSidebar extends Component {
) {
this.state.activeTab = "settings";
}
+
+ this.syncNavbarMenu(action, this.state.activeTab);
} catch {
// fallback
}
}
+ async navigateTo(tab, actionXmlId, menuXmlId) {
+ this.state.activeTab = tab;
+ if (menuXmlId) {
+ this.syncNavbarMenuByXmlId(menuXmlId);
+ }
+ await this.actionService.doAction(actionXmlId, {
+ clearBreadcrumbs: true,
+ onActionReady: () => {
+ this.updateActiveTab();
+ },
+ });
+ }
+
openDashboard() {
- this.state.activeTab = "dashboard";
- this.actionService.doAction("tncsc_deployment.action_community_dashboard", { clearBreadcrumbs: true });
+ this.navigateTo("dashboard", "tncsc_deployment.action_community_dashboard", "tncsc_deployment.menu_community_dashboard_root");
}
openMembers() {
- this.state.activeTab = "members";
- this.actionService.doAction("community_membership.action_membership_members", { clearBreadcrumbs: true });
+ this.navigateTo("members", "community_membership.action_membership_members", "community_membership.menu_membership_root");
}
openEvents() {
- this.state.activeTab = "events";
- this.actionService.doAction("event.action_event_view", { clearBreadcrumbs: true });
+ this.navigateTo("events", "event.action_event_view", "event.event_main_menu");
}
openSchool() {
- this.state.activeTab = "school";
- this.actionService.doAction("community_school.action_school_student", { clearBreadcrumbs: true });
+ this.navigateTo("school", "community_school.action_school_student", "community_school.menu_school_root");
}
openBenefits() {
- this.state.activeTab = "benefits";
- this.actionService.doAction("community_benefits.action_benefit", { clearBreadcrumbs: true });
+ this.navigateTo("benefits", "community_benefits.action_benefit", "community_benefits.menu_benefits_root");
}
openCulturalPrograms() {
- this.state.activeTab = "cultural";
- this.actionService.doAction("event.action_event_view", { clearBreadcrumbs: true });
+ this.navigateTo("cultural", "event.action_event_view", "event.event_main_menu");
}
openReports() {
- this.state.activeTab = "reports";
- this.actionService.doAction("event.event_registration_action", { clearBreadcrumbs: true });
+ this.navigateTo("reports", "event.event_registration_action", "event.event_main_menu");
}
openSettings() {
- this.state.activeTab = "settings";
- this.actionService.doAction("base.action_res_users", { clearBreadcrumbs: true });
+ this.navigateTo("settings", "base.action_res_users", "base.menu_administration");
}
toggleCollapse() {
diff --git a/addons/tncsc_deployment/static/src/scss/community_dashboard.scss b/addons/tncsc_deployment/static/src/scss/community_dashboard.scss
index ce8ab45..22798f0 100644
--- a/addons/tncsc_deployment/static/src/scss/community_dashboard.scss
+++ b/addons/tncsc_deployment/static/src/scss/community_dashboard.scss
@@ -104,11 +104,17 @@
justify-content: center !important;
.o_chariot_img {
- width: 135px !important;
+ width: 130px !important;
+ max-width: 100% !important;
height: auto !important;
- filter: drop-shadow(0 4px 14px rgba(216, 156, 67, 0.25)) !important;
- mix-blend-mode: multiply !important;
- opacity: 0.85 !important;
+ filter: drop-shadow(0 4px 12px rgba(148, 96, 21, 0.22)) !important;
+ opacity: 0.95 !important;
+ transition: transform 0.3s ease, filter 0.3s ease !important;
+
+ &:hover {
+ transform: scale(1.04) !important;
+ filter: drop-shadow(0 6px 18px rgba(216, 156, 67, 0.35)) !important;
+ }
}
}
@@ -176,13 +182,16 @@
border-bottom: 1px solid rgba(216, 156, 67, 0.22) !important;
}
-// When on the community dashboard itself:
+// When on the community dashboard itself, keep the top main navbar visible with the apps grid icon:
body:has(.o_tncsc_dashboard_root) {
.o_main_navbar {
- display: none !important;
+ display: flex !important;
+ background: #FFFCF7 !important;
+ border-bottom: 1px solid rgba(216, 156, 67, 0.22) !important;
}
.o_action_manager {
- height: 100vh !important;
+ height: calc(100vh - var(--NavBar-height, 46px)) !important;
+ max-height: calc(100vh - var(--NavBar-height, 46px)) !important;
overflow: hidden !important;
padding: 0 !important;
margin: 0 !important;
@@ -193,7 +202,8 @@ body:has(.o_tncsc_dashboard_root) {
margin: 0 !important;
overflow: hidden !important;
background: #F7F5F0 !important;
- height: 100vh !important;
+ height: 100% !important;
+ max-height: calc(100vh - var(--NavBar-height, 46px)) !important;
}
.o_control_panel {
display: none !important;
@@ -202,8 +212,8 @@ body:has(.o_tncsc_dashboard_root) {
.o_tncsc_dashboard_root {
width: 100% !important;
- height: 100vh !important;
- max-height: 100vh !important;
+ height: calc(100vh - var(--NavBar-height, 46px)) !important;
+ max-height: calc(100vh - var(--NavBar-height, 46px)) !important;
background: #F7F5F0 !important;
color: #243247 !important;
color-scheme: light;
@@ -222,7 +232,7 @@ body:has(.o_tncsc_dashboard_root) {
background: #F7F5F0 !important;
overflow-y: auto !important;
height: 100% !important;
- min-height: 100vh !important;
+ min-height: 0 !important;
width: 100% !important;
// Custom scrollbar
diff --git a/addons/tncsc_deployment/static/src/scss/event_kanban.scss b/addons/tncsc_deployment/static/src/scss/event_kanban.scss
index cc3797c..a45150f 100644
--- a/addons/tncsc_deployment/static/src/scss/event_kanban.scss
+++ b/addons/tncsc_deployment/static/src/scss/event_kanban.scss
@@ -245,240 +245,286 @@ body:has(.o_event_kanban_view) {
// ============================================================================
// 6. Tamil Cultural Event Card
// ============================================================================
+// ============================================================================
+// 6. Tamil Cultural Event Card (Upgraded with Prominent Cover Banner)
+// ============================================================================
.o_event_kanban_view .o_kanban_record {
background: #FFFFFF !important;
- border: 1px solid rgba(216, 156, 67, 0.2) !important;
+ border: 1px solid rgba(216, 156, 67, 0.22) !important;
border-radius: 16px !important;
box-shadow: 0 4px 18px rgba(36, 50, 71, 0.08) !important;
overflow: hidden !important;
- padding: 18px 20px 22px 20px !important;
+ padding: 0 !important; // Edge-to-edge cover banner!
display: flex !important;
flex-direction: column !important;
- min-height: 520px !important;
+ min-height: 420px !important; // Balanced height, eliminates huge white void
width: 100% !important;
position: relative !important;
color: #243247 !important;
- transition: transform 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease !important;
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.25s ease, box-shadow 0.25s ease !important;
+ cursor: pointer !important;
&:hover {
- transform: translateY(-4px) !important;
+ transform: translateY(-5px) !important;
border-color: $tncsc-gold !important;
- box-shadow: 0 12px 28px rgba(36, 50, 71, 0.12), 0 0 16px rgba(216, 156, 67, 0.2) !important;
+ box-shadow: 0 14px 32px rgba(36, 50, 71, 0.12), 0 0 20px rgba(216, 156, 67, 0.22) !important;
+
+ .o_tncsc_card_cover_img {
+ transform: scale(1.06) !important;
+ }
+
+ .o_tncsc_card_title {
+ color: #946015 !important;
+ }
}
- // Bottom-Right Corner Artwork (Hidden in White Mode to avoid dark image box)
- .o_tncsc_mandala_corner {
- display: none !important;
- }
-
- // Top Header: Stage Pill Badge + Three Dots Button
- .o_tncsc_card_top {
- margin-bottom: 14px !important;
+ // 1. Cover Image Banner
+ .o_tncsc_card_banner {
position: relative !important;
- z-index: 2 !important;
+ width: 100% !important;
+ height: 180px !important; // Large, striking banner image!
+ overflow: hidden !important;
+ background: #0A1938 !important;
- .o_tncsc_stage_pill {
- font-size: 11.5px !important;
- font-weight: 600 !important;
- padding: 4px 14px !important;
- border-radius: 9999px !important;
- display: inline-flex !important;
- align-items: center !important;
- gap: 6px !important;
- text-transform: capitalize !important;
+ .o_tncsc_card_cover_img {
+ width: 100% !important;
+ height: 100% !important;
+ object-fit: cover !important;
+ transition: transform 0.45s cubic-bezier(0.4, 0, 0.2, 1) !important;
+ display: block !important;
+ }
- .o_dot {
- font-size: 8px;
- }
+ .o_tncsc_banner_overlay {
+ position: absolute !important;
+ inset: 0 !important;
+ background: linear-gradient(180deg, rgba(0,0,0,0.45) 0%, rgba(0,0,0,0.05) 50%, rgba(10,25,56,0.65) 100%) !important;
+ pointer-events: none !important;
+ }
- &.pill-new {
- background: #FEF3C7 !important;
- border: 1px solid #FDE68A !important;
- color: #92400E !important;
+ // Top Floating Row: Stage Pill on Left, Status Pill on Right
+ .o_tncsc_banner_top_row {
+ position: absolute !important;
+ top: 12px !important;
+ left: 12px !important;
+ right: 12px !important;
+ z-index: 3 !important;
+
+ .o_tncsc_stage_pill {
+ font-size: 11px !important;
font-weight: 700 !important;
- .o_dot { color: $tncsc-gold !important; }
- }
+ padding: 4px 12px !important;
+ border-radius: 9999px !important;
+ display: inline-flex !important;
+ align-items: center !important;
+ gap: 5px !important;
+ text-transform: capitalize !important;
+ box-shadow: 0 2px 8px rgba(0,0,0,0.25) !important;
+ backdrop-filter: blur(6px) !important;
+ -webkit-backdrop-filter: blur(6px) !important;
- &.pill-booked {
- background: #E0F2FE !important;
- border: 1px solid #BAE6FD !important;
- color: #0369A1 !important;
- .o_dot { color: #0284C7; }
- }
+ .o_dot {
+ font-size: 8px;
+ }
- &.pill-announced {
- background: #DCFCE7 !important;
- border: 1px solid #BBF7D0 !important;
- color: #15803D !important;
- .o_dot { color: #16A34A; }
- }
+ &.pill-new {
+ background: rgba(254, 243, 199, 0.94) !important;
+ border: 1px solid #FDE68A !important;
+ color: #92400E !important;
+ .o_dot { color: #D97706 !important; }
+ }
- &.pill-ended {
- background: #F3E8FF !important;
- border: 1px solid #E9D5FF !important;
- color: #7E22CE !important;
- .o_dot { color: #9333EA; }
- }
- }
+ &.pill-booked {
+ background: rgba(224, 242, 254, 0.94) !important;
+ border: 1px solid #BAE6FD !important;
+ color: #0369A1 !important;
+ .o_dot { color: #0284C7 !important; }
+ }
- .o_tncsc_card_dots {
- background: #F8FAFC !important;
- border: 1px solid #E2E8F0 !important;
- border-radius: 9999px !important;
- padding: 2px 10px !important;
- color: #64748B !important;
- font-size: 13px !important;
- letter-spacing: 1.5px !important;
- cursor: pointer !important;
- line-height: 1 !important;
+ &.pill-announced {
+ background: rgba(220, 252, 231, 0.94) !important;
+ border: 1px solid #BBF7D0 !important;
+ color: #15803D !important;
+ .o_dot { color: #16A34A !important; }
+ }
- &:hover {
- background: #EDF2F7 !important;
- color: #120735 !important;
- }
- }
- }
-
- // Date Box Row (for New stage)
- .o_tncsc_card_date_box_row {
- margin-bottom: 12px !important;
- position: relative !important;
- z-index: 2 !important;
-
- .o_tncsc_card_date_box {
- border: 1px solid #946015 !important;
- border-radius: 8px !important;
- padding: 6px 14px !important;
- text-align: center !important;
- background: #FFF0D6 !important;
- min-width: 68px !important;
-
- .o_day {
- font-size: 24px !important;
- font-weight: 800 !important;
- color: #243247 !important;
- line-height: 1 !important;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;
- }
-
- .o_month {
- font-size: 8.5px !important;
- font-weight: 700 !important;
- color: $tncsc-gold !important;
- letter-spacing: 1px !important;
- text-transform: uppercase !important;
- margin-top: 3px !important;
- }
- }
-
- .o_tncsc_card_time_col {
- color: #475569 !important;
- font-size: 12px !important;
- font-weight: 500 !important;
- line-height: 1.4 !important;
- }
- }
-
- // Central Circular Gold Outline Icon
- .o_tncsc_card_circle_icon {
- width: 52px !important;
- height: 52px !important;
- min-width: 52px !important;
- border: 1.5px solid $tncsc-gold !important;
- border-radius: 50% !important;
- display: flex !important;
- align-items: center !important;
- justify-content: center !important;
- margin: 16px auto 16px auto !important;
- background: #FFF0D6 !important;
- color: $tncsc-gold !important;
- position: relative !important;
- z-index: 2 !important;
- }
-
- // Event Title
- .o_tncsc_card_title {
- font-family: $tncsc-font-serif !important;
- font-size: 18.5px !important;
- font-weight: 700 !important;
- color: #243247 !important;
- line-height: 1.35 !important;
- margin-bottom: 8px !important;
- position: relative !important;
- z-index: 2 !important;
- }
-
- // Subtitle / Tagline
- .o_tncsc_card_subtitle {
- font-size: 12.5px !important;
- color: #596579 !important;
- margin-bottom: 12px !important;
- line-height: 1.4 !important;
- position: relative !important;
- z-index: 2 !important;
- }
-
- // Location
- .o_tncsc_card_location {
- font-size: 12.5px !important;
- color: #475569 !important;
- font-weight: 500 !important;
- margin-bottom: 8px !important;
- position: relative !important;
- z-index: 2 !important;
- }
-
- // Date & Time (for Cards 2, 3, 4)
- .o_tncsc_card_datetime {
- font-size: 12.5px !important;
- color: #475569 !important;
- font-weight: 500 !important;
- margin-bottom: 16px !important;
- position: relative !important;
- z-index: 2 !important;
- }
-
- // Action Button at Bottom
- .o_tncsc_card_action {
- margin-top: auto !important;
- padding-top: 16px !important;
- position: relative !important;
- z-index: 2 !important;
-
- .o_tncsc_btn_details {
- width: fit-content !important;
- font-size: 13px !important;
- padding: 8px 26px !important;
- border-radius: 9999px !important;
- display: inline-flex !important;
- align-items: center !important;
- gap: 6px !important;
- transition: all 0.2s ease !important;
-
- &.btn-primary-gold {
- background: linear-gradient(135deg, #F59E0B, #B45309) !important;
- color: #000000 !important;
- font-weight: 700 !important;
- border: none !important;
- box-shadow: 0 4px 14px rgba(245, 158, 11, 0.35) !important;
-
- &:hover {
- transform: translateY(-1px);
- box-shadow: 0 6px 18px rgba(245, 158, 11, 0.5) !important;
+ &.pill-ended {
+ background: rgba(243, 232, 255, 0.94) !important;
+ border: 1px solid #E9D5FF !important;
+ color: #7E22CE !important;
+ .o_dot { color: #9333EA !important; }
}
}
- &.btn-outline-gold {
- background: rgba(36, 50, 71, 0.05) !important;
- border: 1.5px solid $tncsc-gold !important;
- color: #243247 !important;
- font-weight: 600 !important;
+ .o_tncsc_kanban_status_pill {
+ font-size: 10.5px !important;
+ font-weight: 700 !important;
+ padding: 4px 11px !important;
+ border-radius: 9999px !important;
+ display: inline-flex !important;
+ align-items: center !important;
+ gap: 5px !important;
+ text-transform: uppercase !important;
+ letter-spacing: 0.4px !important;
+ box-shadow: 0 2px 8px rgba(0,0,0,0.25) !important;
+
+ &.status-open {
+ background: rgba(16, 185, 129, 0.95) !important;
+ color: #ffffff !important;
+ border: 1px solid rgba(255, 255, 255, 0.35) !important;
+ }
+
+ &.status-closed {
+ background: rgba(220, 38, 38, 0.92) !important;
+ color: #ffffff !important;
+ border: 1px solid rgba(255, 255, 255, 0.3) !important;
+ }
+
+ &.status-soldout {
+ background: rgba(217, 119, 6, 0.94) !important;
+ color: #ffffff !important;
+ border: 1px solid rgba(255, 255, 255, 0.3) !important;
+ }
+
+ .status-pulse-dot {
+ width: 6.5px;
+ height: 6.5px;
+ border-radius: 50%;
+ background-color: #ffffff;
+ display: inline-block;
+ }
+ }
+ }
+
+ // Floating Bottom-Left Date Badge
+ .o_tncsc_banner_date_badge {
+ position: absolute !important;
+ bottom: 10px !important;
+ left: 12px !important;
+ background: #ffffff !important;
+ border-radius: 8px !important;
+ padding: 4px 9px !important;
+ text-align: center !important;
+ box-shadow: 0 4px 12px rgba(0,0,0,0.22) !important;
+ border: 1px solid rgba(216, 156, 67, 0.35) !important;
+ line-height: 1 !important;
+ z-index: 3 !important;
+
+ .date-month {
+ font-size: 8.5px !important;
+ font-weight: 800 !important;
+ color: #946015 !important;
+ text-transform: uppercase !important;
+ letter-spacing: 0.5px !important;
+ display: block !important;
+ margin-bottom: 2px !important;
+ }
+
+ .date-day {
+ font-size: 16px !important;
+ font-weight: 800 !important;
+ color: #0A1938 !important;
+ display: block !important;
+ }
+ }
+
+ // Floating Bottom-Right Time Pill
+ .o_tncsc_banner_time_pill {
+ position: absolute !important;
+ bottom: 10px !important;
+ right: 12px !important;
+ background: rgba(10, 25, 56, 0.8) !important;
+ color: #ffffff !important;
+ border: 1px solid rgba(255, 255, 255, 0.25) !important;
+ border-radius: 6px !important;
+ padding: 3px 8px !important;
+ font-size: 11px !important;
+ font-weight: 600 !important;
+ backdrop-filter: blur(6px) !important;
+ -webkit-backdrop-filter: blur(6px) !important;
+ display: inline-flex !important;
+ align-items: center !important;
+ z-index: 3 !important;
+ }
+ }
+
+ // 2. Card Body Content
+ .o_tncsc_card_body {
+ padding: 16px 18px 16px 18px !important;
+ display: flex !important;
+ flex-direction: column !important;
+ flex-grow: 1 !important;
+ position: relative !important;
+ z-index: 2 !important;
+
+ .o_tncsc_card_title {
+ font-family: $tncsc-font-serif !important;
+ font-size: 17px !important;
+ font-weight: 700 !important;
+ color: #0A1938 !important;
+ line-height: 1.35 !important;
+ margin-bottom: 4px !important;
+ display: -webkit-box !important;
+ -webkit-line-clamp: 2 !important;
+ -webkit-box-orient: vertical !important;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+ min-height: 44px !important;
+ transition: color 0.2s ease !important;
+ }
+
+ .o_tncsc_card_subtitle {
+ font-size: 12px !important;
+ color: #596579 !important;
+ margin-bottom: 10px !important;
+ line-height: 1.4 !important;
+ white-space: nowrap !important;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+
+ &.text-muted-sub {
+ color: #8A97A8 !important;
+ font-style: italic !important;
+ }
+ }
+
+ .o_tncsc_card_meta {
+ font-size: 12.5px !important;
+ color: #475569 !important;
+
+ .o_tncsc_meta_row {
+ display: flex !important;
+ align-items: center !important;
+ gap: 7px !important;
+ line-height: 1.4 !important;
+
+ svg {
+ flex-shrink: 0 !important;
+ }
+ }
+ }
+
+ .o_tncsc_card_footer {
+ margin-top: auto !important;
+ padding-top: 12px !important;
+ border-top: 1px solid #F1F5F9 !important;
+
+ .o_tncsc_btn_details {
+ font-size: 12px !important;
+ font-weight: 700 !important;
+ padding: 6px 18px !important;
+ border-radius: 9999px !important;
+ background: linear-gradient(135deg, #F59E0B, #B45309) !important;
+ color: #000000 !important;
+ border: none !important;
+ box-shadow: 0 2px 10px rgba(245, 158, 11, 0.3) !important;
+ transition: all 0.2s ease !important;
+ display: inline-flex !important;
+ align-items: center !important;
+ gap: 5px !important;
&:hover {
- background: rgba(216, 156, 67, 0.15) !important;
- border-color: $tncsc-gold-hover !important;
- color: $tncsc-gold-hover !important;
- transform: translateY(-1px);
+ transform: translateY(-1px) !important;
+ box-shadow: 0 4px 14px rgba(245, 158, 11, 0.45) !important;
}
}
}
diff --git a/addons/tncsc_deployment/static/src/xml/global_sidebar.xml b/addons/tncsc_deployment/static/src/xml/global_sidebar.xml
index b1b81f4..a78a629 100644
--- a/addons/tncsc_deployment/static/src/xml/global_sidebar.xml
+++ b/addons/tncsc_deployment/static/src/xml/global_sidebar.xml
@@ -52,7 +52,7 @@