fix: hide completed task folder action on mobile and web

This commit is contained in:
Levi committed 2026-09-13 17:38:34 +08:00
1 parent 2e8672273c
commit d393d27ec7
3 files changed
+103 -36

No files matched your search

@@ -3,6 +3,7 @@ import 'package:flutter/material.dart' show Colors, Icons;
import 'package:flutter/widgets.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart' as shad;
import '../../../../../core/window/app_window_chrome.dart';
import '../../../../../shared/theme/app_design_tokens.dart';
import '../../../../../shared/theme/app_palette.dart';
import '../../../domain/task_record.dart';
@@ -237,7 +238,10 @@ class _ProgressContent extends StatelessWidget {
TaskStatus.downloading => [(Icons.pause, onPause), (Icons.close, onDelete)],
TaskStatus.paused => [(Icons.play_arrow, onResume), (Icons.close, onDelete)],
TaskStatus.failed => [(Icons.refresh, onResume), (Icons.delete_outline, onDelete)],
TaskStatus.completed => [(Icons.folder_open_outlined, null), (Icons.delete_outline, onDelete)],
TaskStatus.completed => [
if (AppWindowChrome.isDesktopWindow) (Icons.folder_open_outlined, null),
(Icons.delete_outline, onDelete),
],
};
return actions
@@ -306,7 +310,10 @@ class _CompletedContent extends StatelessWidget {
TaskStatus.downloading => [(Icons.pause, null), (Icons.close, onDelete)],
TaskStatus.paused => [(Icons.play_arrow, null), (Icons.close, onDelete)],
TaskStatus.failed => [(Icons.refresh, null), (Icons.delete_outline, onDelete)],
TaskStatus.completed => [(Icons.folder_open_outlined, onReveal), (Icons.delete_outline, onDelete)],
TaskStatus.completed => [
if (AppWindowChrome.isDesktopWindow) (Icons.folder_open_outlined, onReveal),
(Icons.delete_outline, onDelete),
],
};
return actions
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart' show Colors, Icons;
import 'package:flutter/widgets.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart' as shad;
import '../../../../../core/window/app_window_chrome.dart';
import '../../../../../shared/theme/app_design_tokens.dart';
import '../../../../../shared/theme/app_palette.dart';
import '../../../domain/task_record.dart';
@@ -171,7 +172,10 @@ class _TaskCardMobileState extends State<TaskCardMobile> {
TaskStatus.downloading => [(Icons.pause, widget.onPause), (Icons.close, widget.onDelete)],
TaskStatus.paused => [(Icons.play_arrow, widget.onResume), (Icons.close, widget.onDelete)],
TaskStatus.failed => [(Icons.refresh, widget.onResume), (Icons.delete_outline, widget.onDelete)],
TaskStatus.completed => [(Icons.folder_open_outlined, widget.onReveal), (Icons.delete_outline, widget.onDelete)],
TaskStatus.completed => [
if (AppWindowChrome.isDesktopWindow) (Icons.folder_open_outlined, widget.onReveal),
(Icons.delete_outline, widget.onDelete),
],
};
return actions
+89 -33
View File
@@ -1,7 +1,8 @@
import 'dart:async';
import 'dart:io';
import 'package:flutter/foundation.dart' show TargetPlatform, defaultTargetPlatform, debugDefaultTargetPlatformOverride;
import 'package:flutter/foundation.dart'
show TargetPlatform, defaultTargetPlatform, debugDefaultTargetPlatformOverride, kIsWeb;
import 'package:flutter/material.dart' show Icons, Scrollbar;
import 'package:flutter/gestures.dart' show PointerDeviceKind, kDoubleTapMinTime, kSecondaryMouseButton;
import 'package:flutter/rendering.dart' show RenderParagraph;
@@ -5065,45 +5066,100 @@ void main() {
expect(openedCount, 0);
});
testWidgets('completed task double click opens while folder action reveals', (WidgetTester tester) async {
await _setTestSize(tester, const Size(1024, 220));
var openedCount = 0;
var revealedCount = 0;
for (final width in [390.0, 1024.0]) {
testWidgets(
'completed card actions respect platform at width $width',
(tester) async {
await _setTestSize(tester, Size(width, 220));
var deleted = 0;
var revealed = 0;
await tester.pumpWidget(
shad.ShadcnApp(
theme: AppTheme.light(),
materialTheme: AppTheme.materialLight(),
home: Padding(
padding: const EdgeInsets.all(24),
child: TaskCard(
task: _taskRecord(id: 'platform-actions', name: 'done.zip', status: TaskStatus.completed),
selected: false,
batchMode: false,
selectedInBatch: false,
onPressed: () {},
onToggleBatch: () {},
onDelete: () => deleted++,
onReveal: () => revealed++,
),
),
),
);
await tester.pumpAndSettle();
final desktop =
!kIsWeb &&
{TargetPlatform.windows, TargetPlatform.macOS, TargetPlatform.linux}.contains(defaultTargetPlatform);
expect(find.byIcon(Icons.folder_open_outlined), desktop ? findsOneWidget : findsNothing);
expect(find.byIcon(Icons.delete_outline), findsOneWidget);
if (desktop) {
await tester.tap(find.byIcon(Icons.folder_open_outlined));
expect(revealed, 1);
}
await tester.tap(find.byIcon(Icons.delete_outline));
expect(deleted, 1);
expect(tester.takeException(), isNull);
},
variant: TargetPlatformVariant({
TargetPlatform.android,
TargetPlatform.iOS,
TargetPlatform.windows,
TargetPlatform.macOS,
TargetPlatform.linux,
}),
);
}
await tester.pumpWidget(
shad.ShadcnApp(
theme: AppTheme.light(),
materialTheme: AppTheme.materialLight(),
home: Padding(
padding: const EdgeInsets.all(24),
child: TaskCard(
task: _taskRecord(id: 'completed-actions', name: 'completed.zip', status: TaskStatus.completed),
selected: false,
batchMode: false,
selectedInBatch: false,
onPressed: () {},
onToggleBatch: () {},
onOpen: () => openedCount++,
onReveal: () => revealedCount++,
testWidgets(
'completed task double click opens while folder action reveals',
(WidgetTester tester) async {
await _setTestSize(tester, const Size(1024, 220));
var openedCount = 0;
var revealedCount = 0;
await tester.pumpWidget(
shad.ShadcnApp(
theme: AppTheme.light(),
materialTheme: AppTheme.materialLight(),
home: Padding(
padding: const EdgeInsets.all(24),
child: TaskCard(
task: _taskRecord(id: 'completed-actions', name: 'completed.zip', status: TaskStatus.completed),
selected: false,
batchMode: false,
selectedInBatch: false,
onPressed: () {},
onToggleBatch: () {},
onOpen: () => openedCount++,
onReveal: () => revealedCount++,
),
),
),
),
);
);
await tester.tap(find.text('completed.zip'));
await tester.pump(kDoubleTapMinTime);
await tester.tap(find.text('completed.zip'));
await tester.pumpAndSettle();
await tester.tap(find.text('completed.zip'));
await tester.pump(kDoubleTapMinTime);
await tester.tap(find.text('completed.zip'));
await tester.pumpAndSettle();
expect(openedCount, 1);
expect(revealedCount, 0);
expect(openedCount, 1);
expect(revealedCount, 0);
await tester.tap(find.byIcon(Icons.folder_open_outlined));
await tester.pump();
await tester.tap(find.byIcon(Icons.folder_open_outlined));
await tester.pump();
expect(openedCount, 1);
expect(revealedCount, 1);
});
expect(openedCount, 1);
expect(revealedCount, 1);
},
variant: TargetPlatformVariant.only(TargetPlatform.macOS),
skip: kIsWeb,
);
}
Future<void> _setTestSize(WidgetTester tester, Size size) async {