UI Phase 2: cosmetic leftovers — compact Profile photo card, fit Users table

- Profile Photo card: replace the tall centered avatar+buttons stack with a
  compact horizontal row (avatar left, caption + Upload/Camera buttons right),
  roughly halving the card height and reclaiming the dead vertical space.
- TasQColumn gains an optional `minWidth`; the adaptive table now sums per-column
  minimums instead of a flat 200 px each. User Management sets narrow widths on
  its short columns (Role/Offices/Status/Last active) so all six columns fit at
  desktop width without the horizontal scroll that was clipping the Status
  column. Other tables keep the 200 px default (unchanged).

Verified: flutter analyze lib clean; flutter build web green; visual QA
(Profile, User Management) in dark.

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
2026-09-26 23:35:19 +08:00
parent 4685430406
commit e7706058b7
3 changed files with 74 additions and 45 deletions
@@ -199,10 +199,12 @@ class _UserManagementScreenState extends ConsumerState<UserManagementScreen> {
),
TasQColumn<Profile>(
header: 'Role',
minWidth: 120,
cellBuilder: (context, profile) => Text(_roleLabel(profile.role)),
),
TasQColumn<Profile>(
header: 'Offices',
minWidth: 100,
cellBuilder: (context, profile) {
final officesAssigned = officeCountByUser[profile.id] ?? 0;
return Text(officesAssigned == 0 ? 'None' : '$officesAssigned');
@@ -210,6 +212,7 @@ class _UserManagementScreenState extends ConsumerState<UserManagementScreen> {
),
TasQColumn<Profile>(
header: 'Status',
minWidth: 120,
cellBuilder: (context, profile) {
final statusAsync = ref.watch(adminUserStatusProvider(profile.id));
return statusAsync.when(
@@ -224,6 +227,7 @@ class _UserManagementScreenState extends ConsumerState<UserManagementScreen> {
),
TasQColumn<Profile>(
header: 'Last active',
minWidth: 150,
cellBuilder: (context, profile) {
final lastActive = lastActiveByUser[profile.id];
return Text(_formatLastActiveLabel(lastActive));