| Line 116... |
Line 116... |
| 116 |
.oc-root .oc-mini tr:last-child td { border-bottom: none; }
|
116 |
.oc-root .oc-mini tr:last-child td { border-bottom: none; }
|
| 117 |
.oc-root .oc-mini code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
117 |
.oc-root .oc-mini code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
| 118 |
font-size: 11px; background: var(--oc-bg); padding: 1px 5px;
|
118 |
font-size: 11px; background: var(--oc-bg); padding: 1px 5px;
|
| 119 |
border-radius: 4px; border: 1px solid var(--oc-border); }
|
119 |
border-radius: 4px; border: 1px solid var(--oc-border); }
|
| 120 |
.oc-num { font-variant-numeric: tabular-nums; color: var(--oc-muted); white-space: nowrap; }
|
120 |
.oc-num { font-variant-numeric: tabular-nums; color: var(--oc-muted); white-space: nowrap; }
|
| - |
|
121 |
|
| - |
|
122 |
/* Ingest summary. It arrives as a Java Map.toString() - one long line that cannot
|
| - |
|
123 |
wrap usefully - so it is parsed into chips rather than printed. The long drop-reason
|
| - |
|
124 |
map goes behind a disclosure: it is the detail you want when a count looks wrong,
|
| - |
|
125 |
and noise the rest of the time. */
|
| - |
|
126 |
.oc-sum { display: flex; flex-wrap: wrap; gap: 6px; align-items: center;
|
| - |
|
127 |
width: 100%; margin-top: 6px; }
|
| - |
|
128 |
.oc-sum-chip { display: inline-flex; align-items: baseline; gap: 5px; padding: 2px 9px;
|
| - |
|
129 |
border: 1px solid var(--oc-border); border-radius: 999px;
|
| - |
|
130 |
background: var(--oc-surface); font-size: 11.5px; color: var(--oc-muted);
|
| - |
|
131 |
white-space: nowrap; }
|
| - |
|
132 |
.oc-sum-chip b { font-weight: 650; color: var(--oc-text); font-variant-numeric: tabular-nums; }
|
| - |
|
133 |
.oc-sum-chip-warn { background: var(--oc-warn-soft); border-color: rgb(253, 230, 138); }
|
| - |
|
134 |
.oc-sum-chip-warn b { color: var(--oc-warn); }
|
| - |
|
135 |
.oc-sum-toggle { border: 1px solid var(--oc-border); background: var(--oc-surface);
|
| - |
|
136 |
border-radius: 999px; padding: 2px 9px; font-size: 11.5px;
|
| - |
|
137 |
color: var(--oc-muted); cursor: pointer; }
|
| - |
|
138 |
.oc-sum-toggle:hover { border-color: var(--oc-accent); color: var(--oc-accent); }
|
| - |
|
139 |
.oc-sum-detail { width: 100%; margin-top: 6px; border: 1px solid var(--oc-border);
|
| - |
|
140 |
border-radius: 8px; background: var(--oc-bg); padding: 6px 10px;
|
| - |
|
141 |
max-height: 220px; overflow-y: auto; display: none; }
|
| - |
|
142 |
.oc-sum-detail div { display: flex; gap: 14px; justify-content: space-between;
|
| - |
|
143 |
padding: 3px 0; font-size: 12px; border-bottom: 1px solid var(--oc-border); }
|
| - |
|
144 |
.oc-sum-detail div:last-child { border-bottom: 0; }
|
| - |
|
145 |
.oc-sum-detail span:first-child { color: var(--oc-text); word-break: break-word; }
|
| - |
|
146 |
.oc-sum-detail span:last-child { color: var(--oc-muted); font-variant-numeric: tabular-nums;
|
| - |
|
147 |
white-space: nowrap; }
|
| - |
|
148 |
/* anything not parsed still has to wrap rather than run off the card */
|
| - |
|
149 |
.oc-sum-raw { white-space: normal; word-break: break-word; }
|
| 121 |
.oc-mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
150 |
.oc-mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
| 122 |
font-size: 12px; }
|
151 |
font-size: 12px; }
|
| 123 |
|
152 |
|
| 124 |
/* pills */
|
153 |
/* pills */
|
| 125 |
.oc-pill { display: inline-block; padding: 2px 8px; border-radius: 999px;
|
154 |
.oc-pill { display: inline-block; padding: 2px 8px; border-radius: 999px;
|
| Line 230... |
Line 259... |
| 230 |
<div class="oc-tile-value" data-oc-stat="pending">–</div></div>
|
259 |
<div class="oc-tile-value" data-oc-stat="pending">–</div></div>
|
| 231 |
<div class="oc-tile"><div class="oc-tile-label">Brands</div>
|
260 |
<div class="oc-tile"><div class="oc-tile-label">Brands</div>
|
| 232 |
<div class="oc-tile-value" data-oc-stat="brands">–</div></div>
|
261 |
<div class="oc-tile-value" data-oc-stat="brands">–</div></div>
|
| 233 |
</div>
|
262 |
</div>
|
| 234 |
|
263 |
|
| 235 |
<!-- Curation queue. Grouped by distinct (OEM, product text) rather than by circular
|
264 |
<!-- Product resolution moved to its own screen (Offer Circular -> Resolve Products):
|
| 236 |
row, because a saved decision is keyed the same way: answer once and every row
|
265 |
it is a working queue with a form, and a form laid out inside a six-column table
|
| 237 |
carrying that text is resolved, on this circular and on every later one. -->
|
266 |
never aligned. Keeping a copy here would also double-bind the delegated handlers. -->
|
| 238 |
<div class="oc-card" style="margin-bottom:16px;">
|
267 |
<div class="oc-card" style="margin-bottom:16px;">
|
| 239 |
<div class="oc-card-head">
|
268 |
<div class="oc-card-head">
|
| 240 |
<span>Resolve products <span class="oc-num" data-oc-resolve-count></span></span>
|
- |
|
| 241 |
<span style="display:flex;gap:8px;align-items:center;flex-wrap:wrap;">
|
- |
|
| 242 |
<span class="oc-num" data-oc-resolve-pending></span>
|
269 |
<span>Resolve products</span>
|
| 243 |
<button class="oc-btn oc-btn-ghost" type="button" data-oc-alias-export
|
- |
|
| 244 |
title="Emit every saved decision as SQL so it can be replayed on another environment">Export as SQL</button>
|
- |
|
| 245 |
<button class="oc-btn oc-btn-ghost" type="button" data-oc-reingest
|
- |
|
| 246 |
title="Saved decisions are only read when the circular is parsed, so they need a re-ingest to take effect">Re-ingest to apply</button>
|
270 |
<button class="oc-btn" type="button" onclick="if(window.openOfferCircularResolve){window.openOfferCircularResolve('main-content');}else{window.location='/offerCircularResolve';}">Open the queue</button>
|
| 247 |
<button class="oc-btn" type="button" data-oc-resolve-toggle>Show queue</button>
|
- |
|
| 248 |
</span>
|
- |
|
| 249 |
</div>
|
- |
|
| 250 |
<div data-oc-resolve-wrap style="display:none;">
|
- |
|
| 251 |
<div class="oc-scroll" style="max-height:60vh;">
|
- |
|
| 252 |
<table class="oc-table">
|
- |
|
| 253 |
<thead>
|
- |
|
| 254 |
<tr>
|
- |
|
| 255 |
<th>Product as printed</th>
|
- |
|
| 256 |
<th>OEM</th>
|
- |
|
| 257 |
<th>Affects</th>
|
- |
|
| 258 |
<th>Closest miss</th>
|
- |
|
| 259 |
<th>Decision</th>
|
- |
|
| 260 |
<th></th>
|
- |
|
| 261 |
</tr>
|
- |
|
| 262 |
</thead>
|
- |
|
| 263 |
<tbody data-oc-resolve-body>
|
- |
|
| 264 |
<tr><td colspan="6" class="oc-spin">Loading decisions…</td></tr>
|
- |
|
| 265 |
</tbody>
|
- |
|
| 266 |
</table>
|
- |
|
| 267 |
</div>
|
- |
|
| 268 |
<div class="oc-foot"><span data-oc-resolve-msg></span></div>
|
- |
|
| 269 |
</div>
|
271 |
</div>
|
| 270 |
</div>
|
272 |
</div>
|
| 271 |
|
273 |
|
| 272 |
<div class="oc-filters">
|
274 |
<div class="oc-filters">
|
| 273 |
<div class="oc-field">
|
275 |
<div class="oc-field">
|