- Remove dead DB columns: uuid, sync_version from quotations/quotation_items/scope_sections; is_deleted from quotation_items/scope_sections; content_editor_height from scope_sections - Remove unused scope_title/scope_description from offer form state - Remove dead CSS: offers-template-menu, offers-draft-indicator, exchange-rate - Remove dead scope_title translation key from offers PDF - Fix duplicate Customer interface in OfferDetail.tsx (use shared type) - Add missing title field to ScopeTemplate interface - Add item template picker dropdown next to "Přidat položku" button Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
622 lines
15 KiB
CSS
622 lines
15 KiB
CSS
/* ============================================
|
|
Offers Module
|
|
============================================ */
|
|
|
|
/* Items table */
|
|
.offers-items-table {
|
|
overflow-x: auto;
|
|
overflow-y: hidden;
|
|
margin-bottom: 1rem;
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 0.5rem;
|
|
}
|
|
|
|
.offers-items-table .admin-table {
|
|
min-width: 700px;
|
|
margin: 0;
|
|
}
|
|
|
|
.offers-items-table .admin-table thead th {
|
|
font-size: 11px;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.04em;
|
|
color: var(--text-tertiary);
|
|
padding: 8px 10px;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.offers-items-table .admin-table td {
|
|
vertical-align: top;
|
|
padding: 8px;
|
|
}
|
|
|
|
.offers-items-table .admin-table tbody tr {
|
|
transition: background var(--transition);
|
|
}
|
|
|
|
.offers-items-table .admin-table tbody tr:hover {
|
|
background: var(--table-row-hover);
|
|
}
|
|
|
|
.offers-items-table .admin-table td .admin-form-input {
|
|
display: block;
|
|
padding: 6px 8px;
|
|
font-size: 13px;
|
|
min-height: 32px;
|
|
}
|
|
|
|
/* Language badges */
|
|
.offers-lang-badge {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
min-width: 1.5rem;
|
|
height: 1.25rem;
|
|
padding: 0 0.375rem;
|
|
border-radius: 0.25rem;
|
|
font-size: 0.625rem;
|
|
font-weight: 700;
|
|
letter-spacing: 0.03em;
|
|
text-transform: uppercase;
|
|
background: color-mix(in srgb, var(--info) 15%, transparent);
|
|
color: var(--info);
|
|
margin-right: 0.375rem;
|
|
vertical-align: middle;
|
|
}
|
|
|
|
.offers-lang-badge-cz {
|
|
background: color-mix(in srgb, var(--danger) 15%, transparent);
|
|
color: var(--danger);
|
|
}
|
|
|
|
/* RichEditor (Quill) */
|
|
.admin-rich-editor {
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 0.5rem;
|
|
overflow: visible;
|
|
}
|
|
|
|
.admin-rich-editor .quill {
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
/* Toolbar */
|
|
.admin-rich-editor .ql-toolbar.ql-snow {
|
|
background: var(--bg-secondary);
|
|
border: none;
|
|
border-bottom: 1px solid var(--border-color);
|
|
border-radius: 0.5rem 0.5rem 0 0;
|
|
padding: 0.5rem;
|
|
flex-wrap: wrap;
|
|
gap: 2px;
|
|
}
|
|
|
|
.admin-rich-editor .ql-toolbar .ql-formats {
|
|
margin-right: 8px;
|
|
}
|
|
|
|
/* Toolbar buttons */
|
|
.admin-rich-editor .ql-snow .ql-stroke {
|
|
stroke: var(--text-secondary);
|
|
}
|
|
.admin-rich-editor .ql-snow .ql-fill {
|
|
fill: var(--text-secondary);
|
|
}
|
|
.admin-rich-editor .ql-snow .ql-picker-label {
|
|
color: var(--text-secondary);
|
|
border-color: var(--border-color);
|
|
}
|
|
|
|
.admin-rich-editor .ql-snow button:hover .ql-stroke,
|
|
.admin-rich-editor .ql-snow .ql-picker-label:hover .ql-stroke {
|
|
stroke: var(--text-primary);
|
|
}
|
|
.admin-rich-editor .ql-snow button:hover .ql-fill,
|
|
.admin-rich-editor .ql-snow .ql-picker-label:hover .ql-fill {
|
|
fill: var(--text-primary);
|
|
}
|
|
.admin-rich-editor .ql-snow button:hover,
|
|
.admin-rich-editor .ql-snow .ql-picker-label:hover {
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
/* Active state */
|
|
.admin-rich-editor .ql-snow button.ql-active {
|
|
color: var(--accent-color);
|
|
background: color-mix(in srgb, var(--accent-color) 15%, transparent);
|
|
border-radius: 4px;
|
|
}
|
|
.admin-rich-editor .ql-snow button.ql-active .ql-stroke {
|
|
stroke: var(--accent-color);
|
|
}
|
|
.admin-rich-editor .ql-snow button.ql-active .ql-fill,
|
|
.admin-rich-editor .ql-snow button.ql-active .ql-stroke.ql-fill {
|
|
fill: var(--accent-color);
|
|
}
|
|
.admin-rich-editor .ql-snow .ql-picker-item.ql-selected {
|
|
color: var(--accent-color);
|
|
}
|
|
.admin-rich-editor .ql-snow .ql-picker-label.ql-active {
|
|
color: var(--accent-color);
|
|
}
|
|
.admin-rich-editor .ql-snow .ql-picker-label.ql-active .ql-stroke {
|
|
stroke: var(--accent-color);
|
|
}
|
|
|
|
/* Dropdowns (font, size, color, align) */
|
|
.admin-rich-editor .ql-snow .ql-picker-options {
|
|
background: var(--bg-primary);
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 0.375rem;
|
|
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
|
|
z-index: 1000;
|
|
padding: 0.25rem;
|
|
}
|
|
|
|
.admin-rich-editor .ql-snow .ql-picker-item {
|
|
color: var(--text-secondary);
|
|
padding: 0.25rem 0.5rem;
|
|
border-radius: 0.25rem;
|
|
}
|
|
.admin-rich-editor .ql-snow .ql-picker-item:hover {
|
|
color: var(--text-primary);
|
|
background: var(--bg-secondary);
|
|
}
|
|
|
|
/* Font picker */
|
|
.admin-rich-editor .ql-snow .ql-font .ql-picker-options {
|
|
min-width: 11rem;
|
|
max-height: 200px;
|
|
overflow-y: auto;
|
|
}
|
|
.admin-rich-editor .ql-snow .ql-size .ql-picker-options {
|
|
max-height: 200px;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
/* Font labels - vysoka specificita kvuli quill.snow.css */
|
|
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="arial"]::before,
|
|
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="arial"]::before {
|
|
content: "Arial" !important;
|
|
font-family: Arial, sans-serif;
|
|
}
|
|
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="tahoma"]::before,
|
|
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="tahoma"]::before {
|
|
content: "Tahoma" !important;
|
|
font-family: Tahoma, sans-serif;
|
|
}
|
|
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="verdana"]::before,
|
|
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="verdana"]::before {
|
|
content: "Verdana" !important;
|
|
font-family: Verdana, sans-serif;
|
|
}
|
|
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="georgia"]::before,
|
|
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="georgia"]::before {
|
|
content: "Georgia" !important;
|
|
font-family: Georgia, serif;
|
|
}
|
|
.ql-snow
|
|
.ql-picker.ql-font
|
|
.ql-picker-label[data-value="times-new-roman"]::before,
|
|
.ql-snow
|
|
.ql-picker.ql-font
|
|
.ql-picker-item[data-value="times-new-roman"]::before {
|
|
content: "Times New Roman" !important;
|
|
font-family: "Times New Roman", serif;
|
|
}
|
|
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="courier-new"]::before,
|
|
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="courier-new"]::before {
|
|
content: "Courier New" !important;
|
|
font-family: "Courier New", monospace;
|
|
}
|
|
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="trebuchet-ms"]::before,
|
|
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="trebuchet-ms"]::before {
|
|
content: "Trebuchet MS" !important;
|
|
font-family: "Trebuchet MS", sans-serif;
|
|
}
|
|
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="impact"]::before,
|
|
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="impact"]::before {
|
|
content: "Impact" !important;
|
|
font-family: Impact, sans-serif;
|
|
}
|
|
.ql-snow
|
|
.ql-picker.ql-font
|
|
.ql-picker-label[data-value="comic-sans-ms"]::before,
|
|
.ql-snow
|
|
.ql-picker.ql-font
|
|
.ql-picker-item[data-value="comic-sans-ms"]::before {
|
|
content: "Comic Sans MS" !important;
|
|
font-family: "Comic Sans MS", cursive;
|
|
}
|
|
.ql-snow
|
|
.ql-picker.ql-font
|
|
.ql-picker-label[data-value="lucida-console"]::before,
|
|
.ql-snow
|
|
.ql-picker.ql-font
|
|
.ql-picker-item[data-value="lucida-console"]::before {
|
|
content: "Lucida Console" !important;
|
|
font-family: "Lucida Console", monospace;
|
|
}
|
|
.ql-snow
|
|
.ql-picker.ql-font
|
|
.ql-picker-label[data-value="palatino-linotype"]::before,
|
|
.ql-snow
|
|
.ql-picker.ql-font
|
|
.ql-picker-item[data-value="palatino-linotype"]::before {
|
|
content: "Palatino Linotype" !important;
|
|
font-family: "Palatino Linotype", serif;
|
|
}
|
|
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="garamond"]::before,
|
|
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="garamond"]::before {
|
|
content: "Garamond" !important;
|
|
font-family: Garamond, serif;
|
|
}
|
|
|
|
/* Font classes */
|
|
.ql-font-arial {
|
|
font-family: Arial, sans-serif;
|
|
}
|
|
.ql-font-tahoma {
|
|
font-family: Tahoma, sans-serif;
|
|
}
|
|
.ql-font-verdana {
|
|
font-family: Verdana, sans-serif;
|
|
}
|
|
.ql-font-georgia {
|
|
font-family: Georgia, serif;
|
|
}
|
|
.ql-font-times-new-roman {
|
|
font-family: "Times New Roman", serif;
|
|
}
|
|
.ql-font-courier-new {
|
|
font-family: "Courier New", monospace;
|
|
}
|
|
.ql-font-trebuchet-ms {
|
|
font-family: "Trebuchet MS", sans-serif;
|
|
}
|
|
.ql-font-impact {
|
|
font-family: Impact, sans-serif;
|
|
}
|
|
.ql-font-comic-sans-ms {
|
|
font-family: "Comic Sans MS", cursive;
|
|
}
|
|
.ql-font-lucida-console {
|
|
font-family: "Lucida Console", monospace;
|
|
}
|
|
.ql-font-palatino-linotype {
|
|
font-family: "Palatino Linotype", serif;
|
|
}
|
|
.ql-font-garamond {
|
|
font-family: Garamond, serif;
|
|
}
|
|
|
|
/* Size picker */
|
|
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="8px"]::before,
|
|
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="8px"]::before {
|
|
content: "8px" !important;
|
|
}
|
|
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="9px"]::before,
|
|
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="9px"]::before {
|
|
content: "9px" !important;
|
|
}
|
|
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="10px"]::before,
|
|
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="10px"]::before {
|
|
content: "10px" !important;
|
|
}
|
|
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="11px"]::before,
|
|
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="11px"]::before {
|
|
content: "11px" !important;
|
|
}
|
|
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="12px"]::before,
|
|
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="12px"]::before {
|
|
content: "12px" !important;
|
|
}
|
|
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="14px"]::before,
|
|
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="14px"]::before {
|
|
content: "14px" !important;
|
|
}
|
|
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="16px"]::before,
|
|
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="16px"]::before {
|
|
content: "16px" !important;
|
|
}
|
|
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="18px"]::before,
|
|
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="18px"]::before {
|
|
content: "18px" !important;
|
|
}
|
|
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="20px"]::before,
|
|
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="20px"]::before {
|
|
content: "20px" !important;
|
|
}
|
|
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="24px"]::before,
|
|
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="24px"]::before {
|
|
content: "24px" !important;
|
|
}
|
|
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="28px"]::before,
|
|
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="28px"]::before {
|
|
content: "28px" !important;
|
|
}
|
|
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="32px"]::before,
|
|
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="32px"]::before {
|
|
content: "32px" !important;
|
|
}
|
|
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="36px"]::before,
|
|
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="36px"]::before {
|
|
content: "36px" !important;
|
|
}
|
|
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="48px"]::before,
|
|
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="48px"]::before {
|
|
content: "48px" !important;
|
|
}
|
|
|
|
/* Editor area */
|
|
.admin-rich-editor .ql-container.ql-snow {
|
|
border: none;
|
|
border-radius: 0 0 0.5rem 0.5rem;
|
|
font-family: Tahoma, sans-serif;
|
|
font-size: 14px;
|
|
}
|
|
|
|
.admin-rich-editor .ql-editor {
|
|
min-height: var(--re-min-height, 120px);
|
|
padding: 0.75rem;
|
|
color: var(--text-primary);
|
|
line-height: 1.6;
|
|
font-family: Tahoma, sans-serif;
|
|
font-size: 14px;
|
|
background: var(--input-bg);
|
|
}
|
|
|
|
.admin-rich-editor .ql-editor.ql-blank::before {
|
|
color: var(--text-tertiary);
|
|
font-style: normal;
|
|
}
|
|
|
|
/* Lists inside editor */
|
|
.admin-rich-editor .ql-editor ul,
|
|
.admin-rich-editor .ql-editor ol {
|
|
padding-left: 1.5rem;
|
|
}
|
|
|
|
/* Color picker */
|
|
.admin-rich-editor
|
|
.ql-snow
|
|
.ql-color-picker
|
|
.ql-picker-options[aria-hidden="false"] {
|
|
width: 176px;
|
|
padding: 0.375rem;
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 2px;
|
|
}
|
|
|
|
.admin-rich-editor .ql-snow .ql-color-picker .ql-picker-item {
|
|
width: 18px;
|
|
height: 18px;
|
|
border-radius: 2px;
|
|
margin: 0;
|
|
padding: 0;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
/* Tooltip (link editor) */
|
|
.admin-rich-editor .ql-snow .ql-tooltip {
|
|
background: var(--bg-primary);
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 0.375rem;
|
|
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
.admin-rich-editor .ql-snow .ql-tooltip input[type="text"] {
|
|
background: var(--bg-secondary);
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 0.25rem;
|
|
color: var(--text-primary);
|
|
padding: 0.25rem 0.5rem;
|
|
}
|
|
|
|
.admin-rich-editor .ql-snow .ql-tooltip a {
|
|
color: var(--accent-color);
|
|
}
|
|
|
|
/* Read-only rendered rich text (Quill HTML output) */
|
|
.admin-rich-text-view {
|
|
color: var(--text-secondary);
|
|
line-height: 1.6;
|
|
font-size: 0.875rem;
|
|
overflow-wrap: break-word;
|
|
word-break: break-word;
|
|
min-width: 0;
|
|
}
|
|
|
|
.admin-rich-text-view ul,
|
|
.admin-rich-text-view ol {
|
|
padding-left: 1.5rem;
|
|
margin: 0.25rem 0 0.75rem;
|
|
}
|
|
|
|
.admin-rich-text-view li {
|
|
margin-bottom: 0.15rem;
|
|
}
|
|
|
|
.admin-rich-text-view a {
|
|
color: var(--accent-color);
|
|
}
|
|
|
|
.admin-rich-text-view strong,
|
|
.admin-rich-text-view b {
|
|
font-weight: 600;
|
|
color: var(--text-primary);
|
|
display: inline-block;
|
|
margin-top: 0.5rem;
|
|
}
|
|
|
|
.admin-rich-text-view br + b,
|
|
.admin-rich-text-view br + strong {
|
|
margin-top: 0.75rem;
|
|
}
|
|
|
|
.admin-rich-text-view > br:first-child,
|
|
.admin-rich-text-view ul + br,
|
|
.admin-rich-text-view ol + br {
|
|
display: none;
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.offers-items-table .admin-table td .admin-form-input {
|
|
font-size: 16px;
|
|
min-height: 44px;
|
|
padding: 9px 10px;
|
|
}
|
|
|
|
/* Give the description column more room by shrinking numeric columns */
|
|
.offers-col-qty {
|
|
width: 4rem !important;
|
|
}
|
|
.offers-col-unit {
|
|
width: 4rem !important;
|
|
}
|
|
.offers-col-price {
|
|
width: 5.5rem !important;
|
|
}
|
|
.offers-col-included {
|
|
width: 3.5rem !important;
|
|
}
|
|
.offers-col-total {
|
|
width: 5.5rem !important;
|
|
}
|
|
.offers-col-del {
|
|
width: 2.5rem !important;
|
|
}
|
|
}
|
|
|
|
@media (max-width: 640px) {
|
|
.offers-items-table {
|
|
margin: 0 -1rem;
|
|
width: calc(100% + 2rem);
|
|
border-radius: 0;
|
|
border-left: none;
|
|
border-right: none;
|
|
}
|
|
|
|
.offers-items-table .admin-table {
|
|
min-width: 700px;
|
|
}
|
|
|
|
.offers-items-table .admin-table td {
|
|
padding: 6px;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.offers-items-table .admin-table th {
|
|
font-size: 10px;
|
|
padding: 6px;
|
|
}
|
|
|
|
/* Further reduce numeric columns on very small screens */
|
|
.offers-col-qty {
|
|
width: 3.5rem !important;
|
|
}
|
|
.offers-col-unit {
|
|
width: 3.5rem !important;
|
|
}
|
|
.offers-col-price {
|
|
width: 5rem !important;
|
|
}
|
|
.offers-col-total {
|
|
width: 5rem !important;
|
|
}
|
|
}
|
|
|
|
/* Offer draft row in table */
|
|
.offers-draft-row {
|
|
background: var(--row-draft);
|
|
}
|
|
|
|
.offers-draft-row-label {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 0.35rem;
|
|
font-size: 0.75rem;
|
|
font-weight: 600;
|
|
letter-spacing: 0.03em;
|
|
color: var(--warning);
|
|
background: color-mix(in srgb, var(--warning) 14%, transparent);
|
|
padding: 0.2rem 0.55rem;
|
|
border-radius: 99px;
|
|
}
|
|
|
|
/* Expired offer without order */
|
|
.offers-expired-row {
|
|
background: var(--row-expired);
|
|
}
|
|
|
|
.offers-expired-row td {
|
|
color: var(--danger) !important;
|
|
}
|
|
|
|
.offers-expired-row a {
|
|
color: var(--danger) !important;
|
|
}
|
|
|
|
/* Invalidated offer */
|
|
.offers-invalidated-row {
|
|
opacity: 0.6;
|
|
}
|
|
|
|
.offers-invalidated-row td {
|
|
color: var(--text-muted) !important;
|
|
}
|
|
|
|
.offers-invalidated-row a {
|
|
color: var(--text-muted) !important;
|
|
}
|
|
|
|
/* Completed offer */
|
|
.offers-completed-row {
|
|
background: var(
|
|
--row-completed,
|
|
color-mix(in srgb, var(--success) 8%, transparent)
|
|
);
|
|
}
|
|
|
|
/* Read-only form (invalidated offer detail) */
|
|
.offers-readonly input[readonly],
|
|
.offers-readonly select:disabled {
|
|
background-color: var(--bg-secondary);
|
|
cursor: default;
|
|
}
|
|
|
|
/* Offer draft indicator */
|
|
/* Filters */
|
|
.admin-filters {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 1rem;
|
|
align-items: flex-start;
|
|
}
|
|
|
|
.admin-filter-group {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.35rem;
|
|
}
|
|
|
|
.admin-filter-label {
|
|
font-size: 0.75rem;
|
|
font-weight: 600;
|
|
color: var(--text-tertiary);
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.03em;
|
|
}
|
|
|
|
.admin-filter-group .admin-tabs {
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.admin-filter-group .admin-form-select {
|
|
min-width: 10rem;
|
|
}
|