wrolpi/app
lrnselfreliance 0ae8bd5442
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Controller Tests / controller-tests (push) Waiting to run
Jest Tests / jest-tests (push) Waiting to run
ui: a downloads table wider than the phone showing it (#660)
The two downloads tables came out 676px and 727px in a 540px window, so Completed At and
Control sat off the right edge and their buttons could not be reached without scrolling
sideways.

`.table-ellipsis` was trying to truncate under `table-layout: auto`, where a table is as
wide as its columns want to be and the container simply overflows.  The rule leaned on
`max-width: 0` to force an ellipsis and `min-width: 25em` to keep the text column readable
-- but 25em is 385px, and a floor wider than the screen makes the overflow certain.

Fixed layout inverts it: the columns divide the table's width and the column marked
`column-ellipsis` gives up what it cannot show.  Neither the max-width trick nor the floor
is needed then.  Columns that must fit something exact -- a checkbox, a group of buttons --
state a width; the rest is the truncating column's.

`table.table-ellipsis`, not the bare class: Mantine sets `table-layout` on its own
`.mantine-Table-table`, the same specificity and later in the cascade, so the first version
of this lost silently.  Every other property in the rule applied, which made the table look
fixed while it stayed auto -- the recurring table got *wider* than before, not narrower.

Three things the rework then had to answer for, each of them measured in the browser:

  * A header overran its column: "Completed At" printed on top of "Control", because
    `.wrolpi-th-sort` is nowrap so a label never splits from its arrow.  It wraps here, and
    needs `min-width: 0` as well -- the label is an anonymous flex item whose automatic
    minimum is its longest word, so without it the label still refuses to go below
    "Completed" and still overruns.

  * A grouped button was squeezed: `ButtonGroup` is a nowrap flex row whose children shrink,
    and the Stop button on a pending download came out 23px against its neighbour's 40 --
    clipped, and too small to hit.  The columns are sized for the widest group a row can
    have, so the buttons no longer give.

  * Status's Top Processes table had the same bug.  It already asked for `.table-ellipsis`
    and already marked its Command cell, so it overflowed a phone too (548px into 503px).
    The same rule fixes it, with widths for the three short readings.

A wrapped header is the fallback, not the layout, so every column is sized to hold its own
label on one line -- including on a phone.  "Download Frequency" is the exception at 11.7em,
which a phone cannot spare beside four other columns, so it takes a class that widens at the
tablet breakpoint and wraps below it.

Measured, nothing overflowing, no header overrun, no clipped cell, no shrunken button:

  540px   once   40 / 208 / 146 / 146      recurring  123 / 108 / 131 / 62 / 116
  1400px  once   40 / 1033 / 146 / 146     recurring  871 / 185 / 131 / 62 / 116

Desktop gains from it as well: the checkbox column drops from 90px to 40 and Completed At
from 291 to 146, so the URL column picks up about 255px.

Covered by five tests in the Cypress layout suite.  None of this is checkable in jsdom --
it is all resolved widths, and the central question is whether our `table-layout` beats the
one Mantine sets, which is exactly the part that failed silently.

69 suites / 1214 jest tests pass.
2026-08-12 10:08:55 -06:00
..
cypress test: the component suite's twelve failures, none of them about the component 2026-08-08 18:05:54 -06:00
public ui: media filtering is a per-theme setting, not a night-mode hardcode 2026-08-08 18:04:00 -06:00
scripts ui: the last of Semantic UI, in name and in dead CSS 2026-08-08 18:05:54 -06:00
src ui: a downloads table wider than the phone showing it (#660) 2026-08-12 10:08:55 -06:00
.gitignore A new start 2021-11-01 16:43:09 -06:00
cypress.config.js Skipping Caddy tests on CICD. 2026-03-10 20:30:46 -06:00
package-lock.json build: put the @babel pins back, and make them fail loudly if dropped again (#653) 2026-08-08 18:54:34 -06:00
package.json build: put the @babel pins back, and make them fail loudly if dropped again (#653) 2026-08-08 18:54:34 -06:00
README.md Fixing bug where file search would issue twice on load. 2023-04-09 14:34:33 -06:00
serve.json Adding serve.json so epub.html is not rewritten by serve. Buildling app during pi-gen/debian image builds. 2025-03-13 19:34:28 -06:00
tsconfig.json Converting Theme.js to typescript so we can use shorthands like Card.Icon. 2025-12-07 12:41:10 -07:00

Getting Started with Create React App

This project was bootstrapped with Create React App.

Available Scripts

In the project directory, you can run:

npm start

Runs the app in the development mode.
Open http://localhost:3000 to view it in your browser.

The page will reload when you make changes.
You may also see any lint errors in the console.

npm test

Launches the test runner in the interactive watch mode.
See the section about running tests for more information.

npm run build

Builds the app for production to the build folder.
It correctly bundles React in production mode and optimizes the build for the best performance.

The build is minified and the filenames include the hashes.
Your app is ready to be deployed!

See the section about deployment for more information.

npm run eject

Note: this is a one-way operation. Once you eject, you can't go back!

If you aren't satisfied with the build tool and configuration choices, you can eject at any time. This command will remove the single build dependency from your project.

Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except eject will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.

You don't have to ever use eject. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.

Learn More

You can learn more in the Create React App documentation.

To learn React, check out the React documentation.

Code Splitting

This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting

Analyzing the Bundle Size

This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size

Making a Progressive Web App

This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app

Advanced Configuration

This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration

Deployment

This section has moved here: https://facebook.github.io/create-react-app/docs/deployment

npm run build fails to minify

This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify