// Fusion Central - Backend Styles // Copyright 2024-2025 Nexa Systems Inc. // License OPL-1 .o_fusion_central { // Settings page styling .fc-settings-section { margin-bottom: 20px; h5 { color: #0077b6; border-bottom: 2px solid #0077b6; padding-bottom: 5px; margin-bottom: 15px; } } // Status indicators .fc-status-created { color: #28a745; font-weight: 500; } .fc-status-pending { color: #ffc107; font-weight: 500; } } // ADP portion columns styling .o_list_view { .o_field_monetary.fc-adp-portion { color: #0077b6; font-weight: 500; } .o_field_monetary.fc-client-portion { color: #28a745; font-weight: 500; } } // ============================================================================= // STATUS BUTTONS: Theme-friendly (light + dark mode) // Uses Odoo CSS variables with safe fallbacks. // ============================================================================= // Good / confirmed / within period (green tint) .fc-btn-status-good { background-color: rgba(40, 167, 69, 0.12) !important; color: #1e7e34 !important; border: 1px solid rgba(40, 167, 69, 0.35) !important; &:hover, &:focus { background-color: rgba(40, 167, 69, 0.22) !important; color: #1e7e34 !important; border-color: rgba(40, 167, 69, 0.5) !important; } .fa { color: inherit !important; } } // Bad / not confirmed / overdue (red tint) .fc-btn-status-bad { background-color: rgba(220, 53, 69, 0.12) !important; color: #bd2130 !important; border: 1px solid rgba(220, 53, 69, 0.35) !important; &:hover, &:focus { background-color: rgba(220, 53, 69, 0.22) !important; color: #bd2130 !important; border-color: rgba(220, 53, 69, 0.5) !important; } .fa { color: inherit !important; } } // Dark mode overrides html.dark, .o_dark { .fc-btn-status-good { background-color: rgba(40, 167, 69, 0.18) !important; color: #6fcf87 !important; border-color: rgba(40, 167, 69, 0.4) !important; &:hover, &:focus { background-color: rgba(40, 167, 69, 0.28) !important; color: #6fcf87 !important; } } .fc-btn-status-bad { background-color: rgba(220, 53, 69, 0.18) !important; color: #f08a93 !important; border-color: rgba(220, 53, 69, 0.4) !important; &:hover, &:focus { background-color: rgba(220, 53, 69, 0.28) !important; color: #f08a93 !important; } } } // Also support Odoo's color-scheme media query for dark mode @media (prefers-color-scheme: dark) { .o_web_client:not(.o_light) { .fc-btn-status-good { background-color: rgba(40, 167, 69, 0.18) !important; color: #6fcf87 !important; border-color: rgba(40, 167, 69, 0.4) !important; &:hover, &:focus { background-color: rgba(40, 167, 69, 0.28) !important; color: #6fcf87 !important; } } .fc-btn-status-bad { background-color: rgba(220, 53, 69, 0.18) !important; color: #f08a93 !important; border-color: rgba(220, 53, 69, 0.4) !important; &:hover, &:focus { background-color: rgba(220, 53, 69, 0.28) !important; color: #f08a93 !important; } } } } // ============================================================================= // SALE ORDER LINE LIST: Column width control // Odoo 19 ignores the XML width attribute on list fields. // We use CSS on th[data-name] with table-layout:fixed to force widths. // Product column has NO explicit width so it absorbs all remaining space. // ============================================================================= .o_field_one2many[name="order_line"] .o_list_table { table-layout: fixed !important; width: 100% !important; // ---- Product column: gets ALL remaining space (no width set) ---- // Truncate long product names with ellipsis th[data-name="product_template_id"], td[name="product_template_id"], th[data-name="product_id"], td[name="product_id"] { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } // ---- Serial Number: generous width ---- th[data-name="x_fc_serial_number"] { width: 140px !important; } // ---- Quantity columns ---- th[data-name="product_uom_qty"] { width: 55px !important; } th[data-name="qty_delivered"] { width: 55px !important; } th[data-name="qty_invoiced"] { width: 55px !important; } // ---- UoM ---- th[data-name="product_uom_id"] { width: 50px !important; } // ---- Price / Discount / Tax / Subtotal ---- th[data-name="price_unit"] { width: 80px !important; } th[data-name="tax_ids"] { width: 70px !important; } th[data-name="discount"] { width: 45px !important; } th[data-name="price_subtotal"] { width: 90px !important; } // ---- ADP / Client Portion ---- th[data-name="x_fc_adp_portion"] { width: 80px !important; } th[data-name="x_fc_client_portion"] { width: 80px !important; } // ---- sale_margin optional columns ---- th[data-name="purchase_price"] { width: 70px !important; } th[data-name="margin"] { width: 65px !important; } th[data-name="margin_percent"] { width: 55px !important; } // ---- Description (hidden by default, but set width in case user shows it) ---- th[data-name="name"] { width: 120px !important; } // Tax tags: compact badges td[name="tax_ids"] .badge { font-size: 0.72em; padding: 2px 4px; } // All cells: allow text truncation td { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } } // Responsive: scale text on smaller screens @media (max-width: 1400px) { .o_field_one2many[name="order_line"] .o_list_table { font-size: 0.9em; } } @media (max-width: 1200px) { .o_field_one2many[name="order_line"] .o_list_table { font-size: 0.85em; } } // Form view styling for ADP fields .o_form_view { .fc-adp-totals { background-color: #f8f9fa; border-left: 4px solid #0077b6; padding: 10px; margin: 10px 0; .fc-total-label { font-weight: 600; color: #495057; } .fc-total-value { font-size: 1.1em; font-weight: 700; } .fc-adp-value { color: #0077b6; } .fc-client-value { color: #28a745; } } } // ADP Summary Line Details - constrain product column width .o_fc_line_details { .o_list_table { table-layout: fixed !important; width: 100% !important; // Product column - first column td:first-child, th:first-child { max-width: 300px !important; width: 40% !important; overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } // Other columns - auto size td:not(:first-child), th:not(:first-child) { width: auto !important; white-space: nowrap !important; } } } // ============================================================================= // XML VIEWER STYLES // ============================================================================= .xml-viewer-content { overflow: auto; background: #1e1e1e; .xml-code { font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace; font-size: 13px; line-height: 1.5; color: #d4d4d4; background: transparent; white-space: pre; tab-size: 2; } // Syntax highlighting colors (VS Code dark theme inspired) .xml-tag { color: #569cd6; font-weight: 500; } .xml-attr { color: #9cdcfe; } .xml-value { color: #ce9178; } } // ============================================================================= // ADP DOCUMENTS TILE LAYOUT // ============================================================================= .fc-document-tiles { display: flex; flex-wrap: wrap; gap: 16px; padding: 16px 0; } .fc-document-tile { width: 220px; min-width: 220px; background: var(--o-bg-card, var(--bs-body-bg)); border: 1px solid var(--o-border-color, var(--bs-border-color)); border-radius: 8px; overflow: hidden; transition: all 0.2s ease; cursor: pointer; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); &:hover { border-color: var(--o-action, var(--bs-primary)); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); transform: translateY(-2px); } // Preview area .fc-tile-preview { height: 140px; display: flex; align-items: center; justify-content: center; background: var(--o-bg-200, var(--bs-secondary-bg)); border-bottom: 1px solid var(--o-border-color, var(--bs-border-color)); position: relative; .fc-pdf-icon { font-size: 48px; color: var(--o-danger, var(--bs-danger)); } .fc-xml-icon { font-size: 48px; color: var(--o-info, var(--bs-info)); } .fc-empty-icon { font-size: 48px; opacity: 0.35; } .fc-thumbnail { max-width: 100%; max-height: 100%; object-fit: contain; } .fc-upload-overlay { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.7); display: flex; flex-direction: column; align-items: center; justify-content: center; opacity: 0; transition: opacity 0.2s ease; i { font-size: 32px; color: white; margin-bottom: 8px; } span { color: white; font-size: 12px; font-weight: 500; } } } &.fc-tile-empty:hover .fc-upload-overlay { opacity: 1; } // Tile info area .fc-tile-info { padding: 12px; text-align: center; .fc-tile-label { font-size: 12px; font-weight: 700; text-transform: uppercase; margin-bottom: 6px; line-height: 1.3; } .fc-tile-filename { font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .fc-tile-empty-text { font-size: 11px; opacity: 0.5; font-style: italic; } } // Actions bar .fc-tile-actions { display: flex; justify-content: center; border-top: 1px solid var(--o-border-color, var(--bs-border-color)); background: var(--o-bg-100, var(--bs-tertiary-bg)); padding: 8px; button { flex: 1; padding: 8px; border: none; background: transparent; font-size: 14px; cursor: pointer; transition: all 0.15s ease; &:hover { background: var(--o-action, var(--bs-primary)); color: white; } &:not(:last-child) { border-right: 1px solid var(--o-border-color, var(--bs-border-color)); } } } // Has file state &.fc-tile-filled { border-color: var(--o-success, var(--bs-success)); } // Required field indicator &:has(.o_required_modifier) { .fc-tile-label::after { content: " *"; color: var(--o-danger, var(--bs-danger)); font-weight: bold; } &:not(:has(.o_field_binary[value])) { border-color: var(--o-warning, var(--bs-warning)); } } } // Section headers for document groups .fc-doc-section { margin-bottom: 24px; .fc-doc-section-header { font-size: 14px; font-weight: 600; border-bottom: 2px solid var(--o-action, var(--bs-primary)); padding-bottom: 8px; margin-bottom: 12px; display: flex; align-items: center; i { margin-right: 8px; color: var(--o-action, var(--bs-primary)); } } } // Style the upload field in tiles .fc-tile-upload-field { width: 100%; .o_select_file_button { width: 100%; border: none !important; border-radius: 0 !important; background: transparent !important; font-size: 12px !important; padding: 8px !important; &:hover { background: var(--o-action, var(--bs-primary)) !important; color: white !important; } } .o_file_name { display: none !important; } .o_input_file { display: none !important; } &.o_field_binary { display: flex; justify-content: center; } .o_form_binary_progress { width: 100%; padding: 4px; } } // Fix button styling in tiles .fc-document-tile { .btn-link { text-decoration: none !important; &:hover { text-decoration: none !important; } .fc-pdf-icon:hover { opacity: 0.7; transform: scale(1.1); transition: all 0.2s ease; } } } // ============================================================================= // APPROVAL SCREENSHOTS GALLERY // ============================================================================= .fc-gallery-section { background: var(--o-bg-100, var(--bs-tertiary-bg)); border: 2px solid var(--o-border-color, var(--bs-border-color)); border-radius: 8px; padding: 16px; margin-top: 8px; .fc-gallery-header { padding-bottom: 12px; .fc-tile-label { font-size: 12px; font-weight: 700; text-transform: uppercase; } .badge { font-size: 11px; } .btn { font-size: 12px; padding: 4px 10px; } } .fc-gallery-content { padding-top: 8px; // Style the many2many_binary widget as a gallery .o_field_many2many_binary { display: flex !important; flex-wrap: wrap !important; gap: 12px !important; justify-content: flex-start !important; align-items: flex-start !important; padding-top: 4px !important; // Each file item as a thumbnail card .o_attachments { display: flex !important; flex-wrap: wrap !important; gap: 12px !important; align-items: flex-start !important; .o_attachment { width: 80px !important; height: 80px !important; margin: 0 !important; border-radius: 6px !important; overflow: hidden !important; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1) !important; transition: all 0.2s ease !important; cursor: pointer !important; position: relative !important; border: 2px solid transparent !important; &:hover { transform: scale(1.05) !important; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2) !important; border-color: #0077b6 !important; } // Image preview thumbnail - clicking opens in new tab .o_image { width: 100% !important; height: 100% !important; object-fit: cover !important; } // File icon for non-images .o_attachment_icon { width: 100% !important; height: 100% !important; display: flex !important; align-items: center !important; justify-content: center !important; background: #e9ecef !important; i { font-size: 28px !important; color: #6c757d !important; } } // Hide filename inside thumbnail .o_attachment_name { display: none !important; } // Delete button styling .o_attachment_delete { position: absolute !important; top: 2px !important; right: 2px !important; background: rgba(220, 53, 69, 0.9) !important; color: white !important; border-radius: 50% !important; width: 18px !important; height: 18px !important; display: flex !important; align-items: center !important; justify-content: center !important; font-size: 10px !important; opacity: 0 !important; transition: opacity 0.2s !important; z-index: 5 !important; } &:hover .o_attachment_delete { opacity: 1 !important; } } } // Upload button - inline compact style .o_attach, button.o_attach, .o_select_file_button { display: inline-flex !important; align-items: center !important; justify-content: center !important; gap: 4px !important; padding: 6px 12px !important; border: 1px solid #28a745 !important; border-radius: 4px !important; background: white !important; color: #28a745 !important; font-size: 12px !important; font-weight: 500 !important; cursor: pointer !important; transition: all 0.2s ease !important; height: auto !important; width: auto !important; min-height: 32px !important; margin-top: 4px !important; &:hover { background: #28a745 !important; color: white !important; } i, .fa { font-size: 12px !important; margin: 0 !important; } } } } .fc-gallery-empty { padding: 16px; .fa { color: #adb5bd; } } } // Google Places Autocomplete dropdown - ensure it appears above Odoo modals .pac-container { z-index: 100000 !important; } // ============================================================================= // LTC REPAIR KANBAN - Stage & priority color coding // Uses data-* attributes on
+ CSS :has() to style the outer card. // ============================================================================= .o_kanban_view .o_kanban_record { // --- Stage left border (on the full card) --- &:has(main[data-stage="info"]) { border-left: 3px solid #0dcaf0 !important; background-color: rgba(13, 202, 240, 0.04) !important; } &:has(main[data-stage="warning"]) { border-left: 3px solid #ffc107 !important; background-color: rgba(255, 193, 7, 0.04) !important; } &:has(main[data-stage="success"]) { border-left: 3px solid #198754 !important; background-color: rgba(25, 135, 84, 0.04) !important; } &:has(main[data-stage="danger"]) { border-left: 3px solid #dc3545 !important; background-color: rgba(220, 53, 69, 0.04) !important; } &:has(main[data-stage="secondary"]) { border-left: 3px solid #adb5bd !important; } // --- Priority high: warm amber bottom accent --- &:has(main[data-priority="1"]) { box-shadow: inset 0 -2px 0 0 rgba(255, 152, 0, 0.4) !important; } // --- Emergency: override with stronger red --- &:has(main[data-emergency="1"]) { border-left: 4px solid #dc3545 !important; background-color: rgba(220, 53, 69, 0.06) !important; box-shadow: inset 0 0 0 1px rgba(220, 53, 69, 0.15) !important; } // Emergency + priority combined &:has(main[data-emergency="1"][data-priority="1"]) { box-shadow: inset 0 0 0 1px rgba(220, 53, 69, 0.15), inset 0 -2px 0 0 rgba(255, 152, 0, 0.4) !important; } } // Dark mode: slightly stronger tints html.dark, .o_dark { .o_kanban_view .o_kanban_record { &:has(main[data-stage="info"]) { background-color: rgba(13, 202, 240, 0.07) !important; } &:has(main[data-stage="warning"]) { background-color: rgba(255, 193, 7, 0.07) !important; } &:has(main[data-stage="success"]) { background-color: rgba(25, 135, 84, 0.07) !important; } &:has(main[data-stage="danger"]) { background-color: rgba(220, 53, 69, 0.07) !important; } &:has(main[data-emergency="1"]) { background-color: rgba(220, 53, 69, 0.1) !important; } } } .adp_file_preview { font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace; font-size: 12px; line-height: 1.6; white-space: pre; overflow-x: auto; background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 4px; padding: 12px; max-height: 500px; overflow-y: auto; }