add tncsc_deployment module with custom dark theme event kanban styling and assets
Some checks failed
CI / Brand-leak check (push) Has been cancelled
CI / flake8 / pylint-odoo / manifest completeness (push) Has been cancelled
CI / Install all modules with --test-enable (push) Has been cancelled

This commit is contained in:
Alaguraj0361 2026-09-26 00:37:11 +05:30
parent 3aead51697
commit 56dd9f5596
15 changed files with 1034 additions and 5 deletions

View File

@ -45,8 +45,15 @@ that applies to the community_* product modules.
'data/events_data.xml', 'data/events_data.xml',
'data/ir_cron.xml', 'data/ir_cron.xml',
'views/website_pages.xml', 'views/website_pages.xml',
'views/event_kanban_views.xml',
], ],
'demo': [], 'demo': [],
'assets': {
'web.assets_backend': [
'tncsc_deployment/static/src/scss/event_kanban.scss',
'tncsc_deployment/static/src/xml/kanban_empty_column.xml',
],
},
'application': False, 'application': False,
'installable': True, 'installable': True,
'post_init_hook': 'post_init_hook', 'post_init_hook': 'post_init_hook',

View File

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="0"> <odoo noupdate="0">
<!-- Real upcoming event, matching what's live on tncsc.com/events (2026-08-20). <!-- Venues -->
Update/replace once TNCSC confirms the venue address. -->
<record id="partner_summer_picnic_venue" model="res.partner"> <record id="partner_summer_picnic_venue" model="res.partner">
<field name="name">Mississauga, Ontario</field> <field name="name">Mississauga, Ontario</field>
<field name="city">Mississauga</field> <field name="city">Mississauga</field>
@ -9,11 +8,71 @@
<field name="country_id" ref="base.ca"/> <field name="country_id" ref="base.ca"/>
<field name="type">other</field> <field name="type">other</field>
</record> </record>
<record id="partner_diwali_venue" model="res.partner">
<field name="name">Toronto, ON</field>
<field name="city">Toronto</field>
<field name="state_id" ref="base.state_ca_on"/>
<field name="country_id" ref="base.ca"/>
<field name="type">other</field>
</record>
<record id="partner_tamil_new_year_venue" model="res.partner">
<field name="name">Scarborough, ON</field>
<field name="city">Scarborough</field>
<field name="state_id" ref="base.state_ca_on"/>
<field name="country_id" ref="base.ca"/>
<field name="type">other</field>
</record>
<record id="partner_pongal_venue" model="res.partner">
<field name="name">Brampton, ON</field>
<field name="city">Brampton</field>
<field name="state_id" ref="base.state_ca_on"/>
<field name="country_id" ref="base.ca"/>
<field name="type">other</field>
</record>
<!-- 1. TNCSC's Summer Picnic 2026 (New) -->
<record id="event_summer_picnic_2026" model="event.event"> <record id="event_summer_picnic_2026" model="event.event">
<field name="name">TNCSC's Summer Picnic 2026</field> <field name="name">TNCSC's Summer Picnic 2026</field>
<field name="stage_id" ref="event.event_stage_new"/>
<field name="date_begin" eval="'2026-10-11 14:00:00'"/> <field name="date_begin" eval="'2026-10-11 14:00:00'"/>
<field name="date_end" eval="'2026-10-11 20:00:00'"/> <field name="date_end" eval="'2026-10-12 14:00:00'"/>
<field name="address_id" ref="partner_summer_picnic_venue"/> <field name="address_id" ref="partner_summer_picnic_venue"/>
<field name="website_published">True</field> <field name="website_published">True</field>
</record> </record>
<!-- 2. Diwali Celebration (Booked) -->
<record id="event_diwali_celebration_2026" model="event.event">
<field name="name">Diwali Celebration</field>
<field name="stage_id" ref="event.event_stage_booked"/>
<field name="subtitle">A festival of lights and togetherness.</field>
<field name="date_begin" eval="'2026-11-05 12:30:00'"/>
<field name="date_end" eval="'2026-11-05 16:30:00'"/>
<field name="address_id" ref="partner_diwali_venue"/>
<field name="website_published">True</field>
</record>
<!-- 3. Tamil New Year Festival (Announced) -->
<record id="event_tamil_new_year_2026" model="event.event">
<field name="name">Tamil New Year Festival</field>
<field name="stage_id" ref="event.event_stage_announced"/>
<field name="subtitle">Culture | Food | Performances</field>
<field name="date_begin" eval="'2026-04-14 11:30:00'"/>
<field name="date_end" eval="'2026-04-14 15:30:00'"/>
<field name="address_id" ref="partner_tamil_new_year_venue"/>
<field name="website_published">True</field>
</record>
<!-- 4. Pongal Celebration (Ended) -->
<record id="event_pongal_celebration_2026" model="event.event">
<field name="name">Pongal Celebration</field>
<field name="stage_id" ref="event.event_stage_done"/>
<field name="subtitle">Tradition | Unity | Community</field>
<field name="date_begin" eval="'2026-01-18 04:30:00'"/>
<field name="date_end" eval="'2026-01-18 09:30:00'"/>
<field name="address_id" ref="partner_pongal_venue"/>
<field name="website_published">True</field>
</record>
</odoo> </odoo>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 745 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -0,0 +1,759 @@
// ============================================================================
// TNCSC Tamil Luxury Brand Palette & Dark Theme Tokens
// ============================================================================
$tncsc-bg-midnight: #0A051B;
$tncsc-bg-header: #0D0722;
$tncsc-bg-card-top: #170C3D;
$tncsc-bg-card-bot: #0A041B;
$tncsc-gold: #D4A359;
$tncsc-gold-bright: #E5A93C;
$tncsc-gold-border: rgba(200, 147, 58, 0.38);
$tncsc-text-white: #FFFFFF;
$tncsc-text-muted: #9CA3AF;
$tncsc-text-lavender: #C4BEEA;
$tncsc-font-serif: 'Playfair Display', Georgia, 'Times New Roman', serif;
// ============================================================================
// 1. Overall Dark Background & Hide Unwanted Panels
// ============================================================================
body:has(.o_event_kanban_view),
.o_action_manager:has(.o_event_kanban_view),
.o_content:has(.o_event_kanban_view) {
background-color: $tncsc-bg-midnight !important;
}
// Sleek dark scrollbar
body:has(.o_event_kanban_view) {
&::-webkit-scrollbar,
*::-webkit-scrollbar {
width: 7px !important;
height: 7px !important;
}
&::-webkit-scrollbar-track,
*::-webkit-scrollbar-track {
background: #0A051B !important;
}
&::-webkit-scrollbar-thumb,
*::-webkit-scrollbar-thumb {
background: rgba(200, 147, 58, 0.35) !important;
border-radius: 4px !important;
}
&::-webkit-scrollbar-thumb:hover,
*::-webkit-scrollbar-thumb:hover {
background: rgba(200, 147, 58, 0.65) !important;
}
}
// Ensure the Search Panel on the left is completely hidden so Kanban view takes 100% full width
body:has(.o_event_kanban_view) {
.o_search_panel,
.o_content > .o_search_panel {
display: none !important;
width: 0 !important;
min-width: 0 !important;
max-width: 0 !important;
padding: 0 !important;
margin: 0 !important;
border: none !important;
overflow: hidden !important;
pointer-events: none !important;
}
.o_kanban_view.o_event_kanban_view {
width: 100% !important;
flex-grow: 1 !important;
margin: 0 !important;
}
}
// ============================================================================
// 2. Top Main Navbar (Deep Dark Midnight with Gold Accents)
// ============================================================================
.o_main_navbar {
background-color: #070314 !important;
border-bottom: 1px solid rgba(200, 147, 58, 0.2) !important;
color: #FFFFFF !important;
.o_menu_brand {
color: #FFFFFF !important;
font-weight: 600 !important;
letter-spacing: 0.2px;
}
.o_nav_entry,
.o_menu_sections > a,
.o_menu_sections .dropdown-toggle {
color: $tncsc-text-lavender !important;
font-weight: 500 !important;
padding-top: 10px !important;
padding-bottom: 10px !important;
border-bottom: 2.5px solid transparent !important;
transition: all 0.2s ease !important;
&:hover {
color: #FFFFFF !important;
background: transparent !important;
}
&.active,
&:focus {
color: #FFFFFF !important;
background: transparent !important;
border-bottom: 2.5px solid $tncsc-gold !important;
}
}
.o_navbar_apps_menu .dropdown-toggle {
color: $tncsc-text-lavender !important;
&:hover { color: #FFFFFF !important; }
}
.o_user_avatar {
border-radius: 50% !important;
border: 1.5px solid $tncsc-gold !important;
}
.o_notification_counter {
background-color: $tncsc-gold-bright !important;
color: #0A051B !important;
font-weight: 800 !important;
}
}
// ============================================================================
// 3. Control Panel Header (Golden Lotus + Tamil Overline + Centered Pill Search)
// ============================================================================
.o_view_controller:has(.o_event_kanban_view),
body:has(.o_event_kanban_view) {
.o_control_panel {
background-color: $tncsc-bg-header !important;
border-bottom: 1px solid rgba(255, 255, 255, 0.06) !important;
padding: 16px 36px 14px 36px !important;
display: flex !important;
flex-direction: row !important;
align-items: center !important;
justify-content: space-between !important;
flex-wrap: nowrap !important;
width: 100% !important;
gap: 20px !important;
.o_control_panel_main {
display: flex !important;
align-items: center !important;
justify-content: space-between !important;
flex-wrap: nowrap !important;
flex-grow: 1 !important;
width: 100% !important;
gap: 20px !important;
}
.o_control_panel_breadcrumbs {
display: contents !important;
}
// 1. Left Title Block: Golden Lotus + Brand Overline + Serif Title + Subtitle
.o_breadcrumb {
order: 1 !important;
display: flex !important;
align-items: center !important;
gap: 16px !important;
margin: 0 !important;
padding: 0 !important;
min-width: 360px !important;
flex-shrink: 0 !important;
overflow: visible !important;
white-space: nowrap !important;
// Golden Lotus Emblem
&::before {
content: '' !important;
display: inline-block !important;
width: 48px !important;
height: 42px !important;
min-width: 48px !important;
background: url('/tncsc_deployment/static/src/img/gold_lotus_logo.png') no-repeat center / contain !important;
mask: none !important;
-webkit-mask: none !important;
flex-shrink: 0 !important;
}
.o_last_breadcrumb_item,
.breadcrumb-item.active {
font-family: $tncsc-font-serif !important;
font-size: 32px !important;
font-weight: 700 !important;
color: #FFFFFF !important;
position: relative !important;
display: flex !important;
flex-direction: column !important;
align-items: flex-start !important;
line-height: 1.15 !important;
overflow: visible !important;
white-space: nowrap !important;
text-overflow: clip !important;
// TAMIL NADU CULTURAL SOCIETY OF CANADA overline
&::before {
content: 'TAMIL NADU CULTURAL SOCIETY OF CANADA' !important;
display: block !important;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;
font-size: 10.5px !important;
font-weight: 700 !important;
letter-spacing: 2px !important;
color: $tncsc-gold !important;
text-transform: uppercase !important;
margin-bottom: 5px !important;
white-space: nowrap !important;
}
> span {
font-family: $tncsc-font-serif !important;
font-size: 32px !important;
font-weight: 700 !important;
color: #FFFFFF !important;
white-space: nowrap !important;
}
// Subtitle
&::after {
content: 'Create, manage and track your events' !important;
display: block !important;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;
font-size: 12.5px !important;
font-weight: 400 !important;
color: $tncsc-text-muted !important;
margin-top: 4px !important;
letter-spacing: 0 !important;
white-space: nowrap !important;
}
}
}
.o_control_panel_breadcrumbs_actions {
display: none !important;
}
// 2. Centered Unified Dark Pill Search Bar
.o_control_panel_actions,
.o_cp_searchview {
order: 2 !important;
flex-grow: 1 !important;
max-width: 480px !important;
margin: 0 auto !important;
.o_searchview {
border-top-left-radius: 9999px !important;
border-bottom-left-radius: 9999px !important;
border: 1px solid rgba(255, 255, 255, 0.15) !important;
border-right: none !important;
background: rgba(255, 255, 255, 0.05) !important;
padding: 6px 18px !important;
box-shadow: none !important;
display: flex !important;
align-items: center !important;
position: relative !important;
// Gold magnifying glass icon
&::before {
content: '' !important;
display: inline-block !important;
width: 15px !important;
height: 15px !important;
min-width: 15px !important;
margin-right: 10px !important;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23D4A359' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E") no-repeat center / contain !important;
}
// Custom placeholder: "Search events..."
&::after {
content: 'Search events...';
position: absolute;
left: 44px;
color: rgba(255, 255, 255, 0.45);
font-size: 13.5px;
pointer-events: none;
}
&:focus-within::after,
&:has(.o_searchview_input:not(:placeholder-shown))::after,
&:has(.o_searchview_facet)::after {
display: none !important;
}
.o_searchview_input {
font-size: 13.5px !important;
color: #FFFFFF !important;
background: transparent !important;
border: none !important;
&::placeholder {
color: transparent !important;
}
}
.o_searchview_icon {
display: none !important;
}
}
.o_searchview_dropdown_toggler {
border-top-right-radius: 9999px !important;
border-bottom-right-radius: 9999px !important;
border: 1px solid rgba(255, 255, 255, 0.15) !important;
border-left: none !important;
background: rgba(255, 255, 255, 0.05) !important;
color: $tncsc-text-muted !important;
padding-right: 16px !important;
}
&:focus-within {
.o_searchview,
.o_searchview_dropdown_toggler {
border-color: $tncsc-gold !important;
}
}
}
// 3. Right: + New Pill Button (Warm Gold / Amber)
.o_control_panel_main_buttons,
.o_cp_buttons {
order: 3 !important;
margin-left: auto !important;
button,
button.o-kanban-button-new,
button.btn-primary {
background: $tncsc-gold-bright !important;
color: #0A051B !important;
border-radius: 9999px !important;
border: none !important;
padding: 8px 24px !important;
font-weight: 700 !important;
font-size: 14px !important;
box-shadow: 0 4px 14px rgba(229, 169, 60, 0.35) !important;
display: inline-flex !important;
align-items: center !important;
gap: 6px !important;
transition: all 0.2s ease !important;
white-space: nowrap !important;
&::before {
content: '+';
color: #0A051B;
font-weight: 800;
font-size: 18px;
line-height: 1;
}
&:hover {
background: lighten($tncsc-gold-bright, 5%) !important;
transform: translateY(-1px);
box-shadow: 0 6px 18px rgba(229, 169, 60, 0.5) !important;
}
}
}
// 4. View Switchers: Warm Gold for Active Kanban
.o_control_panel_navigation,
.o_cp_navigation {
order: 4 !important;
display: flex !important;
align-items: center !important;
gap: 12px !important;
margin-left: 12px !important;
flex-shrink: 0 !important;
.o_search_options {
display: none !important;
}
.o_cp_switch_buttons {
border-radius: 8px !important;
border: 1px solid rgba(255, 255, 255, 0.12) !important;
padding: 3px !important;
background: rgba(255, 255, 255, 0.06) !important;
display: inline-flex !important;
gap: 3px !important;
button {
border-radius: 6px !important;
border: none !important;
color: $tncsc-text-muted !important;
padding: 6px 10px !important;
background: transparent !important;
transition: all 0.15s ease !important;
&.active,
&.o_kanban.active {
background-color: $tncsc-gold-bright !important;
color: #0A051B !important;
}
&:hover:not(.active) {
background-color: rgba(255, 255, 255, 0.1) !important;
color: #FFFFFF !important;
}
}
}
}
}
}
// ============================================================================
// 4. Kanban View Canvas & Top-Right Mandala Watermark
// ============================================================================
.o_kanban_view.o_event_kanban_view,
.o_event_kanban_view .o_kanban_renderer {
background-color: $tncsc-bg-midnight !important;
background-image: url('/tncsc_deployment/static/src/img/gold_mandala_top.png') !important;
background-repeat: no-repeat !important;
background-position: top 0 right 0 !important;
background-size: 190px auto !important;
padding: 20px 36px 40px 36px !important;
width: 100% !important;
display: flex !important;
flex-direction: row !important;
flex-wrap: wrap !important;
gap: 20px !important;
// Filter pills bar spans full width across top
.o_tncsc_filter_pills_bar {
flex-basis: 100% !important;
width: 100% !important;
margin-bottom: 24px !important;
}
// Hide any folded column unfold button
.o_kanban_group.o_column_folded,
button.o_column_unfold,
.o_kanban_unfold_button,
button:has(.fa-caret-right) {
display: none !important;
}
// Hide stage header (title is inside card badge)
.o_kanban_header {
display: none !important;
}
// Transparent 4 Stage Columns side-by-side
.o_kanban_group {
background: transparent !important;
border: none !important;
box-shadow: none !important;
border-radius: 0 !important;
padding: 0 !important;
margin: 0 !important;
flex: 1 1 calc(25% - 20px) !important;
min-width: 270px !important;
max-width: calc(25% - 15px) !important;
}
}
// Fallback for ungrouped mode
.o_event_kanban_view .o_kanban_ungrouped {
.o_kanban_record {
flex: 1 1 calc(25% - 20px) !important;
min-width: 270px !important;
max-width: calc(25% - 15px) !important;
margin: 0 !important;
}
}
// ============================================================================
// 5. Filter Pills Bar (All, New, Booked, Announced, Ended)
// ============================================================================
.o_tncsc_filter_pills_bar {
width: 100% !important;
display: flex !important;
align-items: center !important;
gap: 14px !important;
margin-bottom: 24px !important;
.o_tncsc_filter_pill {
padding: 7px 20px !important;
border-radius: 9999px !important;
font-size: 13px !important;
font-weight: 500 !important;
cursor: pointer;
transition: all 0.2s ease;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
color: #FFFFFF;
.o_dot {
font-size: 11px;
margin-right: 2px;
}
.o_count {
color: $tncsc-text-muted;
font-size: 12.5px;
margin-left: 14px;
}
&.active {
background: $tncsc-gold !important;
color: #0A051B !important;
border-color: $tncsc-gold !important;
font-weight: 700 !important;
.o_dot { color: #0A051B !important; }
.o_count { color: #0A051B !important; font-weight: 700; }
}
&.pill-new .dot-gold { color: $tncsc-gold-bright; }
&.pill-booked .dot-cyan { color: #38BDF8; }
&.pill-announced .dot-green { color: #4ADE80; }
&.pill-ended .dot-purple { color: #C084FC; }
&:hover:not(.active) {
background: rgba(255, 255, 255, 0.1) !important;
border-color: rgba(255, 255, 255, 0.22) !important;
}
}
}
// ============================================================================
// 6. Tamil Luxury Dark Event Card
// ============================================================================
.o_event_kanban_view .o_kanban_record {
background: radial-gradient(circle at 50% 0%, #170C3D 0%, #0A041B 100%) !important;
border: 1px solid $tncsc-gold-border !important;
border-radius: 16px !important;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5) !important;
overflow: hidden !important;
padding: 18px 20px 22px 20px !important;
display: flex !important;
flex-direction: column !important;
min-height: 520px !important;
width: 100% !important;
position: relative !important;
transition: transform 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease !important;
&:hover {
transform: translateY(-4px) !important;
border-color: $tncsc-gold !important;
box-shadow: 0 14px 38px rgba(0, 0, 0, 0.65), 0 0 20px rgba(212, 163, 89, 0.25) !important;
}
// Bottom-Right Golden Mandala Corner Artwork
.o_tncsc_mandala_corner {
position: absolute !important;
bottom: 0 !important;
right: 0 !important;
width: 85px !important;
height: 85px !important;
background: url('/tncsc_deployment/static/src/img/gold_mandala_corner.png') no-repeat bottom right / contain !important;
pointer-events: none !important;
opacity: 0.8 !important;
z-index: 1 !important;
}
// Top Header: Stage Pill Badge + Three Dots Button
.o_tncsc_card_top {
margin-bottom: 14px !important;
position: relative !important;
z-index: 2 !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_dot {
font-size: 8px;
}
&.pill-new {
background: $tncsc-gold-bright !important;
color: #0A051B !important;
font-weight: 700 !important;
.o_dot { display: none !important; }
}
&.pill-booked {
background: rgba(56, 189, 248, 0.15) !important;
border: 1px solid rgba(56, 189, 248, 0.35) !important;
color: #FFFFFF !important;
.o_dot { color: #38BDF8; }
}
&.pill-announced {
background: rgba(74, 222, 128, 0.15) !important;
border: 1px solid rgba(74, 222, 128, 0.35) !important;
color: #FFFFFF !important;
.o_dot { color: #4ADE80; }
}
&.pill-ended {
background: rgba(192, 132, 252, 0.15) !important;
border: 1px solid rgba(192, 132, 252, 0.35) !important;
color: #FFFFFF !important;
.o_dot { color: #C084FC; }
}
}
.o_tncsc_card_dots {
background: rgba(255, 255, 255, 0.05) !important;
border: 1px solid rgba(255, 255, 255, 0.15) !important;
border-radius: 9999px !important;
padding: 2px 10px !important;
color: $tncsc-text-muted !important;
font-size: 13px !important;
letter-spacing: 1.5px !important;
cursor: pointer !important;
line-height: 1 !important;
}
}
// Date Box Row (Card 1 / 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 rgba(200, 147, 58, 0.45) !important;
border-radius: 8px !important;
padding: 6px 14px !important;
text-align: center !important;
background: rgba(255, 255, 255, 0.02) !important;
min-width: 68px !important;
.o_day {
font-size: 24px !important;
font-weight: 800 !important;
color: #FFFFFF !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: $tncsc-text-lavender !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: rgba(212, 163, 89, 0.05) !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: #FFFFFF !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: $tncsc-text-muted !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: $tncsc-text-lavender !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: $tncsc-text-lavender !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: $tncsc-gold-bright !important;
color: #0A051B !important;
font-weight: 700 !important;
border: none !important;
box-shadow: 0 4px 14px rgba(229, 169, 60, 0.3) !important;
&:hover {
background: lighten($tncsc-gold-bright, 5%) !important;
transform: translateY(-1px);
box-shadow: 0 6px 18px rgba(229, 169, 60, 0.45) !important;
}
}
&.btn-outline-gold {
background: rgba(255, 255, 255, 0.02) !important;
border: 1.5px solid $tncsc-gold !important;
color: $tncsc-gold !important;
font-weight: 600 !important;
&:hover {
background: rgba(212, 163, 89, 0.12) !important;
border-color: $tncsc-gold-bright !important;
color: $tncsc-gold-bright !important;
transform: translateY(-1px);
}
}
}
}
}

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<!-- Filter Pills Bar above Kanban Groups -->
<t t-inherit="web.KanbanRenderer" t-inherit-mode="extension">
<xpath expr="//t[@t-foreach='getGroupsOrRecords()']" position="before">
<t t-if="props.list and props.list.resModel === 'event.event'">
<div class="o_tncsc_filter_pills_bar d-flex align-items-center gap-3 w-100 flex-wrap">
<div class="o_tncsc_filter_pill active d-flex align-items-center justify-content-between">
<span class="d-flex align-items-center gap-2">
<span class="o_dot">&#9679;</span>
<span class="o_label">All</span>
</span>
<span class="o_count ms-3">4</span>
</div>
<div class="o_tncsc_filter_pill pill-new d-flex align-items-center justify-content-between">
<span class="d-flex align-items-center gap-2">
<span class="o_dot dot-gold">&#9679;</span>
<span class="o_label">New</span>
</span>
<span class="o_count ms-3">1</span>
</div>
<div class="o_tncsc_filter_pill pill-booked d-flex align-items-center justify-content-between">
<span class="d-flex align-items-center gap-2">
<span class="o_dot dot-cyan">&#9679;</span>
<span class="o_label">Booked</span>
</span>
<span class="o_count ms-3">0</span>
</div>
<div class="o_tncsc_filter_pill pill-announced d-flex align-items-center justify-content-between">
<span class="d-flex align-items-center gap-2">
<span class="o_dot dot-green">&#9679;</span>
<span class="o_label">Anounced</span>
</span>
<span class="o_count ms-3">0</span>
</div>
<div class="o_tncsc_filter_pill pill-ended d-flex align-items-center justify-content-between">
<span class="d-flex align-items-center gap-2">
<span class="o_dot dot-purple">&#9679;</span>
<span class="o_label">Ended</span>
</span>
<span class="o_count ms-3">0</span>
</div>
</div>
</t>
</xpath>
</t>
</templates>

View File

@ -0,0 +1,158 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- TNCSC Events Kanban View Upgrade -->
<record id="view_event_kanban_tncsc" model="ir.ui.view">
<field name="name">event.event.kanban.tncsc</field>
<field name="model">event.event</field>
<field name="inherit_id" ref="event.view_event_kanban"/>
<field name="priority">60</field>
<field name="arch" type="xml">
<xpath expr="//kanban" position="attributes">
<attribute name="class" add="o_tncsc_event_kanban" separator=" "/>
<attribute name="default_group_by">stage_id</attribute>
</xpath>
<!-- Add subtitle field for card rendering -->
<xpath expr="//field[@name='date_end']" position="after">
<field name="subtitle"/>
</xpath>
<!-- Remove default aside date bar -->
<xpath expr="//aside" position="replace"/>
<!-- Replace standard main content with Tamil Luxury Dark Theme Card while keeping <main> tag -->
<xpath expr="//main" position="replace">
<main class="p-0 o_tncsc_dark_card w-100">
<!-- Bottom-right subtle mandala corner artwork -->
<div class="o_tncsc_mandala_corner"/>
<!-- Top Header Row: Stage Pill Badge on left, Three Dots on right -->
<div class="o_tncsc_card_top d-flex align-items-center justify-content-between">
<span t-attf-class="o_tncsc_stage_pill pill-{{ (record.stage_id.value or '').toLowerCase() }}">
<span class="o_dot">&#9679;</span>
<t t-esc="record.stage_id.value"/>
</span>
<div class="o_tncsc_card_dots">
<span>&#8226;&#8226;&#8226;</span>
</div>
</div>
<!-- Date Box row (Only for Summer Picnic / New stage) -->
<t t-if="record.stage_id.value === 'New'">
<div class="o_tncsc_card_date_box_row d-flex align-items-center gap-3">
<div class="o_tncsc_card_date_box">
<div class="o_day"><t t-esc="luxon.DateTime.fromISO(record.date_begin.raw_value).toFormat('d')"/></div>
<div class="o_month"><t t-esc="luxon.DateTime.fromISO(record.date_begin.raw_value).toFormat('MMM yyyy')"/></div>
</div>
<div class="d-flex flex-column gap-1 o_tncsc_card_time_col">
<div class="o_time d-flex align-items-center">
<svg class="o_tncsc_clock_svg me-1" viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="#D4A359" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<polyline points="12 6 12 12 16 14"/>
</svg>
<t t-esc="luxon.DateTime.fromISO(record.date_begin.raw_value).toFormat('t')"/>
</div>
<div t-if="record.date_begin.raw_value !== record.date_end.raw_value" class="o_end_date d-flex align-items-center">
<svg class="o_tncsc_cal_svg me-1" viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="#D4A359" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="4" width="18" height="18" rx="2" ry="2"/>
<line x1="16" y1="2" x2="16" y2="6"/>
<line x1="8" y1="2" x2="8" y2="6"/>
<line x1="3" y1="10" x2="21" y2="10"/>
</svg>
<t t-esc="luxon.DateTime.fromISO(record.date_end.raw_value).toFormat('d MMM')"/>
</div>
</div>
</div>
</t>
<!-- Central Circular Gold Icon -->
<div class="o_tncsc_card_circle_icon">
<!-- Calendar icon for New and Booked -->
<svg t-if="record.stage_id.value === 'New' or record.stage_id.value === 'Booked'" viewBox="0 0 24 24" width="24" height="24" stroke="#D4A359" stroke-width="1.8" fill="none" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="4" width="18" height="18" rx="2" ry="2"/>
<line x1="16" y1="2" x2="16" y2="6"/>
<line x1="8" y1="2" x2="8" y2="6"/>
<line x1="3" y1="10" x2="21" y2="10"/>
</svg>
<!-- Megaphone icon for Announced -->
<svg t-elif="record.stage_id.value === 'Announced'" viewBox="0 0 24 24" width="24" height="24" stroke="#D4A359" stroke-width="1.8" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path d="M3 11l18-5v12L3 13v-2z"/>
<path d="M11.6 16.8a3 3 0 1 1-5.8-1.6"/>
</svg>
<!-- Checkmark circle icon for Ended -->
<svg t-elif="record.stage_id.value === 'Ended'" viewBox="0 0 24 24" width="24" height="24" stroke="#D4A359" stroke-width="1.8" fill="none" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="9"/>
<polyline points="8 12 11 15 16 9"/>
</svg>
<!-- Default fallback -->
<svg t-else="" viewBox="0 0 24 24" width="24" height="24" stroke="#D4A359" stroke-width="1.8" fill="none" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="4" width="18" height="18" rx="2" ry="2"/>
<line x1="16" y1="2" x2="16" y2="6"/>
<line x1="8" y1="2" x2="8" y2="6"/>
<line x1="3" y1="10" x2="21" y2="10"/>
</svg>
</div>
<!-- Event Title -->
<div class="o_tncsc_card_title text-center">
<field name="name"/>
</div>
<!-- Subtitle / Tagline -->
<div t-if="record.subtitle.value" class="o_tncsc_card_subtitle text-center">
<field name="subtitle"/>
</div>
<!-- Location -->
<div class="o_tncsc_card_location d-flex align-items-center justify-content-center gap-1">
<svg class="o_tncsc_pin_svg me-1" viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="#D4A359" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/>
<circle cx="12" cy="10" r="3"/>
</svg>
<field t-if="record.address_id.value" name="address_id"/>
<span t-else="">Online Event</span>
</div>
<!-- Date & Time (for Booked, Announced, Ended) -->
<div t-if="record.stage_id.value !== 'New'" class="o_tncsc_card_datetime d-flex align-items-center justify-content-center gap-1">
<svg class="o_tncsc_cal_svg me-1" viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="#D4A359" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="4" width="18" height="18" rx="2" ry="2"/>
<line x1="16" y1="2" x2="16" y2="6"/>
<line x1="8" y1="2" x2="8" y2="6"/>
<line x1="3" y1="10" x2="21" y2="10"/>
</svg>
<span>
<t t-esc="luxon.DateTime.fromISO(record.date_begin.raw_value).toFormat('d MMM yyyy')"/> &#8226; <t t-esc="luxon.DateTime.fromISO(record.date_begin.raw_value).toFormat('t')"/>
</span>
</div>
<!-- Action Button: View Details -->
<div class="o_tncsc_card_action text-center">
<button t-attf-class="o_tncsc_btn_details {{ record.stage_id.value === 'New' ? 'btn-primary-gold' : 'btn-outline-gold' }}">
View Details &#8594;
</button>
</div>
</main>
</xpath>
</field>
</record>
<!-- Keep Ended stage unfolded -->
<record id="event.event_stage_done" model="event.stage">
<field name="fold" eval="False"/>
</record>
<!-- Ensure default group by stage for the main Events action and clear upcoming filter -->
<record id="event.action_event_view" model="ir.actions.act_window">
<field name="context">{'default_group_by': 'stage_id', 'search_default_stage_id': 1, 'search_default_upcoming': 0}</field>
</record>
<!-- Load Google Fonts Playfair Display cleanly in web.layout -->
<template id="tncsc_assets_fonts" inherit_id="web.layout">
<xpath expr="//head" position="inside">
<link rel="preconnect" href="https://fonts.googleapis.com"/>
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="crossorigin"/>
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,500;0,600;0,700;0,800;1,600&amp;display=swap" rel="stylesheet"/>
</xpath>
</template>
</odoo>

View File

@ -1,5 +1,5 @@
[options] [options]
admin_passwd = $pbkdf2-sha512$600000$DCFk7J0TorRWCqE0Roix9g$Z2h01In5EA3aw7HI02qKceM2Cy/Wjf19CQA7Qp3Hg8N2FCpShR3d2q9OEDkW/O56SC2vH9e.1Lb9LXIErWhbhQ admin_passwd = $pbkdf2-sha512$600000$K.X8/x.DMGbsfQ8BIESo9Q$S3CHyKM64coFtnIApyOxIdawroFfLu8AZPzJQyl.t5EXpWcm5MVJMY5lglMN9NN4Oab6yRsqb8MICRztOH9n0g
db_host = db db_host = db
db_port = 5432 db_port = 5432
db_user = odoo db_user = odoo
@ -11,4 +11,3 @@ proxy_mode = False
logfile = logfile =
log_level = info log_level = info
db_name = sri_tncsc