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 @@
- Tamil Chariot + Tamil Chariot
Our Culture
diff --git a/addons/tncsc_deployment/views/event_kanban_views.xml b/addons/tncsc_deployment/views/event_kanban_views.xml index 7a3ca48..946664d 100644 --- a/addons/tncsc_deployment/views/event_kanban_views.xml +++ b/addons/tncsc_deployment/views/event_kanban_views.xml @@ -12,125 +12,164 @@ stage_id - + + + + + + + - + -
- -
+
+ +
+ + + Event Image + + + Event Image + + + Event Image + + + Event Image + + + Event Image + - -
- - ● - - -
- ••• + +
+ + +
+ + ● + + + + + + + Open + + + + + Sold Out + + + + + Closed + + +
+ + +
+ + +
+ + +
+ + + + +
- - -
-
-
-
+ +
+ +
+ +
+ + +
+ +
+
+ Tamil Nadu Cultural Society of Canada +
+ + +
+ +
+ + + + + + + Ontario, Canada +
-
-
- - - - - -
-
- - - - - - - -
+ + +
+ + + + + + + + + +
+ + +
+ + + + + + + Registered Attendees
- - -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
- - -
- -
- - -
- - - - - - Online Event -
- - -
- - - - - - - - • - -
- - -
- + +
diff --git a/addons/tncsc_deployment/views/event_views.xml b/addons/tncsc_deployment/views/event_views.xml new file mode 100644 index 0000000..4b97705 --- /dev/null +++ b/addons/tncsc_deployment/views/event_views.xml @@ -0,0 +1,28 @@ + + + + + event.event.form.inherit.image + event.event + + 20 + + + + + + + + + + event.event.list.inherit.image + event.event + + 20 + + + + + + + diff --git a/addons/tncsc_deployment/views/website_header_overrides.xml b/addons/tncsc_deployment/views/website_header_overrides.xml index 2dd980f..11bf243 100644 --- a/addons/tncsc_deployment/views/website_header_overrides.xml +++ b/addons/tncsc_deployment/views/website_header_overrides.xml @@ -930,6 +930,31 @@ Events

+ + +

+ + + Open for Registration + + + + + Sold Out + + + + + Live Now + + + + + Registrations Closed + + +
+
Home | diff --git a/addons/tncsc_deployment/views/website_pages.xml b/addons/tncsc_deployment/views/website_pages.xml index b717f47..f868e22 100644 --- a/addons/tncsc_deployment/views/website_pages.xml +++ b/addons/tncsc_deployment/views/website_pages.xml @@ -4944,23 +4944,338 @@ text-align: center; position: relative; } - .event-card { - background-color: #ffffff; - border-radius: 16px; - padding: 24px; - max-width: 320px; - transition: transform 0.25s ease, box-shadow 0.25s ease; + /* TNCSC Event Filter Bar */ + .tncsc-event-filter-bar { + display: flex; + align-items: center; + justify-content: center; + gap: 12px; + flex-wrap: wrap; + margin-bottom: 35px; } - .event-card:hover { - transform: translateY(-4px); - box-shadow: 0 12px 30px rgba(0,0,0,0.08); + .tncsc-filter-btn { + background: #ffffff; + color: #475569; + border: 1.5px solid #e2e8f0; + padding: 10px 22px; + border-radius: 30px; + font-weight: 600; + font-size: 0.95rem; + cursor: pointer; + transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); + display: inline-flex; + align-items: center; + gap: 8px; + box-shadow: 0 2px 8px rgba(0,0,0,0.04); } - .event-card-img { - width: 100%; - height: 280px; - object-fit: cover; + .tncsc-filter-btn:hover { + border-color: #D89C43; + color: #D89C43; + transform: translateY(-2px); + box-shadow: 0 6px 16px rgba(216, 156, 67, 0.15); + } + .tncsc-filter-btn.active { + background: linear-gradient(135deg, #120735 0%, #1e0d5a 100%); + color: #D89C43 !important; + border-color: #D89C43; + box-shadow: 0 6px 18px rgba(18, 7, 53, 0.25); + } + .tncsc-filter-btn .badge-count { + font-size: 0.75rem; + padding: 2px 8px; border-radius: 12px; - box-shadow: 0 6px 16px rgba(0,0,0,0.08); + background: #f1f5f9; + color: #475569; + transition: all 0.2s; + } + .tncsc-filter-btn.active .badge-count { + background: rgba(216, 156, 67, 0.25); + color: #ffffff; + } + + /* Luxury Event Cards */ + .tncsc-event-card { + background: #ffffff; + border-radius: 18px; + overflow: hidden; + border: 1px solid rgba(216, 156, 67, 0.18); + box-shadow: 0 10px 28px rgba(10, 25, 56, 0.06); + transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.3s ease; + display: flex; + flex-direction: column; + height: 100%; + position: relative; + } + .tncsc-event-card:hover { + transform: translateY(-7px); + box-shadow: 0 20px 42px rgba(18, 7, 53, 0.12), 0 0 24px rgba(216, 156, 67, 0.18); + border-color: #D89C43; + } + + /* Card Media and Image */ + .tncsc-card-media { + position: relative; + height: 230px; + overflow: hidden; + background: #0c1533; + } + .tncsc-card-img { + width: 100%; + height: 100%; + object-fit: cover; + transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1); + } + .tncsc-event-card:hover .tncsc-card-img { + transform: scale(1.06); + } + .tncsc-media-overlay { + position: absolute; + inset: 0; + background: linear-gradient(180deg, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0) 40%, rgba(10,25,56,0.65) 100%); + pointer-events: none; + } + + /* Status Badges */ + .tncsc-status-badge { + position: absolute; + top: 14px; + right: 14px; + padding: 6px 14px; + border-radius: 30px; + font-size: 0.78rem; + font-weight: 700; + letter-spacing: 0.4px; + text-transform: uppercase; + display: inline-flex; + align-items: center; + gap: 6px; + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + z-index: 3; + box-shadow: 0 4px 12px rgba(0,0,0,0.22); + } + .badge-status-open { + background: rgba(16, 185, 129, 0.94); + color: #ffffff; + border: 1px solid rgba(255, 255, 255, 0.4); + } + .badge-status-closed { + background: rgba(220, 38, 38, 0.92); + color: #ffffff; + border: 1px solid rgba(255, 255, 255, 0.35); + } + .badge-status-soldout { + background: rgba(217, 119, 6, 0.94); + color: #ffffff; + border: 1px solid rgba(255, 255, 255, 0.35); + } + .badge-status-live { + background: rgba(239, 68, 68, 0.96); + color: #ffffff; + border: 1px solid rgba(255, 255, 255, 0.4); + } + + @keyframes tncscPulseLive { + 0% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.8); } + 70% { transform: scale(1); box-shadow: 0 0 0 6px rgba(255, 255, 255, 0); } + 100% { transform: scale(0.95); box-shadow: 0 0 0 0 rgba(255, 255, 255, 0); } + } + .status-pulse-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background-color: #ffffff; + display: inline-block; + animation: tncscPulseLive 1.6s infinite; + } + + /* Category Pill */ + .tncsc-category-pill { + position: absolute; + top: 14px; + left: 14px; + background: rgba(18, 7, 53, 0.82); + color: #F8FAFC; + border: 1px solid rgba(216, 156, 67, 0.4); + padding: 5px 12px; + border-radius: 20px; + font-size: 0.75rem; + font-weight: 600; + backdrop-filter: blur(8px); + -webkit-backdrop-filter: blur(8px); + z-index: 3; + display: inline-flex; + align-items: center; + gap: 5px; + } + + /* Date Badge */ + .tncsc-card-date-badge { + position: absolute; + bottom: 12px; + left: 14px; + background: #ffffff; + border-radius: 10px; + padding: 6px 12px; + text-align: center; + box-shadow: 0 4px 14px rgba(0,0,0,0.18); + border: 1px solid rgba(216, 156, 67, 0.35); + line-height: 1; + z-index: 3; + } + .tncsc-card-date-badge .date-month { + font-size: 0.72rem; + font-weight: 800; + color: #D89C43; + text-transform: uppercase; + letter-spacing: 0.6px; + display: block; + margin-bottom: 2px; + } + .tncsc-card-date-badge .date-day { + font-size: 1.35rem; + font-weight: 800; + color: #0A1938; + display: block; + } + + /* Card Body Content */ + .tncsc-card-body { + padding: 22px 22px 18px 22px; + display: flex; + flex-direction: column; + flex-grow: 1; + } + .tncsc-card-title { + font-family: 'Playfair Display', Georgia, serif; + font-size: 1.25rem; + font-weight: 700; + color: #0A1938; + line-height: 1.35; + margin-bottom: 6px; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + min-height: 50px; + } + .tncsc-card-title a { + color: #0A1938; + text-decoration: none; + transition: color 0.2s ease; + } + .tncsc-card-title a:hover { + color: #D89C43; + } + .tncsc-card-subtitle { + color: #64748B; + font-size: 0.88rem; + font-weight: 500; + margin-bottom: 14px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .tncsc-card-meta { + display: flex; + flex-direction: column; + gap: 8px; + margin-bottom: 16px; + font-size: 0.88rem; + color: #475569; + } + .tncsc-meta-row { + display: flex; + align-items: center; + gap: 8px; + } + .tncsc-meta-row i { + width: 16px; + text-align: center; + color: #D89C43; + flex-shrink: 0; + } + + /* Status Notice Callout */ + .tncsc-status-notice { + border-radius: 8px; + padding: 8px 12px; + font-size: 0.82rem; + font-weight: 600; + display: flex; + align-items: center; + gap: 8px; + margin-top: auto; + margin-bottom: 16px; + } + .notice-open { + background-color: #f0fdf4; + color: #166534; + border: 1px solid #bbf7d0; + } + .notice-closed { + background-color: #fef2f2; + color: #991b1b; + border: 1px solid #fecaca; + } + .notice-soldout { + background-color: #fffbeb; + color: #92400e; + border: 1px solid #fde68a; + } + + /* Action CTA Buttons */ + .tncsc-card-footer { + padding-top: 14px; + border-top: 1px solid #f1f5f9; + } + .btn-tncsc-event-action { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + padding: 11px 18px; + border-radius: 8px; + font-weight: 600; + font-size: 0.92rem; + text-decoration: none !important; + transition: all 0.25s ease; + } + .btn-action-open { + background: linear-gradient(135deg, #D89C43 0%, #C48A35 100%); + color: #ffffff !important; + box-shadow: 0 4px 14px rgba(216, 156, 67, 0.35); + border: 1px solid #D89C43; + } + .btn-action-open:hover { + background: linear-gradient(135deg, #e5a93c 0%, #d89c43 100%); + box-shadow: 0 6px 20px rgba(216, 156, 67, 0.5); + transform: translateY(-2px); + color: #ffffff !important; + } + .btn-action-closed { + background: #f8fafc; + color: #475569 !important; + border: 1px solid #cbd5e1; + } + .btn-action-closed:hover { + background: #f1f5f9; + color: #0f172a !important; + border-color: #94a3b8; + transform: translateY(-2px); + } + .btn-action-soldout { + background: #fffbeb; + color: #b45309 !important; + border: 1px solid #fcd34d; + } + .btn-action-soldout:hover { + background: #fef3c7; + color: #92400e !important; + transform: translateY(-2px); + } + .tncsc-event-col { + transition: opacity 0.3s ease, transform 0.3s ease; } #footer:not(.tncsc-custom-footer), footer#bottom:not(.tncsc-custom-footer), @@ -5057,7 +5372,7 @@
- +
@@ -5098,7 +5413,7 @@
- +

Events

@@ -5112,32 +5427,182 @@
-
+
- -
+ + + +
+
+ தமிழ்நாடு கலாச்சார சங்கத்தின் நிகழ்வுகள் +
+

+ Upcoming & Heritage Celebrations +

+

+ Experience authentic Tamil culture, community feasts, traditional games, and festive celebrations across Ontario. +

+
+ + +
+ + + +
+ + +
-
-
-
- -
-

- -

-

- - + +

+
+ + +
+ + + + + + + + + + + + + + + + + +
+ + + +
+ Open +
+
+ +
+ Sold Out +
+
+ +
+ Live Now +
- Upcoming +
+ Closed +
-

-
- - Register Event - + + +
+ + +
+ + +
+
+
+
+
+ + +
+ +

+ + + +

+ + +

+

Tamil Nadu Cultural Society of Canada

+ + +
+
+ + +
+
+ + + + - + () + +
+
+ + + + + + + Online / Ontario, Canada + + +
+
+ + + +
+ + Registration open • Book tickets now +
+
+ +
+ + All available seats have been reserved +
+
+ +
+ + Event ended • Registration closed +
+
+ + + +
@@ -5149,6 +5614,15 @@
+ + +
@@ -5199,6 +5673,48 @@