feat(design): the channel menu's Tags and Priority submenus (C1, E28 S3e3b)
Tags A-Z as in-place checks (the menu stays open for the next); Priority as the fixed steps 10 5 3 2 1 0, an off-scale current value ticked in its place. A pick re-sorts the list at once, moving only that row (placeByPriority, the server's order), and the table / card pager and the focus follow it (DataTable and useCardPager take a reveal seq, listNav.focusNavItem lands on the row's own "…", a virtualized card revealed first). ActionMenu rows take check: many | one. The menu reads the row fresh from the cache and keys its target by id.
This commit is contained in:
@@ -69,6 +69,7 @@ export default function DataTable<T>({
|
||||
onFiltersChange,
|
||||
fixedLayout = false,
|
||||
keyboardNav = false,
|
||||
reveal,
|
||||
}: {
|
||||
rows: T[];
|
||||
columns: Column<T>[];
|
||||
@@ -121,6 +122,10 @@ export default function DataTable<T>({
|
||||
// Enter clicks the element a column's render marks `data-nav-open` (the channel name). Both row
|
||||
// shapes register; listNav walks only the one on screen, so the hidden copy is never a stop.
|
||||
keyboardNav?: boolean;
|
||||
// Follow a row the caller just MOVED (a channel re-sorted by the priority its menu set): each new
|
||||
// `seq` turns to the page that now holds the row `key`. Focus is the caller's (it knows which of
|
||||
// the row's controls it came from); the page is the table's, so it is decided here.
|
||||
reveal?: { key: string; seq: number } | null;
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const initial = loadPersist(persistKey);
|
||||
@@ -208,6 +213,15 @@ export default function DataTable<T>({
|
||||
const allRows = size <= 0;
|
||||
const totalPages = allRows ? 1 : Math.max(1, Math.ceil(sorted.length / size));
|
||||
const safePage = Math.min(page, totalPages - 1);
|
||||
// Adjusted DURING render against the last seq seen (the house's key-change reset), so the frame
|
||||
// that re-sorted the row already shows its new page. Seeded with the mount's seq: arriving with a
|
||||
// stale reveal must not move a page nobody asked to move.
|
||||
const [revealSeen, setRevealSeen] = useState(reveal?.seq);
|
||||
if (reveal && reveal.seq !== revealSeen) {
|
||||
setRevealSeen(reveal.seq);
|
||||
const at = sorted.findIndex((row) => rowKey(row) === reveal.key);
|
||||
if (at >= 0 && !allRows) setPage(Math.floor(at / size));
|
||||
}
|
||||
const paged = allRows ? sorted : sorted.slice(safePage * size, safePage * size + size);
|
||||
|
||||
function toggleSort(key: string) {
|
||||
|
||||
Reference in New Issue
Block a user