Files
Odoo-Modules/fusion_claims/static/src/scss/fusion_claims.scss
gsinghpal e56974d46f update
2026-03-16 08:14:56 -04:00

772 lines
22 KiB
SCSS

// 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 <main> + 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;
}