From 33969d0b522af8d229a5dd8183858d60da017598 Mon Sep 17 00:00:00 2001 From: tthaogege <942519762@qq.com> Date: Mon, 27 Sep 2021 17:43:35 +0800 Subject: [PATCH 1/3] =?UTF-8?q?task=E8=AF=A6=E6=83=85=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/lib/common/colors.dart | 3 + ui/lib/models/task.dart | 11 + ui/lib/modules/agents/agent_item.dart | 26 +- ui/lib/modules/dashboard/controller.dart | 2 + ui/lib/modules/dashboard/entry_actions.dart | 6 +- ui/lib/modules/dashboard/index.dart | 44 ++-- .../task_detail/base_information_pane.dart | 232 ++++++++++++++++++ .../task_detail/identity_dialog.dart | 102 ++++++++ .../modules/dashboard/task_detail/index.dart | 28 +++ .../task_detail/return_task_list.dart | 43 ++++ .../task_detail/task_description.dart | 164 +++++++++++++ .../task_detail/task_information.dart | 51 ++++ .../dashboard/task_detail/time_log_pane.dart | 114 +++++++++ ui/lib/widgets/dot/index.dart | 45 ++++ ui/lib/widgets/progress_bar/index.dart | 6 +- ui/lib/widgets/svg_Dot/index.dart | 50 ++++ ui/lib/widgets/tabs/index.dart | 67 +++++ ui/lib/widgets/tabs/model.dart | 11 + ui/lib/widgets/tabs/tab_title.dart | 54 ++++ 19 files changed, 1012 insertions(+), 47 deletions(-) create mode 100644 ui/lib/modules/dashboard/task_detail/base_information_pane.dart create mode 100644 ui/lib/modules/dashboard/task_detail/identity_dialog.dart create mode 100644 ui/lib/modules/dashboard/task_detail/index.dart create mode 100644 ui/lib/modules/dashboard/task_detail/return_task_list.dart create mode 100644 ui/lib/modules/dashboard/task_detail/task_description.dart create mode 100644 ui/lib/modules/dashboard/task_detail/task_information.dart create mode 100644 ui/lib/modules/dashboard/task_detail/time_log_pane.dart create mode 100644 ui/lib/widgets/dot/index.dart create mode 100644 ui/lib/widgets/svg_Dot/index.dart create mode 100644 ui/lib/widgets/tabs/index.dart create mode 100644 ui/lib/widgets/tabs/model.dart create mode 100644 ui/lib/widgets/tabs/tab_title.dart diff --git a/ui/lib/common/colors.dart b/ui/lib/common/colors.dart index d798121..f79a060 100644 --- a/ui/lib/common/colors.dart +++ b/ui/lib/common/colors.dart @@ -28,4 +28,7 @@ Color offlineColor = rgba(148, 163, 184, 1); Color successMessageColor = rgba(239, 249, 243, 1); Color successFontColor = rgba(94, 191, 134, 1); +Color timeLogBackgroundColor = rgba(10, 12, 16, 1); +Color logFontColor = rgba(141, 148, 157, 1); + diff --git a/ui/lib/models/task.dart b/ui/lib/models/task.dart index ff4b1d8..1bddf28 100644 --- a/ui/lib/models/task.dart +++ b/ui/lib/models/task.dart @@ -143,3 +143,14 @@ class Staffs { int length() => staffs.length; } +class TimeLog { + String logContent; + int time; + + TimeLog({ + required this.logContent, + required this.time + }); +} + + diff --git a/ui/lib/modules/agents/agent_item.dart b/ui/lib/modules/agents/agent_item.dart index 2355cb2..b562fbe 100644 --- a/ui/lib/modules/agents/agent_item.dart +++ b/ui/lib/modules/agents/agent_item.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:ui/common/svg_provider.dart'; import 'package:ui/models/agents.dart'; +import 'package:ui/widgets/dot/index.dart'; import '../../common/colors.dart'; import 'controller.dart'; @@ -58,27 +59,10 @@ class AgentItem extends GetView { fontWeight: FontWeight.w600, )), SizedBox(height: 2), - Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - height: 8, - width: 8, - margin: EdgeInsets.only(right: 4, top: 3), - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(4)), - color: this.agent.isOnline ? onlineColor : offlineColor - ), - ), - SelectableText(this.agent.isOnline ? "Online".tr : "Offline".tr, - style: TextStyle( - color: regularFontColor, - fontSize: 12, - fontWeight: FontWeight.w400, - )) - ], - ) + Dot( + dotTitle: this.agent.isOnline ? "Online".tr : "Offline".tr, + dotColor: this.agent.isOnline ? onlineColor : offlineColor, + ), ]), getShowItem(children: [ SelectableText(this.agent.id, diff --git a/ui/lib/modules/dashboard/controller.dart b/ui/lib/modules/dashboard/controller.dart index 9d3e1df..63a6b3a 100644 --- a/ui/lib/modules/dashboard/controller.dart +++ b/ui/lib/modules/dashboard/controller.dart @@ -9,6 +9,8 @@ class DashboardController extends GetxController { Rx tasks = Tasks.fromList([]).obs; Rx taskDetail = TaskDetail.fromMap({}).obs; RxString filters = ''.obs; + RxBool showDetail = true.obs; + RxString detailTaskId = ''.obs; final String query = r''' query { diff --git a/ui/lib/modules/dashboard/entry_actions.dart b/ui/lib/modules/dashboard/entry_actions.dart index 84f8438..8be745f 100644 --- a/ui/lib/modules/dashboard/entry_actions.dart +++ b/ui/lib/modules/dashboard/entry_actions.dart @@ -36,7 +36,10 @@ class EntryActions extends GetView { ), ), ), - onPressed: () => Get.dialog(TaskDetailDialog(taskId: data["id"])), + onPressed: () { + // Get.dialog(TaskDetailDialog(taskId: data["id"])); + controller.showDetail(true); + }, ), TextButton( child: Padding( @@ -67,7 +70,6 @@ class EntryMoreActions extends GetView { @override Widget build(BuildContext context) { - // String name = data["name"]; return MoreActions( onSelected: (String op) { diff --git a/ui/lib/modules/dashboard/index.dart b/ui/lib/modules/dashboard/index.dart index e4b2468..804f941 100644 --- a/ui/lib/modules/dashboard/index.dart +++ b/ui/lib/modules/dashboard/index.dart @@ -1,5 +1,6 @@ import 'package:get/get.dart'; import 'package:flutter/material.dart'; +import 'package:ui/modules/dashboard/task_detail/index.dart'; import '../layout/index.dart'; import '../../widgets/page_description/index.dart'; @@ -17,30 +18,29 @@ class Dashboard extends GetView { c.getTasks(); return Layout( - child: Column( - children: [ - PageDescription( - icon: IconData(0xe600, fontFamily: 'tpIcon'), - title: 'Tasks'.tr, - subtitle: "Create and manage your data migration tasks".tr, - ), - Obx( - () => controller.tasks.value.length() == 0 + child: Obx(() => controller.showDetail.value + ? TaskDetail() + : Column( + children: [ + PageDescription( + icon: IconData(0xe600, fontFamily: 'tpIcon'), + title: 'Tasks'.tr, + subtitle: "Create and manage your data migration tasks".tr, + ), + controller.tasks.value.length() == 0 ? EmptyEntryList( - icon: IconData(0xe600, fontFamily: 'tpIcon'), - title: 'The task list is empty'.tr, - subTitle: - 'Please click the button below to create a task'.tr, - buttonText: 'Create task'.tr, - onClick: () => Get.dialog(CreateTaskDialog( - name: 'DM task 1', - getTasks: controller.getTasks, - )), - ) + icon: IconData(0xe600, fontFamily: 'tpIcon'), + title: 'The task list is empty'.tr, + subTitle: 'Please click the button below to create a task'.tr, + buttonText: 'Create task'.tr, + onClick: () => Get.dialog(CreateTaskDialog( + name: 'DM task 1', + getTasks: controller.getTasks, + )), + ) : EntryList(), - ), - ], - ), + ], + )), ); } } diff --git a/ui/lib/modules/dashboard/task_detail/base_information_pane.dart b/ui/lib/modules/dashboard/task_detail/base_information_pane.dart new file mode 100644 index 0000000..9446dfc --- /dev/null +++ b/ui/lib/modules/dashboard/task_detail/base_information_pane.dart @@ -0,0 +1,232 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:ui/common/colors.dart'; + +import 'identity_dialog.dart'; + +class BaseInformationPane extends StatelessWidget { + const BaseInformationPane({ Key? key }) : super(key: key); + + Widget getTitle(String title) { + return Row( + children: [ + Container( + margin: EdgeInsets.only(left: 6, right: 10, top: 10, bottom: 6), + height: 4, + width: 4, + color: regularFontColor, + ), + SelectableText( + title, + style: TextStyle( + fontFamily: 'Roboto', + fontWeight: FontWeight.w600, + fontStyle: FontStyle.normal, + fontSize: 14, + color: regularFontColor, + ), + ) + ], + ); + } + + Widget getPane(List children, {bool showBorder = true}) { + return Container( + padding: EdgeInsets.only(bottom: 30, top: 10), + decoration: BoxDecoration( + color: Colors.white, + border: Border(bottom: BorderSide(color: showBorder ? rgba(226, 232, 240, 1) : Colors.white, width: 1, style: BorderStyle.solid)), + ), + child: Row( + children: [ + Expanded( + child: Column( + children: children, + ), + ) + ], + ), + ); + } + + Widget getContent(String title, {String ?textContent, Widget ?customWidet}) { + if (textContent == null && customWidet == null) { + throw ArgumentError('Please fill in customWidet or textContent!'); + } + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SelectableText( + title, + style: TextStyle( + fontFamily: 'Roboto', + fontWeight: FontWeight.w500, + fontStyle: FontStyle.normal, + fontSize: 12, + color: offlineColor, + ), + ), + SizedBox(height: 5,), + textContent != null ? SelectableText( + textContent as String, + style: TextStyle( + fontFamily: 'Roboto', + fontWeight: FontWeight.w600, + fontStyle: FontStyle.normal, + fontSize: 12, + color: regularFontColor, + ), + ) + : customWidet as Widget, + ], + ); + } + + Color getForeGroundColor(Set states) { + if (states.contains(MaterialState.hovered)) { + return primaryColor; + } + + return regularFontColor; + } + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.only(bottom: 30), + child: Column( + children: [ + Expanded( + child: ListView( + children: [ + getPane( + [ + getTitle('source library settings'), + SizedBox(height: 20,), + Row( + children: [ + SizedBox(width: 20,), + Expanded( + flex: 1, + child: getContent( + 'target library', + textContent: 'local files - FS', + ), + ), + Expanded( + flex: 2, + child: getContent( + 'Work directory', + textContent: '/ home / jack998 / Downloads', + ), + ) + ], + ) + ] + ), + getPane( + [ + getTitle('target library settings'), + SizedBox(height: 20,), + Row( + children: [ + SizedBox(width: 20,), + Expanded( + flex: 1, + child: getContent( + 'target library', + textContent: 'local files - FS' + ), + ), + Expanded( + flex: 2, + child: getContent( + 'identity', + customWidet: TextButton( + style: ButtonStyle( + foregroundColor: MaterialStateProperty.resolveWith(getForeGroundColor), + overlayColor: MaterialStateProperty.resolveWith((states) => Colors.white), + ), + onPressed: () { + Get.dialog(IdentityDialog()); + }, + child: Text( + 'QingStor - identity 1', + style: TextStyle( + decoration: TextDecoration.underline, + ) + ) + ) + ), + ) + ], + ), + SizedBox(height: 20,), + Row( + children: [ + SizedBox(width: 20,), + Expanded( + flex: 1, + child: getContent( + 'bucket name', + textContent: 'QingStor bucket name', + ), + ), + Expanded( + flex: 2, + child: getContent( + 'Work directory', + textContent: 'Root directory / file001 / ewqessad', + ), + ) + ], + ) + ] + ), + getPane( + [ + getTitle('other settings'), + SizedBox(height: 20,), + Row( + children: [ + SizedBox(width: 20,), + Expanded( + flex: 1, + child: getContent( + 'task type', + textContent: 'One - time task', + ), + ), + Expanded( + flex: 2, + child: getContent( + 'Data validate method', + textContent: 'md5', + ), + ) + ], + ), + SizedBox(height: 20,), + Row( + children: [ + SizedBox(width: 20,), + Expanded( + flex: 1, + child: getContent( + 'Skip existing files condition', + textContent: 'file update time', + ), + ) + ], + ) + ], + showBorder: false, + ), + ], + ), + ) + ], + ), + ); + } +} diff --git a/ui/lib/modules/dashboard/task_detail/identity_dialog.dart b/ui/lib/modules/dashboard/task_detail/identity_dialog.dart new file mode 100644 index 0000000..6e1610d --- /dev/null +++ b/ui/lib/modules/dashboard/task_detail/identity_dialog.dart @@ -0,0 +1,102 @@ +import 'package:get/get.dart'; +import 'package:flutter/material.dart'; +import 'package:ui/common/colors.dart'; +import 'package:ui/modules/dashboard/create_task_dialog/controller.dart'; + +import '../../../widgets/dialog/index.dart'; +import '../../../widgets/button/index.dart'; +import '../../../widgets/button/constants.dart'; + +class IdentityDialog extends StatelessWidget { + final CreateTaskController controller = Get.put(CreateTaskController()); + + @override + Widget build(BuildContext context) { + return CommonDialog( + title: 'QingStor - identity 1'.tr, + width: 800, + content: Container( + width: 320, + height: 269, + padding: EdgeInsets.all(30), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SelectableText( + 'credential', + style: TextStyle( + fontFamily: 'Roboto', + fontWeight: FontWeight.w500, + fontStyle: FontStyle.normal, + fontSize: 12, + color: offlineColor, + ), + ), + SizedBox(height: 5,), + SelectableText( + 'hmac', + style: TextStyle( + fontFamily: 'Roboto', + fontWeight: FontWeight.w600, + fontStyle: FontStyle.normal, + fontSize: 12, + color: regularFontColor, + ), + ), + SizedBox(height: 5,), + SelectableText( + 'David9823124', + style: TextStyle( + fontFamily: 'Roboto', + fontWeight: FontWeight.w600, + fontStyle: FontStyle.normal, + fontSize: 12, + color: regularFontColor, + ), + ), + SizedBox(height: 5,), + SelectableText( + '**********', + style: TextStyle( + fontFamily: 'Roboto', + fontWeight: FontWeight.w600, + fontStyle: FontStyle.normal, + fontSize: 12, + color: regularFontColor, + ), + ), + SizedBox(height: 20,), + SelectableText( + 'endpoint', + style: TextStyle( + fontFamily: 'Roboto', + fontWeight: FontWeight.w500, + fontStyle: FontStyle.normal, + fontSize: 12, + color: offlineColor, + ), + ), + SizedBox(height: 5,), + SelectableText( + 'https://qingstor.com:443', + style: TextStyle( + fontFamily: 'Roboto', + fontWeight: FontWeight.w600, + fontStyle: FontStyle.normal, + fontSize: 12, + color: regularFontColor, + ), + ), + ], + ) + ], + ), + ), + onClose: controller.closeDialog, + buttons: [], + ); + } +} diff --git a/ui/lib/modules/dashboard/task_detail/index.dart b/ui/lib/modules/dashboard/task_detail/index.dart new file mode 100644 index 0000000..db2c40d --- /dev/null +++ b/ui/lib/modules/dashboard/task_detail/index.dart @@ -0,0 +1,28 @@ +import 'package:get/get.dart'; +import 'package:flutter/material.dart'; +import 'package:ui/modules/dashboard/task_detail/return_task_list.dart'; + +import 'task_description.dart'; +import 'task_information.dart'; + +import '../controller.dart'; + +class TaskDetail extends GetView { + + @override + Widget build(BuildContext context) { + return Column( + children: [ + ReturnToList( + title: "Return Tasks List".tr, + onTap: () { + controller.showDetail(false); + controller.detailTaskId(''); + } + ), + TaskDescription(), + TaskInformation() + ], + ); + } +} diff --git a/ui/lib/modules/dashboard/task_detail/return_task_list.dart b/ui/lib/modules/dashboard/task_detail/return_task_list.dart new file mode 100644 index 0000000..2d42164 --- /dev/null +++ b/ui/lib/modules/dashboard/task_detail/return_task_list.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; + +import '../../../common/colors.dart'; + +class ReturnToList extends StatelessWidget { + final String title; + final Function onTap; + + const ReturnToList({ + required this.title, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.only(bottom: 10), + child: GestureDetector( + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + margin: EdgeInsets.only(top: 3, right: 8), + child: Icon(IconData(0xe607, fontFamily: 'tpIcon'), size: 20,), + ), + SelectableText( + title, + style: TextStyle( + fontSize: 14, + fontFamily: 'Roboto', + fontWeight: FontWeight.normal, + fontStyle: FontStyle.normal, + color: regularFontColor, + ), + ), + ], + ), + onTap: () => onTap(), + ), + ); + } +} diff --git a/ui/lib/modules/dashboard/task_detail/task_description.dart b/ui/lib/modules/dashboard/task_detail/task_description.dart new file mode 100644 index 0000000..c6fbb08 --- /dev/null +++ b/ui/lib/modules/dashboard/task_detail/task_description.dart @@ -0,0 +1,164 @@ +import 'package:get/get.dart'; +import 'package:ui/common/colors.dart'; +import 'package:ui/common/svg_provider.dart'; +import 'package:ui/models/task.dart'; +import 'package:flutter/material.dart'; +import 'package:ui/widgets/button/constants.dart'; +import 'package:ui/widgets/button/index.dart'; +import 'package:ui/widgets/dot/index.dart'; +import 'package:ui/widgets/page_container/index.dart'; +import 'package:ui/widgets/progress_bar/index.dart'; +import 'package:ui/widgets/svg_Dot/index.dart'; + +import '../controller.dart'; + +class TaskDescription extends GetView { + + @override + Widget build(BuildContext context) { + return WidgetContainer( + margin: EdgeInsets.only(bottom: 16.0), + child: Padding( + padding: EdgeInsets.all(20.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 60.0, + height: 60.0, + margin: EdgeInsets.only(right: 16.0), + decoration: new BoxDecoration( + color: rgba(104, 131, 237, 0.1), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(60.0), + bottomLeft: Radius.circular(60.0), + bottomRight: Radius.circular(60.0), + ), + ), + child: Center( + child: Icon(IconData(0xe600, fontFamily: 'tpIcon'), size: 32, color: primaryBackgroundColor), + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SelectableText('DM Task - 1', style: Theme.of(context).textTheme.headline2), + SelectableText('task ID:DM 2021041223', style: Theme.of(context).textTheme.bodyText2), + ], + ), + SizedBox(width: 30,), + Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Dot( + dotTitle: "Running".tr, + dotColor: primaryColor, + ), + SizedBox(width: 20,), + SvgDot( + dotTitle: 'Agent 1', + src: 'images/agents.svg', + ), + SizedBox(width: 20,), + SvgDot( + dotTitle: 'Agent 2', + src: 'images/agents.svg', + ), + ], + ), + ), + Button( + icon: IconData(0xe605, fontFamily: 'tpIcon'), + type: ButtonType.primary, + child: Text('Pause'), + onPressed: () {}, + ), + ], + ), + /// task progress + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 60.0, + height: 60.0, + margin: EdgeInsets.only(right: 16.0), + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SelectableText( + 'Task Progress'.tr, + style: TextStyle( + fontFamily: 'Roboto', + fontStyle: FontStyle.normal, + fontWeight: FontWeight.w700, + fontSize: 12, + color: headlineFontColor, + ), + ), + SizedBox(height: 14,), + ProgressBar( + ratio: 0.4, + barWidth: 480, + barHeight: 12, + barColor: onlineColor, + description: 'File size : 312 MB / 912 MB', + ) + ], + ), + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SelectableText( + 'Used time : 9h 33min'.tr, + style: TextStyle( + fontFamily: 'Roboto', + fontStyle: FontStyle.normal, + fontWeight: FontWeight.normal, + fontSize: 12, + color: headlineFontColor, + ), + ), + SizedBox(height: 5,), + SelectableText( + 'Remaining time : 10h 26min'.tr, + style: TextStyle( + fontFamily: 'Roboto', + fontStyle: FontStyle.normal, + fontWeight: FontWeight.normal, + fontSize: 12, + color: headlineFontColor, + ), + ), + SizedBox(height: 5,), + SelectableText( + 'Number of files : 3525 / 9931'.tr, + style: TextStyle( + fontFamily: 'Roboto', + fontStyle: FontStyle.normal, + fontWeight: FontWeight.normal, + fontSize: 12, + color: headlineFontColor, + ), + ), + ], + ), + ) + ], + ) + ], + ), + ), + ); + } +} diff --git a/ui/lib/modules/dashboard/task_detail/task_information.dart b/ui/lib/modules/dashboard/task_detail/task_information.dart new file mode 100644 index 0000000..e92c28b --- /dev/null +++ b/ui/lib/modules/dashboard/task_detail/task_information.dart @@ -0,0 +1,51 @@ +import 'package:date_format/date_format.dart'; +import 'package:get/get.dart'; +import 'package:flutter/material.dart'; +import 'package:ui/common/colors.dart'; +import 'package:ui/models/task.dart'; +import 'package:ui/widgets/page_container/index.dart'; +import 'package:ui/widgets/tabs/index.dart'; +import 'package:ui/widgets/tabs/model.dart'; + +import 'time_log_pane.dart'; +import 'base_information_pane.dart'; + +import '../controller.dart'; + + +class TaskInformation extends GetView { + + List TabsList = [ + TabPane( + tabTitle: 'Base Information'.tr, + pane: BaseInformationPane() + ), + TabPane( + tabTitle: 'Real - Time Log'.tr, + pane: TimeLogPane( + logTitle: 'Unit Test (1.16, macos-latest)', + description: 'Successed on 18 Mar in 53s', + logList: [ + TimeLog(logContent: 'Set up job', time: 3), + TimeLog(logContent: 'Set up Go 1.x', time: 2), + TimeLog(logContent: 'Build', time: 44), + TimeLog(logContent: 'Test', time: 23) + ], + ) + ), + ]; + + @override + Widget build(BuildContext context) { + return Expanded( + child: WidgetContainer( + child: Container( + padding: EdgeInsets.all(10), + child: Tabs( + titleList: TabsList, + ), + ), + ), + ); + } +} diff --git a/ui/lib/modules/dashboard/task_detail/time_log_pane.dart b/ui/lib/modules/dashboard/task_detail/time_log_pane.dart new file mode 100644 index 0000000..154858b --- /dev/null +++ b/ui/lib/modules/dashboard/task_detail/time_log_pane.dart @@ -0,0 +1,114 @@ +import 'package:flutter/material.dart'; +import 'package:ui/common/colors.dart'; +import 'package:ui/models/task.dart'; + +class TimeLogPane extends StatelessWidget { + + final String logTitle; + final String description; + final List logList; + + const TimeLogPane({ + required this.logTitle, + required this.description, + required this.logList + }); + + + @override + Widget build(BuildContext context) { + return Container( + color: timeLogBackgroundColor, + padding: EdgeInsets.symmetric(vertical: 20), + child: Column( + children: [ + Row( + children: [ + Expanded( + child: Container( + padding: EdgeInsets.only(left: 20, bottom: 20), + decoration: BoxDecoration( + color: timeLogBackgroundColor, + boxShadow: [ + BoxShadow(offset: Offset(0, 1), color: rgba(226, 232, 240, 0.2)) + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SelectableText( + logTitle, + style: TextStyle( + color: rgba(202, 209, 216, 1), + fontSize: 18, + fontWeight: FontWeight.w600, + fontFamily: 'Roboto' + ), + ), + SelectableText( + description, + style: TextStyle( + color: logFontColor, + fontSize: 12, + fontWeight: FontWeight.normal, + fontFamily: 'Roboto' + ), + ) + ], + ) + ), + ) + ], + ), + Expanded( + child: ListView( + children: logList.length > 0 + ? logList.map((TimeLog item) => Container( + padding: EdgeInsets.only(left: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Container( + padding: EdgeInsets.only(top: 10, bottom: 10, right: 7), + margin: EdgeInsets.only(top: 3), + child: Icon( + Icons.check_circle, + size: 16, + color: logFontColor, + ), + ), + SelectableText( + item.logContent, + style: TextStyle( + color: logFontColor, + fontSize: 12, + fontWeight: FontWeight.normal + ) + ) + ], + ), + Padding( + padding: EdgeInsets.only(right: 10), + child: SelectableText( + '${item.time}s', + style: TextStyle( + color: logFontColor, + fontSize: 12, + fontWeight: FontWeight.normal, + fontFamily: 'Roboto' + ) + ), + ) + ], + ), + )).toList() + : [], + ), + ) + ], + ), + ); + } +} diff --git a/ui/lib/widgets/dot/index.dart b/ui/lib/widgets/dot/index.dart new file mode 100644 index 0000000..f3c250f --- /dev/null +++ b/ui/lib/widgets/dot/index.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +import '../../common/colors.dart'; + +class Dot extends StatelessWidget { + + final String dotTitle; + final Color ?dotColor; + final Color ?titleColor; + + + const Dot({ + required this.dotTitle, + this.dotColor, + this.titleColor + }); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + height: 8, + width: 8, + margin: EdgeInsets.only(right: 9, top: 3), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(4)), + color: dotColor ?? onlineColor), + ), + SelectableText( + dotTitle, + style: TextStyle( + color: titleColor ?? regularFontColor, + fontSize: 12, + fontWeight: FontWeight.normal, + fontFamily: 'Roboto', + fontStyle: FontStyle.normal, + ) + ) + ], + ); + } +} diff --git a/ui/lib/widgets/progress_bar/index.dart b/ui/lib/widgets/progress_bar/index.dart index a24361f..51ea9ec 100644 --- a/ui/lib/widgets/progress_bar/index.dart +++ b/ui/lib/widgets/progress_bar/index.dart @@ -7,12 +7,14 @@ class ProgressBar extends StatelessWidget { final double barWidth; final double barHeight; final String description; + final Color ?barColor; ProgressBar({ required this.ratio, this.barWidth = 140, this.barHeight = 6, this.description = '', + this.barColor, }); @override @@ -29,14 +31,14 @@ class ProgressBar extends StatelessWidget { height: barHeight, alignment: Alignment.topLeft, decoration: BoxDecoration( - color: rgba(242, 242, 242, 1), + color: barColor != null ? barColor?.withOpacity(0.1) : rgba(242, 242, 242, 1), borderRadius: BorderRadius.all(Radius.circular(30)), ), child: Container( width: ratio * barWidth, height: barHeight, decoration: BoxDecoration( - color: Theme.of(context).primaryColor, + color: barColor ?? Theme.of(context).primaryColor, borderRadius: BorderRadius.all(Radius.circular(30)), ), ), diff --git a/ui/lib/widgets/svg_Dot/index.dart b/ui/lib/widgets/svg_Dot/index.dart new file mode 100644 index 0000000..1306486 --- /dev/null +++ b/ui/lib/widgets/svg_Dot/index.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:ui/common/colors.dart'; +import 'package:ui/common/svg_provider.dart'; + +class SvgDot extends StatelessWidget { + final double ?size; + final String src; + final String dotTitle; + final Color ?titleColor; + + const SvgDot({ + this.size = 16, + required this.src, + required this.dotTitle, + this.titleColor + }); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Container( + height: size, + width: size, + margin: EdgeInsets.only(top: 5, right: 9), + decoration: BoxDecoration( + image: DecorationImage( + image: SvgProvider( + src, + size: Size(128, 128), + color: rgba(255, 255, 255, 1), + ), + fit: BoxFit.fill, + ), + ), + ), + SelectableText( + dotTitle, + style: TextStyle( + color: titleColor ?? regularFontColor, + fontSize: 12, + fontWeight: FontWeight.normal, + fontFamily: 'Roboto', + fontStyle: FontStyle.normal, + ) + ) + ], + ); + } +} diff --git a/ui/lib/widgets/tabs/index.dart b/ui/lib/widgets/tabs/index.dart new file mode 100644 index 0000000..4b9f252 --- /dev/null +++ b/ui/lib/widgets/tabs/index.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:ui/common/colors.dart'; + +import 'model.dart'; +import 'tab_title.dart'; + +class Tabs extends StatefulWidget { + + final List titleList; + + const Tabs({ + required this.titleList, + }); + + @override + _TabsState createState() => _TabsState(); +} + +class _TabsState extends State { + late String selectString; + late Widget showWidget; + + @override + void initState() { + super.initState(); + selectString = widget.titleList[0].tabTitle; + showWidget = widget.titleList[0].pane; + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + margin: EdgeInsets.all(10), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow(offset: Offset(0, 1), color: rgba(226, 232, 240, 1)), + BoxShadow(offset: Offset(-1, 0), color: Colors.white), + BoxShadow(offset: Offset(1, 0), color: Colors.white), + ], + ), + child: Row( + children: widget.titleList + .map((TabPane item) => TabTitle( + selected: selectString == item.tabTitle, + title: item.tabTitle, + onPressed: () { + setState(() { + selectString = item.tabTitle; + showWidget = item.pane; + }); + }) + ).toList() + ), + ), + Expanded( + child: Container( + child: showWidget, + ), + ) + ], + ); + } +} diff --git a/ui/lib/widgets/tabs/model.dart b/ui/lib/widgets/tabs/model.dart new file mode 100644 index 0000000..0744b2f --- /dev/null +++ b/ui/lib/widgets/tabs/model.dart @@ -0,0 +1,11 @@ +import 'package:flutter/material.dart'; + +class TabPane { + String tabTitle; + Widget pane; + + TabPane({ + required this.tabTitle, + required this.pane + }); +} diff --git a/ui/lib/widgets/tabs/tab_title.dart b/ui/lib/widgets/tabs/tab_title.dart new file mode 100644 index 0000000..d27d814 --- /dev/null +++ b/ui/lib/widgets/tabs/tab_title.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +import 'package:ui/common/colors.dart'; + + +class TabTitle extends StatelessWidget { + final String title; + final VoidCallback onPressed; + final bool selected; + + TabTitle({ + required this.selected, + required this.title, + required this.onPressed, + }); + + Color getForeGroundColor(Set states) { + if (states.contains(MaterialState.hovered) || selected) { + return primaryColor; + } + + return regularFontColor; + } + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.only(right: 20.0), + padding: EdgeInsets.only(bottom: 8.0), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: selected ? [ + BoxShadow(offset: Offset(0, 2), color: primaryColor), + BoxShadow(offset: Offset(-1, 0), color: Colors.white), + BoxShadow(offset: Offset(1, 0), color: Colors.white), + ] : [], + ), + child: TextButton( + style: ButtonStyle( + foregroundColor: MaterialStateProperty.resolveWith(getForeGroundColor), + overlayColor: MaterialStateProperty.resolveWith((states) => Colors.white), + textStyle: MaterialStateProperty.all(TextStyle( + fontFamily: 'Roboto', + fontWeight: selected ? FontWeight.bold : FontWeight.normal, + fontStyle: FontStyle.normal, + fontSize: 14, + color: regularFontColor + )) + ), + onPressed: onPressed, + child: Text("$title"), + ), + ); + } +} From 12a46c641e8b078ec37b1aa9620714f134c91120 Mon Sep 17 00:00:00 2001 From: tthaogege <942519762@qq.com> Date: Sat, 9 Oct 2021 16:02:50 +0800 Subject: [PATCH 2/3] ui:task detail change --- ui/lib/modules/dashboard/controller.dart | 2 +- .../task_detail/base_information_pane.dart | 20 ++++---- .../task_detail/identity_dialog.dart | 4 +- .../modules/dashboard/task_detail/index.dart | 2 +- .../task_detail/return_task_list.dart | 48 +++++++++++-------- .../task_detail/task_description.dart | 6 +-- .../task_detail/task_information.dart | 4 +- 7 files changed, 48 insertions(+), 38 deletions(-) diff --git a/ui/lib/modules/dashboard/controller.dart b/ui/lib/modules/dashboard/controller.dart index 63a6b3a..5674453 100644 --- a/ui/lib/modules/dashboard/controller.dart +++ b/ui/lib/modules/dashboard/controller.dart @@ -9,7 +9,7 @@ class DashboardController extends GetxController { Rx tasks = Tasks.fromList([]).obs; Rx taskDetail = TaskDetail.fromMap({}).obs; RxString filters = ''.obs; - RxBool showDetail = true.obs; + RxBool showDetail = false.obs; RxString detailTaskId = ''.obs; final String query = r''' diff --git a/ui/lib/modules/dashboard/task_detail/base_information_pane.dart b/ui/lib/modules/dashboard/task_detail/base_information_pane.dart index 9446dfc..43f8e65 100644 --- a/ui/lib/modules/dashboard/task_detail/base_information_pane.dart +++ b/ui/lib/modules/dashboard/task_detail/base_information_pane.dart @@ -101,7 +101,7 @@ class BaseInformationPane extends StatelessWidget { children: [ getPane( [ - getTitle('source library settings'), + getTitle('Source library settings'), SizedBox(height: 20,), Row( children: [ @@ -109,8 +109,8 @@ class BaseInformationPane extends StatelessWidget { Expanded( flex: 1, child: getContent( - 'target library', - textContent: 'local files - FS', + 'Target library', + textContent: 'Local files - FS', ), ), Expanded( @@ -126,7 +126,7 @@ class BaseInformationPane extends StatelessWidget { ), getPane( [ - getTitle('target library settings'), + getTitle('Target library settings'), SizedBox(height: 20,), Row( children: [ @@ -134,14 +134,14 @@ class BaseInformationPane extends StatelessWidget { Expanded( flex: 1, child: getContent( - 'target library', - textContent: 'local files - FS' + 'Target library', + textContent: 'Local files - FS' ), ), Expanded( flex: 2, child: getContent( - 'identity', + 'Identity', customWidet: TextButton( style: ButtonStyle( foregroundColor: MaterialStateProperty.resolveWith(getForeGroundColor), @@ -168,7 +168,7 @@ class BaseInformationPane extends StatelessWidget { Expanded( flex: 1, child: getContent( - 'bucket name', + 'Bucket name', textContent: 'QingStor bucket name', ), ), @@ -185,7 +185,7 @@ class BaseInformationPane extends StatelessWidget { ), getPane( [ - getTitle('other settings'), + getTitle('Other settings'), SizedBox(height: 20,), Row( children: [ @@ -193,7 +193,7 @@ class BaseInformationPane extends StatelessWidget { Expanded( flex: 1, child: getContent( - 'task type', + 'Task type', textContent: 'One - time task', ), ), diff --git a/ui/lib/modules/dashboard/task_detail/identity_dialog.dart b/ui/lib/modules/dashboard/task_detail/identity_dialog.dart index 6e1610d..c38abc0 100644 --- a/ui/lib/modules/dashboard/task_detail/identity_dialog.dart +++ b/ui/lib/modules/dashboard/task_detail/identity_dialog.dart @@ -26,7 +26,7 @@ class IdentityDialog extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ SelectableText( - 'credential', + 'Credential', style: TextStyle( fontFamily: 'Roboto', fontWeight: FontWeight.w500, @@ -70,7 +70,7 @@ class IdentityDialog extends StatelessWidget { ), SizedBox(height: 20,), SelectableText( - 'endpoint', + 'Endpoint', style: TextStyle( fontFamily: 'Roboto', fontWeight: FontWeight.w500, diff --git a/ui/lib/modules/dashboard/task_detail/index.dart b/ui/lib/modules/dashboard/task_detail/index.dart index db2c40d..7ec1af0 100644 --- a/ui/lib/modules/dashboard/task_detail/index.dart +++ b/ui/lib/modules/dashboard/task_detail/index.dart @@ -14,7 +14,7 @@ class TaskDetail extends GetView { return Column( children: [ ReturnToList( - title: "Return Tasks List".tr, + title: "Return tasks tist".tr, onTap: () { controller.showDetail(false); controller.detailTaskId(''); diff --git a/ui/lib/modules/dashboard/task_detail/return_task_list.dart b/ui/lib/modules/dashboard/task_detail/return_task_list.dart index 2d42164..fe8e754 100644 --- a/ui/lib/modules/dashboard/task_detail/return_task_list.dart +++ b/ui/lib/modules/dashboard/task_detail/return_task_list.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import '../../../common/colors.dart'; @@ -15,28 +16,37 @@ class ReturnToList extends StatelessWidget { Widget build(BuildContext context) { return Padding( padding: EdgeInsets.only(bottom: 10), - child: GestureDetector( - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - margin: EdgeInsets.only(top: 3, right: 8), - child: Icon(IconData(0xe607, fontFamily: 'tpIcon'), size: 20,), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + child: Container( + margin: EdgeInsets.only(top: 3, right: 8), + child: Icon(IconData(0xe607, fontFamily: 'tpIcon'), size: 20,), + ), + onTap: () => onTap(), ), - SelectableText( - title, - style: TextStyle( - fontSize: 14, - fontFamily: 'Roboto', - fontWeight: FontWeight.normal, - fontStyle: FontStyle.normal, - color: regularFontColor, + ), + MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + child: Text( + title, + style: TextStyle( + fontSize: 14, + fontFamily: 'Roboto', + fontWeight: FontWeight.normal, + fontStyle: FontStyle.normal, + color: regularFontColor, + ), ), + onTap: () => onTap(), ), - ], - ), - onTap: () => onTap(), + ), + ], ), ); } diff --git a/ui/lib/modules/dashboard/task_detail/task_description.dart b/ui/lib/modules/dashboard/task_detail/task_description.dart index c6fbb08..a883148 100644 --- a/ui/lib/modules/dashboard/task_detail/task_description.dart +++ b/ui/lib/modules/dashboard/task_detail/task_description.dart @@ -47,7 +47,7 @@ class TaskDescription extends GetView { crossAxisAlignment: CrossAxisAlignment.start, children: [ SelectableText('DM Task - 1', style: Theme.of(context).textTheme.headline2), - SelectableText('task ID:DM 2021041223', style: Theme.of(context).textTheme.bodyText2), + SelectableText('Task id:DM 2021041223', style: Theme.of(context).textTheme.bodyText2), ], ), SizedBox(width: 30,), @@ -95,7 +95,7 @@ class TaskDescription extends GetView { crossAxisAlignment: CrossAxisAlignment.start, children: [ SelectableText( - 'Task Progress'.tr, + 'Task progress'.tr, style: TextStyle( fontFamily: 'Roboto', fontStyle: FontStyle.normal, @@ -104,7 +104,7 @@ class TaskDescription extends GetView { color: headlineFontColor, ), ), - SizedBox(height: 14,), + SizedBox(height: 7,), ProgressBar( ratio: 0.4, barWidth: 480, diff --git a/ui/lib/modules/dashboard/task_detail/task_information.dart b/ui/lib/modules/dashboard/task_detail/task_information.dart index e92c28b..1437dab 100644 --- a/ui/lib/modules/dashboard/task_detail/task_information.dart +++ b/ui/lib/modules/dashboard/task_detail/task_information.dart @@ -17,11 +17,11 @@ class TaskInformation extends GetView { List TabsList = [ TabPane( - tabTitle: 'Base Information'.tr, + tabTitle: 'Base information'.tr, pane: BaseInformationPane() ), TabPane( - tabTitle: 'Real - Time Log'.tr, + tabTitle: 'Real - time log'.tr, pane: TimeLogPane( logTitle: 'Unit Test (1.16, macos-latest)', description: 'Successed on 18 Mar in 53s', From 79b3b0df5c2c75b47ebf385b94510292ec06839c Mon Sep 17 00:00:00 2001 From: tthaogege <942519762@qq.com> Date: Sat, 9 Oct 2021 16:12:25 +0800 Subject: [PATCH 3/3] ui: change all identities to services --- .../dashboard/task_detail/base_information_pane.dart | 2 +- ui/lib/modules/dashboard/task_detail/identity_dialog.dart | 2 +- ui/lib/modules/identity/create_identity_dialog/form.dart | 2 +- ui/lib/modules/identity/create_identity_dialog/index.dart | 2 +- ui/lib/modules/identity/index.dart | 8 ++++---- ui/lib/modules/identity/panel.dart | 6 +++--- ui/lib/modules/identity/toolbar.dart | 4 ++-- ui/lib/modules/layout/navigators.dart | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/ui/lib/modules/dashboard/task_detail/base_information_pane.dart b/ui/lib/modules/dashboard/task_detail/base_information_pane.dart index 43f8e65..5af8541 100644 --- a/ui/lib/modules/dashboard/task_detail/base_information_pane.dart +++ b/ui/lib/modules/dashboard/task_detail/base_information_pane.dart @@ -151,7 +151,7 @@ class BaseInformationPane extends StatelessWidget { Get.dialog(IdentityDialog()); }, child: Text( - 'QingStor - identity 1', + 'QingStor - Services 1', style: TextStyle( decoration: TextDecoration.underline, ) diff --git a/ui/lib/modules/dashboard/task_detail/identity_dialog.dart b/ui/lib/modules/dashboard/task_detail/identity_dialog.dart index c38abc0..5794d2f 100644 --- a/ui/lib/modules/dashboard/task_detail/identity_dialog.dart +++ b/ui/lib/modules/dashboard/task_detail/identity_dialog.dart @@ -13,7 +13,7 @@ class IdentityDialog extends StatelessWidget { @override Widget build(BuildContext context) { return CommonDialog( - title: 'QingStor - identity 1'.tr, + title: 'QingStor - Services 1'.tr, width: 800, content: Container( width: 320, diff --git a/ui/lib/modules/identity/create_identity_dialog/form.dart b/ui/lib/modules/identity/create_identity_dialog/form.dart index 15ba3e5..92ca306 100644 --- a/ui/lib/modules/identity/create_identity_dialog/form.dart +++ b/ui/lib/modules/identity/create_identity_dialog/form.dart @@ -51,7 +51,7 @@ class CreateIdentityForm extends GetView { ), SizedBox(height: 22), SelectableText( - 'Identity Name'.tr, + 'Services Name'.tr, style: TextStyle( color: regularFontColor, fontSize: 12, diff --git a/ui/lib/modules/identity/create_identity_dialog/index.dart b/ui/lib/modules/identity/create_identity_dialog/index.dart index 6e92685..ebd93fa 100644 --- a/ui/lib/modules/identity/create_identity_dialog/index.dart +++ b/ui/lib/modules/identity/create_identity_dialog/index.dart @@ -30,7 +30,7 @@ class CreateIdentityDialog extends StatelessWidget { @override Widget build(BuildContext context) { return CommonDialog( - title: 'Create Identity'.tr, + title: 'Create Services'.tr, width: 400, content: Container( width: 400, diff --git a/ui/lib/modules/identity/index.dart b/ui/lib/modules/identity/index.dart index e704a85..2080639 100644 --- a/ui/lib/modules/identity/index.dart +++ b/ui/lib/modules/identity/index.dart @@ -23,7 +23,7 @@ class Identity extends GetView { children: [ PageDescription( icon: IconData(0xe60b, fontFamily: 'tpIcon'), - title: 'Identities'.tr, + title: 'Services'.tr, subtitle: "Support Binding One Or More Cloud Service Accounts / API Key" .tr, @@ -31,10 +31,10 @@ class Identity extends GetView { Obx(() => controller.identities.value.length() == 0 ? EmptyEntryList( icon: IconData(0xe60b, fontFamily: 'tpIcon'), - title: 'The Identity List Is Empty'.tr, + title: 'The Services List Is Empty'.tr, subTitle: - 'Please Click The Button Below To Create Identity'.tr, - buttonText: 'Create Identity'.tr, + 'Please Click The Button Below To Create Services'.tr, + buttonText: 'Create Services'.tr, onClick: () => Get.dialog(CreateIdentityDialog( getIdentities: controller.getIdentities)), ) diff --git a/ui/lib/modules/identity/panel.dart b/ui/lib/modules/identity/panel.dart index 6f0b6f3..828031d 100644 --- a/ui/lib/modules/identity/panel.dart +++ b/ui/lib/modules/identity/panel.dart @@ -50,9 +50,9 @@ class IdentityPanel extends GetView { MoreActions( onSelected: (String option) { Get.dialog(Confirm( - title: "Are You Sure To Delete This Identity?".tr, + title: "Are You Sure To Delete This Services?".tr, description: - "After Deleting, It Will Not Affect The Created Tasks, But It Will Not Appear In The Identity List And The Identity Option Of The Created Task." + "After Deleting, It Will Not Affect The Created Tasks, But It Will Not Appear In The Services List And The Services Option Of The Created Task." .tr, onConfirm: () { controller.deleteIdentity(identity).then((result) { @@ -64,7 +64,7 @@ class IdentityPanel extends GetView { PopupMenuItem( value: "delete", height: 32.0, - child: Text("Delete Identity".tr, + child: Text("Delete Services".tr, style: TextStyle( fontSize: 12.0, color: regularFontColor, diff --git a/ui/lib/modules/identity/toolbar.dart b/ui/lib/modules/identity/toolbar.dart index 3390724..391de99 100644 --- a/ui/lib/modules/identity/toolbar.dart +++ b/ui/lib/modules/identity/toolbar.dart @@ -15,7 +15,7 @@ class Toolbar extends GetView { children: [ Button( icon: Icons.add, - child: Text("Create Identity".tr), + child: Text("Create Services".tr), type: ButtonType.primary, onPressed: () => Get.dialog( CreateIdentityDialog(getIdentities: controller.getIdentities)), @@ -23,7 +23,7 @@ class Toolbar extends GetView { SizedBox(width: 20), Obx( () => SelectableText( - '${controller.identities.value.length()} Identities', + '${controller.identities.value.length()} Services', style: TextStyle( color: regularFontColor, fontSize: 12, diff --git a/ui/lib/modules/layout/navigators.dart b/ui/lib/modules/layout/navigators.dart index bb826b4..8b2b8a2 100644 --- a/ui/lib/modules/layout/navigators.dart +++ b/ui/lib/modules/layout/navigators.dart @@ -49,7 +49,7 @@ class Navigators extends StatelessWidget { SideLink(title: "Tasks".tr, icon: IconData(0xe600, fontFamily: 'tpIcon'), path: Routes.main), SideLink(title: "Agents".tr, icon: IconData(0xe608, fontFamily: 'tpIcon'), path: Routes.agents), SideLink( - title: "Identities".tr, + title: "Services".tr, icon: IconData(0xe60b, fontFamily: 'tpIcon'), path: Routes.identities, ),