docs(sdlc): keep short cells on one line, unify QA/Tester
This commit is contained in:
@@ -354,7 +354,7 @@ async function tableWidthNeededMm(page) {
|
|||||||
* them. Returns the IDs or dates that still stick out of their cell.
|
* them. Returns the IDs or dates that still stick out of their cell.
|
||||||
*/
|
*/
|
||||||
async function applyProportionalWidths(page, textMm) {
|
async function applyProportionalWidths(page, textMm) {
|
||||||
return page.evaluate(({ availMm, SHORT_COLUMN_MM }) => {
|
return page.evaluate(({ availMm, SHORT_COLUMN_MM, SHORT_CELL_CHARS }) => {
|
||||||
const mm = 96 / 25.4;
|
const mm = 96 / 25.4;
|
||||||
const main = document.querySelector('main.delivery-document');
|
const main = document.querySelector('main.delivery-document');
|
||||||
const probe = document.createElement('style');
|
const probe = document.createElement('style');
|
||||||
@@ -373,7 +373,8 @@ async function applyProportionalWidths(page, textMm) {
|
|||||||
const rects = [...range.getClientRects()];
|
const rects = [...range.getClientRects()];
|
||||||
const text = rects.length ? Math.max(...rects.map((r) => r.right)) - Math.min(...rects.map((r) => r.left)) : 0;
|
const text = rects.length ? Math.max(...rects.map((r) => r.right)) - Math.min(...rects.map((r) => r.left)) : 0;
|
||||||
const style = getComputedStyle(cell);
|
const style = getComputedStyle(cell);
|
||||||
return text + parseFloat(style.paddingLeft) + parseFloat(style.paddingRight) + 1;
|
// 1.2mm slack for the cell borders and glyphs that overhang their advance width.
|
||||||
|
return text + parseFloat(style.paddingLeft) + parseFloat(style.paddingRight) + 1.2 * mm;
|
||||||
};
|
};
|
||||||
const measure = (table, mode) => {
|
const measure = (table, mode) => {
|
||||||
const holder = document.createElement('div');
|
const holder = document.createElement('div');
|
||||||
@@ -384,7 +385,7 @@ async function applyProportionalWidths(page, textMm) {
|
|||||||
for (const row of holder.querySelector('table').rows) {
|
for (const row of holder.querySelector('table').rows) {
|
||||||
let index = 0;
|
let index = 0;
|
||||||
for (const cell of row.cells) {
|
for (const cell of row.cells) {
|
||||||
if (cell.colSpan === 1) (columns[index] ??= []).push({ width: contentWidth(cell) / mm, head: cell.tagName === 'TH' });
|
if (cell.colSpan === 1) (columns[index] ??= []).push({ width: contentWidth(cell) / mm, head: cell.tagName === 'TH', short: cell.textContent.trim().length <= SHORT_CELL_CHARS });
|
||||||
index += cell.colSpan;
|
index += cell.colSpan;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -401,7 +402,9 @@ async function applyProportionalWidths(page, textMm) {
|
|||||||
let floor = narrow.map((c, i) => Math.min(Math.max(...c.map((x) => x.width)), longest[i]));
|
let floor = narrow.map((c, i) => Math.min(Math.max(...c.map((x) => x.width)), longest[i]));
|
||||||
// Short columns (IDs, dates, statuses) stay on one line when the page allows;
|
// Short columns (IDs, dates, statuses) stay on one line when the page allows;
|
||||||
// the prose columns then share what is left in proportion to their content.
|
// the prose columns then share what is left in proportion to their content.
|
||||||
const oneLine = floor.map((f, i) => (longest[i] <= SHORT_COLUMN_MM ? longest[i] : f));
|
// So do short entries in any column - a status word, a list of initials.
|
||||||
|
const shortest = line.map((c) => Math.max(0, ...c.filter((x) => x.short && !x.head).map((x) => x.width)));
|
||||||
|
const oneLine = floor.map((f, i) => (longest[i] <= SHORT_COLUMN_MM ? longest[i] : Math.max(f, shortest[i])));
|
||||||
if (oneLine.reduce((a, b) => a + b, 0) < availMm) floor = oneLine;
|
if (oneLine.reduce((a, b) => a + b, 0) < availMm) floor = oneLine;
|
||||||
const weight = line.map((c) => {
|
const weight = line.map((c) => {
|
||||||
const body = c.filter((x) => !x.head);
|
const body = c.filter((x) => !x.head);
|
||||||
@@ -462,7 +465,7 @@ async function applyProportionalWidths(page, textMm) {
|
|||||||
.map((span) => span.textContent);
|
.map((span) => span.textContent);
|
||||||
main.style.width = '';
|
main.style.width = '';
|
||||||
return [...new Set(clipped)];
|
return [...new Set(clipped)];
|
||||||
}, { availMm: textMm, SHORT_COLUMN_MM: 35 });
|
}, { availMm: textMm, SHORT_COLUMN_MM: 35, SHORT_CELL_CHARS: 16 });
|
||||||
}
|
}
|
||||||
|
|
||||||
main().catch((error) => { console.error(error); process.exit(1); });
|
main().catch((error) => { console.error(error); process.exit(1); });
|
||||||
|
|||||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user