diff --git a/lib/base/http/api.dart b/lib/base/http/api.dart index 873fecc..a9fefdd 100644 --- a/lib/base/http/api.dart +++ b/lib/base/http/api.dart @@ -51,4 +51,12 @@ class Api { static Future> delTask(String cron) async { return await Http.delete(Url.ADD_TASK, [cron]); } + + static Future> pinTask(String cron) async { + return await Http.put(Url.PIN_TASK, [cron]); + } + + static Future> unpinTask(String cron) async { + return await Http.put(Url.UNPIN_TASK, [cron]); + } } diff --git a/lib/base/http/url.dart b/lib/base/http/url.dart index 4fb7ceb..cca3f84 100644 --- a/lib/base/http/url.dart +++ b/lib/base/http/url.dart @@ -5,6 +5,8 @@ class Url { static const STOP_TASKS = "/api/crons/stop"; static const TASK_DETAIL = "/api/crons/"; static const ADD_TASK = "/api/crons"; + static const PIN_TASK = "/api/crons/pin"; + static const UNPIN_TASK = "/api/crons/unpin"; static INTIME_LOG(String cronId) { return "/api/crons/$cronId/log"; diff --git a/lib/module/task/task_page.dart b/lib/module/task/task_page.dart index 36a9450..34f0bba 100644 --- a/lib/module/task/task_page.dart +++ b/lib/module/task/task_page.dart @@ -157,10 +157,9 @@ class TaskItemCell extends StatelessWidget { ), child: Container( color: bean.isPinned == 1 ? ref.watch(themeProvider).themeColor.searchBarBg() : Colors.transparent, - margin: const EdgeInsets.only(bottom: 7, top: 7), padding: const EdgeInsets.symmetric( horizontal: 15, - vertical: 5, + vertical: 8, ), child: Column( mainAxisSize: MainAxisSize.min, @@ -204,7 +203,7 @@ class TaskItemCell extends StatelessWidget { ], ), const SizedBox( - height: 5, + height: 8, ), Text( bean.schedule ?? "", @@ -324,6 +323,7 @@ class TaskItemCell extends StatelessWidget { child: Text(bean.isPinned! == 0 ? "置顶" : "取消置顶"), onPressed: () { Navigator.pop(context); + pinTask(); }, ), ], @@ -331,6 +331,10 @@ class TaskItemCell extends StatelessWidget { ); } + void pinTask() { + ref.read(taskProvider).pinTask(bean.sId!, bean.isPinned!); + } + void delTask(BuildContext context, WidgetRef ref) { showCupertinoDialog( context: context, diff --git a/lib/module/task/task_viewmodel.dart b/lib/module/task/task_viewmodel.dart index d78b0a5..c41e2d9 100644 --- a/lib/module/task/task_viewmodel.dart +++ b/lib/module/task/task_viewmodel.dart @@ -1,12 +1,8 @@ -import 'dart:convert'; -import 'dart:math'; - import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:qinglong_app/base/base_viewmodel.dart'; import 'package:qinglong_app/base/http/api.dart'; import 'package:qinglong_app/base/http/http.dart'; import 'package:qinglong_app/module/task/task_bean.dart'; -import 'package:qinglong_app/module/task/task_detail/task_detail_bean.dart'; var taskProvider = ChangeNotifierProvider((ref) => TaskViewModel()); @@ -42,6 +38,9 @@ class TaskViewModel extends BaseViewModel { list.sort((a, b) { return a.status!.compareTo(b.status!); }); + list.sort((a, b) { + return b.isPinned!.compareTo(a.isPinned!); + }); } Future runCrons(String cron) async { @@ -85,4 +84,28 @@ class TaskViewModel extends BaseViewModel { bean.command = result.command; notifyListeners(); } + + void pinTask(String sId, int isPinned) async { + if (isPinned == 1) { + HttpResponse response = await Api.unpinTask(sId); + + if (response.success) { + list.firstWhere((element) => element.sId == sId).isPinned = 0; + sortList(); + success(); + } else { + failToast(response.message, notify: true); + } + } else { + HttpResponse response = await Api.pinTask(sId); + + if (response.success) { + list.firstWhere((element) => element.sId == sId).isPinned = 1; + sortList(); + success(); + } else { + failToast(response.message, notify: true); + } + } + } }