Home and Alarms page

This commit is contained in:
Igor Kulikov
2021-05-14 20:29:36 +03:00
parent 8e06f29694
commit ed654e46bd
41 changed files with 1112 additions and 534 deletions

View File

@@ -0,0 +1,20 @@
import 'package:fluro/fluro.dart';
import 'package:flutter/widgets.dart';
import 'package:thingsboard_app/config/routes/router.dart';
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/modules/main/main_page.dart';
class AlarmRoutes extends TbRoutes {
late var alarmsHandler = Handler(handlerFunc: (BuildContext? context, Map<String, dynamic> params) {
return MainPage(tbContext, path: '/alarms');
});
AlarmRoutes(TbContext tbContext) : super(tbContext);
@override
void doRegisterRoutes(router) {
router.define("/alarms", handler: alarmsHandler);
}
}

View File

@@ -0,0 +1,170 @@
import 'package:auto_size_text/auto_size_text.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:thingsboard_app/core/entity/entities_base.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
const Map<AlarmSeverity, Color> alarmSeverityColors = {
AlarmSeverity.CRITICAL: Color(0xFFFF0000),
AlarmSeverity.MAJOR: Color(0xFFFFA500),
AlarmSeverity.MINOR: Color(0xFFFFCA3D),
AlarmSeverity.WARNING: Color(0xFFABAB00),
AlarmSeverity.INDETERMINATE: Color(0xFF00FF00),
};
const Map<AlarmSeverity, String> alarmSeverityTranslations = {
AlarmSeverity.CRITICAL: 'Critical',
AlarmSeverity.MAJOR: 'Major',
AlarmSeverity.MINOR: 'Minor',
AlarmSeverity.WARNING: 'Warning',
AlarmSeverity.INDETERMINATE: 'Indeterminate',
};
const Map<AlarmStatus, String> alarmStatusTranslations = {
AlarmStatus.ACTIVE_ACK: 'Active Acknowledged',
AlarmStatus.ACTIVE_UNACK: 'Active Unacknowledged',
AlarmStatus.CLEARED_ACK: 'Cleared Acknowledged',
AlarmStatus.CLEARED_UNACK: 'Cleared Unacknowledged',
};
mixin AlarmsBase on EntitiesBase<AlarmInfo, AlarmQuery> {
@override
String get title => 'Alarms';
@override
String get noItemsFoundText => 'No alarms found';
@override
AlarmQuery createFirstKey({int pageSize = 10}) => AlarmQuery(TimePageLink(pageSize, 0, null, SortOrder('createdTime', Direction.DESC)), fetchOriginator: true);
@override
AlarmQuery nextPageKey(AlarmQuery query) {
query.pageLink = query.pageLink.nextPageLink();
return query;
}
@override
Future<PageData<AlarmInfo>> fetchEntities(AlarmQuery query) {
return tbClient.getAlarmService().getAllAlarms(query);
}
@override
void onEntityTap(AlarmInfo alarm) {
showErrorNotification('Balalai: alarm tap not implemented!');
}
@override
Widget buildEntityListCard(BuildContext context, AlarmInfo alarm) {
return _buildEntityListCard(context, alarm);
}
Widget _buildEntityListCard(BuildContext context, AlarmInfo alarm) {
return Row(
mainAxisSize: MainAxisSize.max,
children: [
Flexible(
fit: FlexFit.tight,
child:
Padding(
padding: EdgeInsets.symmetric(vertical: 12, horizontal: 16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Flexible(
fit: FlexFit.tight,
child: AutoSizeText(alarm.type,
maxLines: 2,
minFontSize: 8,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Color(0xFF282828),
fontWeight: FontWeight.w500,
fontSize: 14,
height: 20 / 14)
)
),
Text(alarmSeverityTranslations[alarm.severity]!,
style: TextStyle(
color: alarmSeverityColors[alarm.severity]!,
fontWeight: FontWeight.w500,
fontSize: 12,
height: 16 / 12)
)
]
),
SizedBox(height: 4),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Flexible(
fit: FlexFit.tight,
child: Text(alarm.originatorName != null ? alarm.originatorName! : '',
style: TextStyle(
color: Color(0xFFAFAFAF),
fontWeight: FontWeight.normal,
fontSize: 12,
height: 16 / 12)
)
),
Text(entityDateFormat.format(DateTime.fromMillisecondsSinceEpoch(alarm.createdTime!)),
style: TextStyle(
color: Color(0xFFAFAFAF),
fontWeight: FontWeight.normal,
fontSize: 12,
height: 16 / 12)
)
]
),
SizedBox(height: 22),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Flexible(
fit: FlexFit.tight,
child: Text(alarmStatusTranslations[alarm.status]!,
style: TextStyle(
color: Color(0xFF282828),
fontWeight: FontWeight.normal,
fontSize: 14,
height: 20 / 14)
)
),
Row(
children: [
if ([AlarmStatus.CLEARED_UNACK, AlarmStatus.ACTIVE_UNACK].contains(alarm.status))
CircleAvatar(
radius: 24,
backgroundColor: Color(0xffF0F4F9),
child: IconButton(icon: Icon(Icons.done), padding: EdgeInsets.all(6.0), onPressed: () => {})
),
if ([AlarmStatus.ACTIVE_UNACK, AlarmStatus.ACTIVE_ACK].contains(alarm.status))
Row(
children: [
SizedBox(width: 4),
CircleAvatar(
radius: 24,
backgroundColor: Color(0xffF0F4F9),
child: IconButton(icon: Icon(Icons.clear), padding: EdgeInsets.all(6.0), onPressed: () => {})
)
]
)
],
)
],
)
]
)
)
)
]
);
}
}

View File

@@ -0,0 +1,13 @@
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/entity/entities_base.dart';
import 'package:thingsboard_app/core/entity/entities_list.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
import 'alarms_base.dart';
class AlarmsList extends BaseEntitiesWidget<AlarmInfo, AlarmQuery> with AlarmsBase, EntitiesListStateBase {
AlarmsList(TbContext tbContext) : super(tbContext);
}

View File

@@ -0,0 +1,31 @@
import 'package:flutter/material.dart';
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/context/tb_context_widget.dart';
import 'package:thingsboard_app/widgets/tb_app_bar.dart';
import 'alarms_list.dart';
class AlarmsPage extends TbContextWidget<AlarmsPage, _AlarmsPageState> {
AlarmsPage(TbContext tbContext) : super(tbContext);
@override
_AlarmsPageState createState() => _AlarmsPageState();
}
class _AlarmsPageState extends TbContextState<AlarmsPage, _AlarmsPageState> {
@override
Widget build(BuildContext context) {
var alarmsList = AlarmsList(tbContext);
return Scaffold(
appBar: TbAppBar(
tbContext,
title: Text(alarmsList.title)
),
body: alarmsList
);
}
}

View File

@@ -3,7 +3,7 @@ import 'package:flutter/widgets.dart';
import 'package:thingsboard_app/core/entity/entities_base.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
mixin AssetsBase on EntitiesBase<AssetInfo> {
mixin AssetsBase on EntitiesBaseWithPageLink<AssetInfo> {
@override
String get title => 'Assets';
@@ -21,20 +21,40 @@ mixin AssetsBase on EntitiesBase<AssetInfo> {
}
@override
Widget buildEntityCard(BuildContext context, AssetInfo asset, bool briefView) {
void onEntityTap(AssetInfo asset) {
navigateTo('/asset/${asset.id!.id}');
}
@override
Widget buildEntityListCard(BuildContext context, AssetInfo asset) {
return _buildEntityListCard(context, asset, false);
}
@override
Widget buildEntityListWidgetCard(BuildContext context, AssetInfo asset) {
return _buildEntityListCard(context, asset, true);
}
@override
Widget buildEntityGridCard(BuildContext context, AssetInfo asset) {
return Text(asset.name);
}
Widget _buildEntityListCard(BuildContext context, AssetInfo asset, bool listWidgetCard) {
return Row(
mainAxisSize: briefView ? MainAxisSize.min : MainAxisSize.max,
mainAxisSize: listWidgetCard ? MainAxisSize.min : MainAxisSize.max,
children: [
Flexible(
fit: briefView ? FlexFit.loose : FlexFit.tight,
fit: listWidgetCard ? FlexFit.loose : FlexFit.tight,
child:
Container(
padding: EdgeInsets.symmetric(vertical: briefView ? 9 : 10, horizontal: 16),
padding: EdgeInsets.symmetric(vertical: listWidgetCard ? 9 : 10, horizontal: 16),
child: Row(
mainAxisSize: briefView ? MainAxisSize.min : MainAxisSize.max,
mainAxisSize: listWidgetCard ? MainAxisSize.min : MainAxisSize.max,
children: [
Flexible(
fit: briefView ? FlexFit.loose : FlexFit.tight,
fit: listWidgetCard ? FlexFit.loose : FlexFit.tight,
child:
Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -60,7 +80,7 @@ mixin AssetsBase on EntitiesBase<AssetInfo> {
],
)
),
(!briefView ? Column(
(!listWidgetCard ? Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text(entityDateFormat.format(DateTime.fromMillisecondsSinceEpoch(asset.createdTime!)),
@@ -80,10 +100,4 @@ mixin AssetsBase on EntitiesBase<AssetInfo> {
]
);
}
@override
void onEntityDetails(AssetInfo asset) {
navigateTo('/asset/${asset.id!.id}');
}
}

View File

@@ -0,0 +1,13 @@
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/entity/entities_base.dart';
import 'package:thingsboard_app/core/entity/entities_list.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
import 'assets_base.dart';
class AssetsList extends BaseEntitiesPageLinkWidget<AssetInfo> with AssetsBase, EntitiesListStateBase {
AssetsList(TbContext tbContext) : super(tbContext);
}

View File

@@ -0,0 +1,15 @@
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/entity/entities_list_widget.dart';
import 'package:thingsboard_app/modules/asset/assets_base.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
class AssetsListWidget extends EntitiesListPageLinkWidget<AssetInfo> with AssetsBase {
AssetsListWidget(TbContext tbContext, {EntitiesListWidgetController? controller}): super(tbContext, controller: controller);
@override
void onViewAll() {
navigateTo('/assets');
}
}

View File

@@ -1,16 +1,31 @@
import 'package:flutter/material.dart';
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/entity/entities_page.dart';
import 'package:thingsboard_app/modules/asset/assets_base.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
import 'package:thingsboard_app/core/context/tb_context_widget.dart';
import 'package:thingsboard_app/widgets/tb_app_bar.dart';
class AssetsPage extends EntitiesPage<AssetInfo> with AssetsBase {
import 'assets_list.dart';
class AssetsPage extends TbPageWidget<AssetsPage, _AssetsPageState> {
AssetsPage(TbContext tbContext) : super(tbContext);
@override
String get noMoreItemsText => 'No more assets';
@override
String get searchHint => 'Search assets';
_AssetsPageState createState() => _AssetsPageState();
}
class _AssetsPageState extends TbPageState<AssetsPage, _AssetsPageState> {
@override
Widget build(BuildContext context) {
var assetsList = AssetsList(tbContext);
return Scaffold(
appBar: TbAppBar(
tbContext,
title: Text(assetsList.title)
),
body: assetsList
);
}
}

View File

@@ -1,16 +0,0 @@
import 'package:flutter/widgets.dart';
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/entity/entities_widget.dart';
import 'package:thingsboard_app/modules/asset/assets_base.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
class AssetsWidget extends EntitiesWidget<AssetInfo> with AssetsBase {
AssetsWidget(TbContext tbContext, {EntitiesWidgetController? controller}): super(tbContext, controller: controller);
@override
void onViewAll() {
navigateTo('/assets');
}
}

View File

@@ -209,7 +209,7 @@ class _DashboardState extends TbContextState<Dashboard, _DashboardState> {
return Container(
decoration: BoxDecoration(color: Colors.white),
child: Center(
child: CircularProgressIndicator()
child: RefreshProgressIndicator()
),
);
}

View File

@@ -2,14 +2,14 @@ import 'package:fluro/fluro.dart';
import 'package:flutter/widgets.dart';
import 'package:thingsboard_app/config/routes/router.dart';
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/modules/main/main_page.dart';
import 'package:thingsboard_app/modules/dashboard/dashboards_page.dart';
import 'dashboard_page.dart';
class DashboardRoutes extends TbRoutes {
late var dashboardsHandler = Handler(handlerFunc: (BuildContext? context, Map<String, dynamic> params) {
return MainPage(tbContext, path: '/dashboards');
return DashboardsPage(tbContext);
});
late var dashboardDetailsHandler = Handler(handlerFunc: (BuildContext? context, Map<String, List<String>> params) {

View File

@@ -1,9 +1,11 @@
import 'package:auto_size_text/auto_size_text.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:thingsboard_app/constants/assets_path.dart';
import 'package:thingsboard_app/core/entity/entities_base.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
mixin DashboardsBase on EntitiesBase<DashboardInfo> {
mixin DashboardsBase on EntitiesBaseWithPageLink<DashboardInfo> {
@override
String get title => 'Dashboards';
@@ -21,20 +23,95 @@ mixin DashboardsBase on EntitiesBase<DashboardInfo> {
}
@override
Widget buildEntityCard(BuildContext context, DashboardInfo dashboard, bool briefView) {
void onEntityTap(DashboardInfo dashboard) {
navigateTo('/dashboard/${dashboard.id!.id}?title=${dashboard.title}');
}
@override
Widget buildEntityListCard(BuildContext context, DashboardInfo dashboard) {
return _buildEntityListCard(context, dashboard, false);
}
@override
Widget buildEntityListWidgetCard(BuildContext context, DashboardInfo dashboard) {
return _buildEntityListCard(context, dashboard, true);
}
@override
EntityCardSettings entityGridCardSettings(DashboardInfo dashboard) => EntityCardSettings(dropShadow: true); //dashboard.image != null);
@override
Widget buildEntityGridCard(BuildContext context, DashboardInfo entity) {
var hasImage = entity.image != null;
Widget image;
if (hasImage) {
var uriData = UriData.parse(entity.image!);
image = Image.memory(uriData.contentAsBytes());
} else {
image = Image.asset(ThingsboardImage.dashboardPlaceholder);
}
return
ClipRRect(
borderRadius: BorderRadius.circular(6),
child: Stack(
children: [
Positioned.fill(
child: FittedBox(
fit: BoxFit.cover,
child: image,
)
),
hasImage ? Positioned.fill(
child: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
Color(0x00000000),
Color(0xb7000000)
],
stops: [0.4219, 1]
)
)
),
) : Container(),
Positioned(
bottom: 16,
left: 16,
right: 16,
child: AutoSizeText(entity.title,
textAlign: TextAlign.center,
maxLines: 2,
minFontSize: 8,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: hasImage ? Colors.white : Color(0xFF282828),
fontWeight: FontWeight.w500,
fontSize: 14,
height: 20 / 14
),
)
)
],
)
);
}
Widget _buildEntityListCard(BuildContext context, DashboardInfo dashboard, bool listWidgetCard) {
return Row(
mainAxisSize: briefView ? MainAxisSize.min : MainAxisSize.max,
mainAxisSize: listWidgetCard ? MainAxisSize.min : MainAxisSize.max,
children: [
Flexible(
fit: briefView ? FlexFit.loose : FlexFit.tight,
fit: listWidgetCard ? FlexFit.loose : FlexFit.tight,
child:
Container(
padding: EdgeInsets.symmetric(vertical: briefView ? 9 : 10, horizontal: 16),
padding: EdgeInsets.symmetric(vertical: listWidgetCard ? 9 : 10, horizontal: 16),
child: Row(
mainAxisSize: briefView ? MainAxisSize.min : MainAxisSize.max,
mainAxisSize: listWidgetCard ? MainAxisSize.min : MainAxisSize.max,
children: [
Flexible(
fit: briefView ? FlexFit.loose : FlexFit.tight,
fit: listWidgetCard ? FlexFit.loose : FlexFit.tight,
child:
Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -60,7 +137,7 @@ mixin DashboardsBase on EntitiesBase<DashboardInfo> {
],
)
),
(!briefView ? Column(
(!listWidgetCard ? Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text(entityDateFormat.format(DateTime.fromMillisecondsSinceEpoch(dashboard.createdTime!)),
@@ -95,10 +172,4 @@ mixin DashboardsBase on EntitiesBase<DashboardInfo> {
return dashboard.assignedCustomers.any((element) => element.isPublic);
}
@override
void onEntityDetails(DashboardInfo dashboard) {
navigateTo('/dashboard/${dashboard.id!.id}?title=${dashboard.title}');
}
}

View File

@@ -0,0 +1,13 @@
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/entity/entities_base.dart';
import 'package:thingsboard_app/core/entity/entities_grid.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
import 'dashboards_base.dart';
class DashboardsGrid extends BaseEntitiesPageLinkWidget<DashboardInfo> with DashboardsBase, EntitiesGridStateBase {
DashboardsGrid(TbContext tbContext) : super(tbContext);
}

View File

@@ -0,0 +1,13 @@
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/entity/entities_list.dart';
import 'package:thingsboard_app/core/entity/entities_base.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
import 'dashboards_base.dart';
class DashboardsList extends BaseEntitiesPageLinkWidget<DashboardInfo> with DashboardsBase, EntitiesListStateBase {
DashboardsList(TbContext tbContext) : super(tbContext);
}

View File

@@ -0,0 +1,15 @@
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/entity/entities_list_widget.dart';
import 'package:thingsboard_app/modules/dashboard/dashboards_base.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
class DashboardsListWidget extends EntitiesListPageLinkWidget<DashboardInfo> with DashboardsBase {
DashboardsListWidget(TbContext tbContext, {EntitiesListWidgetController? controller}): super(tbContext, controller: controller);
@override
void onViewAll() {
navigateTo('/dashboards');
}
}

View File

@@ -1,18 +1,31 @@
import 'package:flutter/material.dart';
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/entity/entities_page.dart';
import 'package:thingsboard_app/modules/dashboard/dashboards_base.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
import 'package:thingsboard_app/core/context/tb_context_widget.dart';
import 'package:thingsboard_app/widgets/tb_app_bar.dart';
class DashboardsPage extends EntitiesPage<DashboardInfo> with DashboardsBase {
import 'dashboards_list.dart';
DashboardsPage(TbContext tbContext) :
super(tbContext);
class DashboardsPage extends TbPageWidget<DashboardsPage, _DashboardsPageState> {
DashboardsPage(TbContext tbContext) : super(tbContext);
@override
String get noMoreItemsText => 'No more dashboards';
@override
String get searchHint => 'Search dashboards';
_DashboardsPageState createState() => _DashboardsPageState();
}
class _DashboardsPageState extends TbPageState<DashboardsPage, _DashboardsPageState> {
@override
Widget build(BuildContext context) {
var dashboardsList = DashboardsList(tbContext);
return Scaffold(
appBar: TbAppBar(
tbContext,
title: Text(dashboardsList.title)
),
body: dashboardsList
);
}
}

View File

@@ -1,15 +0,0 @@
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/entity/entities_widget.dart';
import 'package:thingsboard_app/modules/dashboard/dashboards_base.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
class DashboardsWidget extends EntitiesWidget<DashboardInfo> with DashboardsBase {
DashboardsWidget(TbContext tbContext, {EntitiesWidgetController? controller}): super(tbContext, controller: controller);
@override
void onViewAll() {
navigateTo('/dashboards');
}
}

View File

@@ -5,7 +5,6 @@ import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/modules/main/main_page.dart';
import 'device_details_page.dart';
import 'devices_page.dart';
class DeviceRoutes extends TbRoutes {

View File

@@ -3,7 +3,7 @@ import 'package:flutter/widgets.dart';
import 'package:thingsboard_app/core/entity/entities_base.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
mixin DevicesBase on EntitiesBase<DeviceInfo> {
mixin DevicesBase on EntitiesBaseWithPageLink<DeviceInfo> {
@override
String get title => 'Devices';
@@ -21,35 +21,56 @@ mixin DevicesBase on EntitiesBase<DeviceInfo> {
}
@override
void onEntityDetails(DeviceInfo device) {
void onEntityTap(DeviceInfo device) {
navigateTo('/device/${device.id!.id}');
}
@override
Widget buildEntityCard(BuildContext context, DeviceInfo device, bool briefView) {
Widget? buildHeading(BuildContext context) {
return Text('Hobo Devices!');
}
@override
Widget buildEntityListCard(BuildContext context, DeviceInfo device) {
return _buildEntityListCard(context, device, false);
}
@override
Widget buildEntityListWidgetCard(BuildContext context, DeviceInfo device) {
return _buildEntityListCard(context, device, true);
}
@override
Widget buildEntityGridCard(BuildContext context, DeviceInfo device) {
return Text(device.name);
}
Widget _buildEntityListCard(BuildContext context, DeviceInfo device, bool listWidgetCard) {
return Row(
mainAxisSize: briefView ? MainAxisSize.min : MainAxisSize.max,
mainAxisSize: listWidgetCard ? MainAxisSize.min : MainAxisSize.max,
children: [
Container(
width: briefView ? 58 : 60,
width: listWidgetCard ? 58 : 60,
height: listWidgetCard ? 58 : 60,
decoration: BoxDecoration(
color: Color(0xFFEEEEEE),
borderRadius: BorderRadius.horizontal(left: Radius.circular(briefView ? 4 : 6))
borderRadius: BorderRadius.horizontal(left: Radius.circular(listWidgetCard ? 4 : 6))
),
child: Center(
child: Icon(Icons.devices_other, color: Color(0xFFC2C2C2))
),
),
Flexible(
fit: briefView ? FlexFit.loose : FlexFit.tight,
fit: listWidgetCard ? FlexFit.loose : FlexFit.tight,
child:
Container(
padding: EdgeInsets.symmetric(vertical: briefView ? 9 : 10, horizontal: 16),
padding: EdgeInsets.symmetric(vertical: listWidgetCard ? 9 : 10, horizontal: 16),
child: Row(
mainAxisSize: briefView ? MainAxisSize.min : MainAxisSize.max,
mainAxisSize: listWidgetCard ? MainAxisSize.min : MainAxisSize.max,
children: [
Flexible(
fit: briefView ? FlexFit.loose : FlexFit.tight,
fit: listWidgetCard ? FlexFit.loose : FlexFit.tight,
child:
Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -75,7 +96,7 @@ mixin DevicesBase on EntitiesBase<DeviceInfo> {
],
)
),
(!briefView ? Column(
(!listWidgetCard ? Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text(entityDateFormat.format(DateTime.fromMillisecondsSinceEpoch(device.createdTime!)),

View File

@@ -0,0 +1,12 @@
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/entity/entities_base.dart';
import 'package:thingsboard_app/core/entity/entities_list.dart';
import 'package:thingsboard_app/modules/device/devices_base.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
class DevicesList extends BaseEntitiesPageLinkWidget<DeviceInfo> with DevicesBase, EntitiesListStateBase {
DevicesList(TbContext tbContext) : super(tbContext);
}

View File

@@ -0,0 +1,15 @@
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/entity/entities_list_widget.dart';
import 'package:thingsboard_app/modules/device/devices_base.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
class DevicesListWidget extends EntitiesListPageLinkWidget<DeviceInfo> with DevicesBase {
DevicesListWidget(TbContext tbContext, {EntitiesListWidgetController? controller}): super(tbContext, controller: controller);
@override
void onViewAll() {
navigateTo('/devices');
}
}

View File

@@ -1,99 +1,30 @@
import 'package:flutter/material.dart';
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/entity/entities_page.dart';
import 'package:thingsboard_app/modules/device/devices_base.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
import 'package:thingsboard_app/core/context/tb_context_widget.dart';
import 'package:thingsboard_app/modules/device/devices_list.dart';
import 'package:thingsboard_app/widgets/tb_app_bar.dart';
class DevicesPage extends EntitiesPage<DeviceInfo> with DevicesBase {
class DevicesPage extends TbContextWidget<DevicesPage, _DevicesPageState> {
DevicesPage(TbContext tbContext) : super(tbContext);
@override
String get noMoreItemsText => 'No more devices';
@override
String get searchHint => 'Search devices';
_DevicesPageState createState() => _DevicesPageState();
}
/* bottomNavigationBar: BottomAppBar(
shape: CircularNotchedRectangle(),
notchMargin: 4.0,
child: new Row(
children: <Widget>[
IconButton(icon: Icon(Icons.refresh), onPressed: () {
refresh();
},),
Spacer(),
IconButton(icon: Icon(Icons.search), onPressed: () {
_searchModeNotifier.value = true;
}),
_simplePopup(),
],
class _DevicesPageState extends TbContextState<DevicesPage, _DevicesPageState> {
@override
Widget build(BuildContext context) {
var devicesList = DevicesList(tbContext);
return Scaffold(
appBar: TbAppBar(
tbContext,
title: Text(devicesList.title)
),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.add), onPressed: () {},),
body: devicesList
);
}
Widget _simplePopup() => PopupMenuButton<int>(
itemBuilder: (context) => [
PopupMenuItem(
value: 1,
child: Text("First"),
),
PopupMenuItem(
value: 2,
child: ListTile(
leading: Icon(Icons.work),
title: Text('Second'),
)
),
],
icon: Icon(Icons.settings),
);
SpeedDial speedDial(context) => SpeedDial(
animatedIcon: AnimatedIcons.menu_close,
animatedIconTheme: IconThemeData(size: 22),
backgroundColor: Theme.of(context).colorScheme.secondary,
foregroundColor: Colors.white,
visible: true,
curve: Curves.bounceIn,
children: [
// FAB 1
SpeedDialChild(
child: Icon(Icons.refresh),
backgroundColor: Theme.of(context).colorScheme.secondary,
foregroundColor: Colors.white,
onTap: () {
refresh();
/* setState(() {
var rng = Random();
var pageSize = 1 + rng.nextInt(9);
futureDevices = tbContext.tbClient.getDeviceService().getTenantDeviceInfos(PageLink(pageSize));
}); */
},
label: 'Refresh',
labelStyle: TextStyle(
fontWeight: FontWeight.w500,
fontSize: 16.0),
),
// FAB 2
SpeedDialChild(
child: Icon(Icons.logout),
backgroundColor: Theme.of(context).colorScheme.secondary,
foregroundColor: Colors.white,
onTap: () {
tbClient.logout(requestConfig: RequestConfig(ignoreErrors: true));
},
label: 'Logout',
labelStyle: TextStyle(
fontWeight: FontWeight.w500,
fontSize: 16.0),
)
],
);
}
*/

View File

@@ -1,15 +0,0 @@
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/entity/entities_widget.dart';
import 'package:thingsboard_app/modules/device/devices_base.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
class DevicesWidget extends EntitiesWidget<DeviceInfo> with DevicesBase {
DevicesWidget(TbContext tbContext, {EntitiesWidgetController? controller}): super(tbContext, controller: controller);
@override
void onViewAll() {
navigateTo('/devices');
}
}

View File

@@ -1,15 +1,12 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:thingsboard_app/core/entity/entities_widget.dart';
import 'package:thingsboard_app/modules/asset/assets_widget.dart';
import 'package:thingsboard_app/modules/dashboard/dashboards_widget.dart';
import 'package:thingsboard_app/modules/device/devices_widget.dart';
import 'package:thingsboard_app/widgets/tb_app_bar.dart';
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/context/tb_context_widget.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
import 'package:thingsboard_app/core/entity/entities_list_widget.dart';
import 'package:thingsboard_app/modules/dashboard/dashboard.dart' as dashboardUi;
import 'package:thingsboard_app/modules/dashboard/dashboards_grid.dart';
import 'package:thingsboard_app/widgets/tb_app_bar.dart';
import 'package:thingsboard_client/thingsboard_client.dart';
class HomePage extends TbContextWidget<HomePage, _HomePageState> {
@@ -22,7 +19,7 @@ class HomePage extends TbContextWidget<HomePage, _HomePageState> {
class _HomePageState extends TbContextState<HomePage, _HomePageState> {
final EntitiesWidgetController _entitiesWidgetController = EntitiesWidgetController();
final EntitiesListWidgetController _entitiesWidgetController = EntitiesListWidgetController();
@override
void initState() {
@@ -42,7 +39,6 @@ class _HomePageState extends TbContextState<HomePage, _HomePageState> {
return Scaffold(
appBar: TbAppBar(
tbContext,
showLoadingIndicator: !dashboardState,
elevation: dashboardState ? 0 : null,
title: const Text('Home'),
),
@@ -64,15 +60,14 @@ class _HomePageState extends TbContextState<HomePage, _HomePageState> {
}
Widget _buildDefaultHome(BuildContext context) {
return RefreshIndicator(
onRefresh: () => _entitiesWidgetController.refresh(),
child: ListView(
children: _buildUserHome(context)
)
);
if (tbClient.isSystemAdmin()) {
return _buildSysAdminHome(context);
} else {
return DashboardsGrid(tbContext);
}
}
List<Widget> _buildUserHome(BuildContext context) {
/* List<Widget> _buildUserHome(BuildContext context) {
if (tbClient.isSystemAdmin()) {
return _buildSysAdminHome(context);
} else if (tbClient.isTenantAdmin()) {
@@ -80,25 +75,30 @@ class _HomePageState extends TbContextState<HomePage, _HomePageState> {
} else {
return _buildCustomerUserHome(context);
}
} */
Widget _buildSysAdminHome(BuildContext context) {
return RefreshIndicator(
onRefresh: () => _entitiesWidgetController.refresh(),
child: ListView(
children: [Container(child: Text('TODO: Implement'))]
)
);
}
List<Widget> _buildSysAdminHome(BuildContext context) {
return [Container(child: Text('TODO: Implement'))];
}
List<Widget> _buildTenantAdminHome(BuildContext context) {
/* List<Widget> _buildTenantAdminHome(BuildContext context) {
return [
AssetsWidget(tbContext, controller: _entitiesWidgetController),
DevicesWidget(tbContext, controller: _entitiesWidgetController),
DashboardsWidget(tbContext, controller: _entitiesWidgetController)
AssetsListWidget(tbContext, controller: _entitiesWidgetController),
DevicesListWidget(tbContext, controller: _entitiesWidgetController),
DashboardsListWidget(tbContext, controller: _entitiesWidgetController)
];
}
List<Widget> _buildCustomerUserHome(BuildContext context) {
return [
AssetsWidget(tbContext, controller: _entitiesWidgetController),
DevicesWidget(tbContext, controller: _entitiesWidgetController),
DashboardsWidget(tbContext, controller: _entitiesWidgetController)
AssetsListWidget(tbContext, controller: _entitiesWidgetController),
DevicesListWidget(tbContext, controller: _entitiesWidgetController),
DashboardsListWidget(tbContext, controller: _entitiesWidgetController)
];
}
} */
}

View File

@@ -3,6 +3,7 @@ import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/context/tb_context_widget.dart';
import 'package:thingsboard_app/modules/alarm/alarms_page.dart';
import 'package:thingsboard_app/modules/dashboard/dashboards_page.dart';
import 'package:thingsboard_app/modules/device/devices_page.dart';
import 'package:thingsboard_app/modules/home/home_page.dart';
@@ -58,18 +59,18 @@ class TbMainNavigationItem {
case Authority.TENANT_ADMIN:
case Authority.CUSTOMER_USER:
items.addAll([
TbMainNavigationItem(
page: AlarmsPage(tbContext),
title: 'Alarms',
icon: Icon(Icons.notifications),
path: '/alarms'
),
TbMainNavigationItem(
page: DevicesPage(tbContext),
title: 'Devices',
icon: Icon(Icons.devices_other),
path: '/devices'
),
TbMainNavigationItem(
page: DashboardsPage(tbContext),
title: 'Dashboards',
icon: Icon(Icons.dashboard),
path: '/dashboards'
)
)
]);
break;
case Authority.REFRESH_TOKEN: