|
|
há 2 meses atrás | |
|---|---|---|
| .. | ||
| controllers | há 2 meses atrás | |
| data | há 2 meses atrás | |
| models | há 2 meses atrás | |
| static | há 2 meses atrás | |
| views | há 2 meses atrás | |
| .gitignore | há 2 meses atrás | |
| README.md | há 2 meses atrás | |
| __init__.py | há 2 meses atrás | |
| __manifest__.py | há 2 meses atrás | |
Tema personalizado para Odoo 18 con estilo "Futurismo Cálido" - una combinación de diseño dark mode moderno con acentos vibrantes en naranja y magenta.
| Campo | Valor |
|---|---|
| Nombre técnico | theme_m22tc |
| Versión | 1.0.3 |
| Categoría | Theme/Corporate |
| Licencia | LGPL-3 |
| Compatibilidad | Odoo 18.0 |
| Dependencias | website, auth_signup |
El tema implementa un "Split Theme" (Tema Dividido) con Glassmorphism aplicado consistentemente:
| Variable | Color | Hex | Uso |
|---|---|---|---|
o-color-1 |
🟠 Naranja M22 | #FF7C00 |
Acento primario, CTAs, links |
o-color-2 |
🩷 Magenta | #E0407B |
Acento secundario, gradientes |
o-color-3 |
🌑 Midnight Blue | #0F111A |
Fondo sidebar (dark mode) |
o-color-4 |
⚪ Soft Gray | #F8F8F8 |
Fondo contenido principal (light mode) |
o-color-5 |
⬜ Blanco | #FFFFFF |
Textos sobre fondo oscuro, reportes |
Efecto glassmorphism aplicado en diferentes intensidades:
// Dark Glassmorphism (Sidebar)
background: rgba(#0F111A, 0.95);
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.08);
// Light Glassmorphism (Contenido)
background: rgba(#FFFFFF, 0.75);
backdrop-filter: blur(12px);
border: 1px solid rgba(0, 0, 0, 0.08);
/* Gradiente primario (botones, logos) */
background: linear-gradient(90deg, #FF6B00, #E1467C);
/* Gradiente para fondos */
background-image:
radial-gradient(ellipse 80% 50% at 10% 10%, rgba(255, 107, 0, 0.15), transparent),
radial-gradient(ellipse 80% 50% at 90% 90%, rgba(225, 70, 124, 0.15), transparent);
theme_m22tc/
├── __init__.py
├── __manifest__.py
├── README.md
│
├── data/
│ ├── generate_primary_template.xml # Template generator para snippets
│ ├── ir_asset.xml # Registro de assets (SCSS, JS)
│ └── menu_data.xml # Datos de menú
│
├── controllers/
│ ├── __init__.py
│ └── helpdesk_portal.py # Extensiones del portal de helpdesk (dashboard, aprobación)
│
├── models/
│ ├── __init__.py
│ ├── theme_m22tc.py # Modelo principal del tema
│ └── website_menu.py # Extensiones al menú del website
│
├── static/
│ └── src/
│ ├── js/
│ │ ├── m22_sidebar.js # Widget sidebar interactivo
│ │ └── m22_bottom_sheet.js # Widget bottom sheet móvil (iOS style)
│ │
│ └── scss/
│ ├── primary_variables.scss # Variables de diseño (colores, fuentes)
│ ├── bootstrap_overridden.scss # Overrides de Bootstrap
│ └── m22tc_styles.scss # Estilos personalizados
│
└── views/
├── customizations.xml # Personalizaciones generales (Tailwind, login enforcement)
├── frontend_layout.xml # Layout para usuarios autenticados + sidebar M22
├── login_custom.xml # Login, Signup, Reset Password
├── portal_sidebar.xml # Cleanup de vistas legacy (sin overrides)
├── snippets.xml # Snippets personalizados (Bento Grid)
├── website_menu_view.xml # Vistas de menú
├── helpdesk_dashboard.xml # Template del dashboard de tickets
└── helpdesk_portal_approval.xml # Template de botones de aprobación/rechazo
inherit_id y xpathLos assets se registran en data/ir_asset.xml usando theme.ir.asset (no ir.asset) para que solo se apliquen cuando el tema está activo:
| Asset | Bundle | Descripción |
|---|---|---|
primary_variables.scss |
web._assets_primary_variables |
Variables de diseño (colores claros para reportes) |
bootstrap_overridden.scss |
web._assets_frontend_helpers |
Overrides Bootstrap (colores base claros) |
m22tc_styles.scss |
web.assets_frontend |
Estilos personalizados (Split Theme + Glassmorphism) |
m22_sidebar.js |
web.assets_frontend |
Widget del sidebar interactivo |
m22_bottom_sheet.js |
web.assets_frontend |
Widget del bottom sheet móvil (iOS style) |
El tema incluye estilos generalizados para elementos nativos de Odoo:
Soporte completo para todos los badges de Bootstrap con buen contraste:
.badge-primary, .text-bg-primary - Naranja M22.badge-secondary, .text-bg-secondary - Gris.badge-success, .text-bg-success - Verde.badge-warning, .text-bg-warning - Amarillo.badge-danger, .text-bg-danger - Rojo.badge-info, .text-bg-info - Cyan.badge-light, .text-bg-light, .bg-200 - Gris claro con texto oscuro (crítico para helpdesk)Estilos para elementos de navegación en sidebars nativos de Odoo:
.nav.flex-column .nav-link - Links de navegación vertical[role="complementary"] .nav-link - Sidebars complementarios.navspy, .bs-sidenav - Navegación scroll-spy#ticket-nav, #ticket-links - Sidebar específico de helpdesk.btn-light - Texto oscuro visible sobre fondo claro.btn-primary - Gradiente M22 con texto blanco.btn-outline-primary - Borde naranja, fondo transparenteEl tema incluye páginas de autenticación completamente personalizadas con estilo glassmorphism:
views/login_custom.xml)| Template | Hereda de | Descripción |
|---|---|---|
m22_tailwind_config |
web.layout |
Configuración Tailwind + estilos globales |
m22_login_layout_override |
website.login_layout |
Layout contenedor |
m22_login_form_override |
web.login |
Formulario de login |
m22_signup_form_override |
auth_signup.signup |
Formulario de registro |
m22_reset_password_override |
auth_signup.reset_password |
Formulario reset password |
request.website.image_url)signup_enabled)reset_password_enabled)/web/login - Iniciar sesión/web/signup - Crear cuenta/web/reset_password - Restablecer contraseñaEl tema incluye un sidebar personalizado para usuarios autenticados con inicialización temprana para prevenir flash visual:
<head> previene flash visual al cargarposition: absoluteEl sidebar usa un sistema de inicialización temprana para evitar efectos visuales desagradables:
Script inline en <head> (views/frontend_layout.xml):
localStorage antes del renderm22-sidebar-collapsed-init al <html> si está colapsadoCSS de inicialización (m22tc_styles.scss):
html.m22-sidebar-collapsed-init: Aplica estado colapsado sin transicionesposition: relative y flex-shrink: 0position: absolute y left: -9999px (sin layout shift)::after para evitar rotación visibleJavaScript sincronizado (m22_sidebar.js):
.m22-sidebar /* Contenedor del sidebar */
.m22-sidebar-collapsed /* Estado colapsado */
.m22-sidebar-mobile /* Versión mobile */
.o_has_m22_sidebar /* Clase en body cuando hay sidebar */
.o_main_with_sidebar /* Main content con offset */
html.m22-sidebar-collapsed-init /* Estado inicial colapsado (sin transiciones) */
html.m22-sidebar-initialized /* Sidebar inicializado (transiciones habilitadas) */
El tema incluye una navegación inferior móvil (bottom navigation) con un bottom sheet estilo iOS para mostrar opciones adicionales:
/my/accountd-lg-none)Modal que se desliza desde la parte inferior mostrando opciones adicionales del menú:
Muestra los items adicionales del menú (desde el 4to en adelante):
Archivos relacionados:
views/frontend_layout.xml: Estructura HTML del bottom nav y bottom sheetstatic/src/js/m22_bottom_sheet.js: Lógica JavaScript con widgets de Odoostatic/src/scss/m22tc_styles.scss: Estilos de integración con el temaWidgets JavaScript:
M22BottomSheet: Widget principal que gestiona el bottom sheetM22BottomSheetTrigger: Widget del botón "Más" que abre el sheetOrden de elementos en bottom nav:
.m22-bottom-nav /* Barra de navegación inferior móvil */
.bottom-nav-item /* Item individual de la barra */
#m22_bottom_sheet /* Contenedor del bottom sheet */
.m22-bottom-sheet-container /* Contenedor principal con backdrop */
.m22-bottom-sheet-backdrop /* Fondo oscuro difuminado */
.m22-bottom-sheet-content /* Contenido del sheet (scrolleable) */
.m22-sheet-item /* Item individual dentro del sheet */
Problema: Los filtros del portal de Odoo (portal_searchbar) usan clases de Bootstrap (.collapse, .navbar-collapse) que dependen del JavaScript de Bootstrap para expandirse/colapsarse. Cuando Tailwind reemplaza Bootstrap, estos elementos permanecen colapsados por defecto.
Solución: El tema incluye CSS con alta especificidad en m22tc_styles.scss que fuerza la visualización de los filtros en desktop:
.o_portal_wrap nav.o_portal_navbar {
@media (min-width: 992px) {
.collapse, .navbar-collapse, #o_portal_navbar_content {
display: flex !important;
visibility: visible !important;
height: auto !important;
}
}
}
Resultado: Los controles "Ordenar por", "Filtrar por", "Agrupar por" y la búsqueda son siempre visibles en pantallas de escritorio (≥992px), manteniendo la funcionalidad completa del portal de Odoo.
El tema sigue una filosofía de no-interferencia con los templates nativos de Odoo:
El archivo portal_sidebar.xml solo contiene una función de cleanup de vistas legacy. Todos los ajustes visuales se manejan en m22tc_styles.scss.
s_m22_bento_grid)Grid asimétrico estilo "Bento Box" para mostrar servicios/features:
El tema configura automáticamente:
# Desde el directorio workspace/
source ../venv/bin/activate
python src/odoo/odoo-bin -c ../odoo.conf -d m22_techconsulting_dev -i theme_m22tc --stop-after-init
# Desde el directorio workspace/
source ../venv/bin/activate
python src/odoo/odoo-bin -c ../odoo.conf -d m22_techconsulting_dev -u theme_m22tc --stop-after-init
./odoo_dev.sh restart
./odoo_dev.sh restart
static/src/scss/python src/odoo/odoo-bin -c ../odoo.conf -u theme_m22tc --stop-after-init./odoo_dev.sh restartviews/Limpiar caché si es necesario:
# En Odoo shell
env.registry.clear_cache()
env['ir.qweb'].clear_caches()
static/src/scss/ o static/src/js/data/ir_asset.xmlTailwind CSS: La plataforma usa Tailwind CSS para reemplazar Bootstrap en toda la aplicación. El tema se carga vía CDN en customizations.xml y es compatible con los componentes nativos de Odoo mediante CSS con alta especificidad que asegura la funcionalidad de elementos que originalmente dependían de Bootstrap (como filtros colapsables).
Assets con theme.ir.asset: Todos los assets usan model="theme.ir.asset" en lugar de ir.asset para que solo se apliquen cuando el tema está activo. Odoo copia estos assets a ir.asset con website_id cuando se activa el tema.
Colores base claros: Las variables $body-bg y $body-color en bootstrap_overridden.scss y primary_variables.scss usan valores claros (blanco/gris oscuro) para compatibilidad con reportes HTML (facturas, órdenes) que requieren fondo blanco.
Especificidad CSS: Los estilos de inicialización usan #wrapwrap.o_has_m22_sidebar para igualar la especificidad de los estilos normales y evitar conflictos.
Prioridades de templates: Los overrides usan priority="100" o superior para asegurar que se apliquen después de otros módulos.
Variables condicionales: Las páginas de auth respetan las configuraciones de Odoo:
signup_enabled: Habilitado en Ajustes > Usuarios > Acceso de clientereset_password_enabled: Habilitado en Ajustes > Usuarios > Restablecer contraseñaLogo del sitio: El logo se obtiene de la configuración del Website (request.website.image_url), no de la compañía.
Prevención de layout shift: Los textos del sidebar usan position: absolute y left: -9999px para sacarlos del flujo sin causar movimiento de iconos durante la carga.
Bottom Sheet móvil: El bottom sheet usa Tailwind CSS vía CDN y está integrado con el sistema de estilos del tema. El botón "Más" siempre aparece al final de la navegación inferior, después del item "Cuenta".
Navegación móvil: La bottom navigation solo muestra los primeros 3 items principales del menú más "Cuenta" y "Más". Los items adicionales se muestran en el bottom sheet al tocar "Más".
Compatibilidad Tailwind + Bootstrap: El tema está diseñado para funcionar en plataformas donde Tailwind reemplaza Bootstrap. Los filtros del portal de Odoo (que originalmente usan clases .collapse de Bootstrap) se fuerzan a mostrarse en desktop mediante CSS con alta especificidad en m22tc_styles.scss. Esto asegura que los controles "Ordenar por", "Filtrar por", "Agrupar por" y la búsqueda siempre sean visibles en pantallas ≥992px.
Arquitectura no-invasiva: El tema NO reemplaza templates del portal de Odoo. La sidebar M22 es un componente adicional que se inyecta vía frontend_layout.xml. Los ajustes de layout se realizan exclusivamente con CSS, preservando toda la funcionalidad nativa de Odoo (filtros, breadcrumbs, paginación, etc.).
El tema incluye extensiones personalizadas para el módulo de Helpdesk que mejoran la experiencia del cliente en el portal:
/my/tickets-dashboard)Dashboard personalizado que muestra información clave para el cliente:
Tiempo Usado/Disponible
sale.order.line)sale_timesheet si está instaladoResumen de Tickets
Cumplimiento SLA
Tickets Esperando Respuesta
exclude_stage_ids)Tickets Recientes
/my/tickets)stage_id)Sistema de aprobación para tickets en etapas de espera del cliente:
helpdesk.sla.exclude_stage_ids)/my/ticket/<id>).o_portal_navbar: Buscador y controles de filtrado.dropdown-menu: Menús desplegables con estilos personalizados.form-control: Inputs con estilo glassmorphismArchivos relacionados:
controllers/helpdesk_portal.py: Lógica del dashboard y aprobaciónviews/helpdesk_dashboard.xml: Template del dashboardviews/helpdesk_portal_approval.xml: Template de botones de aprobaciónstatic/src/scss/m22tc_styles.scss: Estilos del dashboard y aprobaciónDependencias:
helpdesk: Módulo base de helpdesk de Odoo Enterprisehelpdesk_extras: Módulo custom con funcionalidades extendidas (colaboradores, SLAs)Rutas:
/my/tickets-dashboard: Dashboard personalizado/my/tickets: Lista de tickets (nativa, con agrupamiento por defecto)/my/ticket/<id>/<access_token>: Página de seguimiento (con banner de aprobación)/my/ticket/approve/<id>/<access_token>: Endpoint para aprobar ticket/my/ticket/reject/<id>/<access_token>: Endpoint para rechazar ticketNotas importantes:
ir.rule) de helpdesk_extras filtran automáticamente los tickets según el rol del usuario en cada equipoLGPL-3 - Ver archivo LICENSE para más detalles.
Desarrollado por: M22 Tech Consulting
Versión de Odoo: 18.0