Phase 6: Q.C. inspection, project folders, packet documents and the digital ITP
The Q.C. screen (KPIs, boards, project folders), the Q.C. tab on the packet page (check items from the qc_check_items settings row, visual exam per weld, NDE, hardness with the NACE label, notes), accept with a route and a signature gated by qc_missing_empty, reject with a reason or an NCR number closing the inspection into qc_history, Q.C. folder documents per project and unit with superseding revisions, packet documents as a closed set with take-out reasons, the digital ITP per unit from the frozen template (line initials with CAS, unsign, N/A, customer codes, rejects with NCR, block signatures, sign-off with the PDF hook, admin reopen, the ITP log), hold-point warnings by department page group, the scoped policy check for unit and project writes, migration 0007, tests, Playwright scenarios and docs. Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
@@ -559,3 +559,77 @@ body.fs-view .toast { z-index: 99; }
|
||||
.mb10 { margin-bottom: 10px; }
|
||||
.mt8 { margin-top: 8px; }
|
||||
.mt10 { margin-top: 10px; }
|
||||
|
||||
/* Phase 6: packet page. From .vtb, .qcdoc, .qcdocs, .itphold and the qcTab layout of the old build. */
|
||||
.vtbs { display: flex; gap: 6px; }
|
||||
.vtb { border: 2px solid var(--line2); background: var(--panel); color: var(--body); border-radius: 8px; padding: 8px 14px; font-weight: 700; cursor: pointer; min-height: 42px; }
|
||||
.vtb:disabled { opacity: .6; cursor: default; }
|
||||
.vtb.acc[aria-pressed="true"] { background: var(--green); border-color: var(--green); color: var(--on-green); }
|
||||
.vtb.rej[aria-pressed="true"] { background: var(--pink); border-color: var(--pink); color: var(--on-pink); }
|
||||
.qctab .ck-item .t .hint { display: block; margin-top: 2px; font-weight: 400; }
|
||||
.qcinsp { max-width: 720px; }
|
||||
.qcnde { max-width: 900px; }
|
||||
.qcnotes { margin-top: 12px; max-width: 900px; }
|
||||
.qcroute { flex: 0 1 260px; }
|
||||
.qcbar .acts { align-items: flex-end; }
|
||||
.qcrej a.lnk, .itphold a.lnk { font-weight: 600; }
|
||||
.itphold b { color: var(--amber); }
|
||||
.qcdocs { display: grid; gap: 8px; }
|
||||
.qcdoc { display: flex; gap: 12px; align-items: flex-start; flex-wrap: wrap; padding: 12px 14px; border: 1px solid var(--line); border-radius: 10px; background: var(--panel); }
|
||||
.qcdoc.old { opacity: .7; }
|
||||
.qcdoc .m { flex: 1 1 240px; min-width: 0; }
|
||||
.qcdoc .a { display: flex; gap: 8px; flex-wrap: wrap; }
|
||||
.qchist .pill { margin-right: 4px; }
|
||||
input.in.w220 { width: 220px; max-width: 100%; }
|
||||
.mt4 { margin-top: 4px; }
|
||||
|
||||
/* Phase 6: Q.C. screens. Ported from the old .qcunits, .qcunit, .qcdocs, .qcdoc, .itpcard, .itphdr, .itppage,
|
||||
.itpsec, .itprows, .itprow, .itpblock, .sigs, .ini, .rejtag, .custrec blocks, plus a few new helpers. */
|
||||
.qcfolders { margin-top: 22px; }
|
||||
.qcunits { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 10px; }
|
||||
.qcunit { gap: 8px; padding: 10px 12px; align-items: stretch; text-align: left; }
|
||||
.qcunit .job { font-size: 17px; }
|
||||
.qcunit .qm { display: flex; justify-content: space-between; gap: 8px; font-size: 13px; color: var(--muted); }
|
||||
.qcunit .qm .ok, .qcdoc .ok { color: var(--green); }
|
||||
.qcdocs { display: grid; gap: 8px; list-style: none; margin: 0; padding: 0; }
|
||||
.qcdoc { display: flex; gap: 12px; align-items: flex-start; flex-wrap: wrap; padding: 12px 14px; border: 1px solid var(--line); border-radius: 10px; background: var(--panel); }
|
||||
.qcdoc.old { opacity: .7; }
|
||||
.qcdoc .tag { font-size: 12px; font-weight: 700; padding: 3px 8px; border-radius: 6px; background: var(--panel2); border: 1px solid var(--line2); white-space: nowrap; }
|
||||
.qcdoc .m { flex: 1 1 240px; min-width: 0; }
|
||||
.qcdoc .a { display: flex; gap: 8px; flex-wrap: wrap; }
|
||||
.itpcard { display: flex; gap: 14px; align-items: center; flex-wrap: wrap; padding: 14px 16px; border: 1px solid var(--line); border-radius: 10px; background: var(--panel); }
|
||||
a.itpcard { flex-direction: row; text-align: left; }
|
||||
.itpcard .grow { flex: 1 1 260px; min-width: 0; }
|
||||
.itpcard .bar { background: var(--panel2); margin: 8px 0 6px; }
|
||||
.itphdr { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 10px; }
|
||||
.itppage { margin: 26px 0 4px; font-family: var(--f-disp); font-size: 13px; letter-spacing: .12em; text-transform: uppercase; color: var(--cyan); }
|
||||
.itppage span { color: var(--muted); margin-right: 6px; }
|
||||
.itpsec .sec-h h2 { font-size: 17px; }
|
||||
.itprows { display: grid; gap: 6px; }
|
||||
.itprow { display: grid; grid-template-columns: 42px minmax(0, 1fr) 44px 210px 130px 44px; gap: 10px; align-items: center; padding: 10px 12px; border: 1px solid var(--line); border-radius: 10px; background: var(--panel); }
|
||||
.itprow.hold { border-left: 3px solid var(--amber); }
|
||||
.itprow.rej { border-left: 3px solid var(--red); }
|
||||
.itprow .rejtag { font-size: 12px; color: var(--red); flex-basis: 100%; }
|
||||
.itprow .apr { display: flex; gap: 6px; flex-wrap: wrap; }
|
||||
.itprow.na { opacity: .55; }
|
||||
.itprow.na .t b { text-decoration: line-through; }
|
||||
.itprow .cd { display: inline-block; min-width: 34px; text-align: center; font-weight: 700; font-size: 12px; padding: 3px 6px; border-radius: 6px; background: var(--panel2); border: 1px solid var(--line2); }
|
||||
.itprow .qc, .itprow .cu { display: flex; flex-wrap: wrap; gap: 4px 8px; align-items: center; }
|
||||
.itprow.hd { background: none; border: 0; padding: 0 12px; font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); }
|
||||
.itprow .ini { font-family: var(--f-disp); font-weight: 700; font-size: 16px; color: var(--green); }
|
||||
.itpblock { margin: 8px 0 18px; padding: 12px 14px; border: 1px dashed var(--line2); border-radius: 10px; }
|
||||
.itpblock .sigs { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 12px; margin-top: 8px; }
|
||||
.itpblock .custrec { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; }
|
||||
.itpblock .custrec .in { max-width: 200px; }
|
||||
@media (max-width: 760px) {
|
||||
.itprow.hd { display: none; }
|
||||
.itprow { grid-template-columns: 38px minmax(0, 1fr) 40px; }
|
||||
.itprow .qc { grid-column: 2; grid-row: 2; }
|
||||
.itprow .cu { grid-column: 2 / 4; grid-row: 3; }
|
||||
.itprow .mb { grid-column: 3; grid-row: 2; }
|
||||
}
|
||||
/* New: the line sheet's N/A checkbox row, the ITP log list and the write message pinned to the bottom. */
|
||||
.itpck { display: flex; align-items: center; gap: 10px; font-size: 14px; color: var(--near); }
|
||||
.itpck input { width: 20px; height: 20px; }
|
||||
.itplog { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; color: var(--body); }
|
||||
.itpmsg { position: fixed; left: 50%; bottom: calc(20px + env(safe-area-inset-bottom, 0px)); transform: translateX(-50%); z-index: 60; max-width: calc(100% - 32px); box-shadow: 0 6px 20px rgba(0, 0, 0, .4); }
|
||||
|
||||
Reference in New Issue
Block a user